Nginx是一款轻量级Web服务器、反向代理服务器,由于占用内存少,启动极快,高并发能力强,在互联网项目中得到广泛应用。

上图为当下流行的技术架构,其中Nginx有点入口网关的味道。
目前Nginx主要用来实现反向代理和负载均衡,本文将对两种应用进行介绍。
1.安装
下载必要组件
1.nginx下载地址
http://nginx.org/en/download.html
2.pcre库下载地址,nginx需要
http://sourceforge.net/projects/pcre/files/pcre/
3.zlib下载地址,nginx需要
http://www.zlib.net/
4.openssl下载地址,nginx需要
https://github.com/openssl/openssl
在同级目录下,解压安装zlib、openssl、pcre
进入nginx目录,进行配置安装
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre=../pcre-8.39 \
--with-zlib=../zlib-1.2.8 \
--with-openssl=../openssl-master
下面可直接复制粘贴
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre=../pcre-8.39 --with-zlib=../zlib-1.2.8 --with-openssl=../openssl-master
编译安装
$ make && sudo make install
Nginx会被安装在/usr/local/nginx目录下(也可以使用参数–prefix=指定自己需要的位置), 安装成功后 /usr/local/nginx 目录下有四个子目录分别是:conf、html、logs、sbin 。 其中 Nginx 的配置文件存放于 conf/nginx.conf, bin文件是位于 sbin 目录下的 nginx 文件。 确保系统的 80 端口没被其他程序占用,运行 sbin/nginx 命令来启动 Nginx
启动nginx
$sudo /usr/local/nginx/sbin/nginx
打开浏览器访问此机器的 IP,如果浏览器出现 Welcome to nginx! 则表示 Nginx 已经安装并运行成功
一些有关指令
# 检查配置文件是否正确
# /usr/local/sbin/nginx -t
# 可以看到编译选项
# /usr/local/sbin/nginx -V
#重启Nginx
#sudo /usr/local/sbin/nginx -s reload
#关闭Nginx
#sudo /usr/local/sbin/nginx -s stop
#优雅停止服务
#sudo /usr/local/sbin/nginx -s quit
#kill -s SIGQUIT pid_master
#kill -s SIGWINCH pid_master
2.配置
nginx配置文件主要分为六个区域:
- main(全局设置)
- events(nginx工作模式)
- http(http设置)
- sever(主机设置)
- location(URL匹配)
- upstream(负载均衡服务器设置)
1.下面是一个main区域,他是一个全局的设置:
user nobody nobody; # Nginx Worker进程运行用户以及用户组
worker_processes 2; # Nginx要开启的子进程数
error_log /usr/local/var/log/nginx/error.log notice; # 定义全局错误日志文件
pid /usr/local/var/run/nginx/nginx.pid; # 指定进程id的存储文件位置
worker_rlimit_nofile 1024; # 指定一个nginx进程可以打开的最多文件描述符数目
2.events 模块
# 指定nginx的工作模式和工作模式及连接数上限
events {
use epoll; # Linux平台
worker_connections 1024; # 定义Nginx每个进程的最大连接数,即接收前端的最大请求数,默认是1024
}
3.http模块(最核心模块)
http模块:负责HTTP服务器相关属性的配置,它里面的server和upstream子模块,至关重要,等到反向代理和负载均衡以及虚拟目录等会仔细说。
http{
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /usr/local/var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 10;
#gzip on;
upstream myproject {
.....
}
server {
....
}
}
配置选项含义:
- include 设定文件的mime类型,类型在配置文件mime.type定义,来告诉nginx来识别文件类型
- default_type 设定了默认的类型为二进制流
- log_format 设置日志的格式,和记录哪些参数,这里设置为main
- access_log 记录每次的访问日志的文件地址,后面的main是日志的格式样式,对应于log_format的main
- sendfile 高效文件传输模式。将tcp_nopush和tcp_nodelay设置为on用于防止网络阻塞
- keepalive_timeout 客户端连接保持活动的超时时间。超时后,服务器会关闭该连接
4.server 模块
sever 模块是http的子模块,用来定一个虚拟主机
一个简单的server:
server {
listen 8080;
server_name localhost 192.168.12.10 www.yangyi.com;
# 全局定义,如果都是这一个目录,这样定义最简单。
root /Users/yangyi/www;
index index.php index.html index.htm;
charset utf-8;
access_log usr/local/var/log/host.access.log main;
aerror_log usr/local/var/log/host.error.log error;
....
}
- server 标志定义虚拟主机开始
- listen 指定虚拟主机的服务端口
- server_name 指定IP地址或者域名,多个域名之间用空格分开
- root 表示在这整个server虚拟主机内,全部的root web根目录。(注意:要和locate {}下面定义的区分开来)
- index 全局定义访问的默认首页地址。(注意:要和locate {}下面定义的区分开来)
- charset 设置网页的默认编码格式
- access_log 指定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式
5.location模块(nginx中用的最多,也最重要;负载均衡、反向代理、虚拟域名与其相关)
据字面可知,用于定位:定位URL,解析URL(正则匹配,支持条件判断匹配)
通过locaiton实现Nginx的动静态网页过滤处理
# location /表示匹配访问根目录
location / {
root /Users/yangyi/www; # root 指定访问根目录时,虚拟主机的web目录
# 目录可以是相对路径(相对路径是相对于nginx的安装目录)也可以是绝对路径
index index.php index.html index.htm; # 设定默认首页
}
6.upstram 模块(负载均衡模块)
通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡
upstream test.com{
ip_hash; # ip_hash是一种负载均衡算法
server 192.168.123.1:80;
server 192.168.123.2:80 down;
server 192.168.123.3:8080 max_fails=3 fail_timeout=20s;
server 192.168.123.4:8080;
}
上面的例子中,通过upstream指令指定了一个负载均衡器的名称test.com。这个名称可以任意指定,在后面需要的地方直接调用即可。
Nginx负载均衡模块目前支持4种调度算法:
- weight 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。weight。指定轮询权值,weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。 - ip_hash
每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。 - fair
比上面两个更加智能的算法;可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。 - url_hash
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。
在HTTP Upstream模块中,通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:
- down: 当前的server暂时不参与负载均衡
- backup: 预留的备份机器(当有非backup机器出现故障或者忙的时候,才会请求backup机器,压力最小)
- max_fails: 允许请求失败的次数,默认为1;超过最大次数时,返回proxy_next_upstream 模块定义的错误
- fail_timeout: 经历了max_fails次失败后,暂停服务的时间(可和max_fails一起使用)
(注意:当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup)
Nginx的Master-worker模式

启动nginx后,其实就是在80端口启动Socket服务进行监听,如上图所示,Nginx涉及Master和Worker进程。
Master进程的作用:
读取并验证配置文件nginx.conf;管理worker进程;
Worker进程的作用:
每一个Worker进程都维护一个线程(避免线程切换),处理连接和请求;注意Worker进程的个数由配置文件决定,一般和CPU个数相关(有利于进程切换),配置几个就有几个Worker进程。
3. 应用
3.1 反向代理(proxy_pass)

了解反向代理之前,先了解一下正向代理。
正向代理是从客户端的角度出发,服务于局域网用户,以访问非特定的服务,其中最典型的例子就是翻墙;
正向代理:
1.常说的代理;
2.正向代理的过程,它隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求
反向代理:
反向代理正好与此相反,从服务端的角度出发,服务于所有用户,隐藏实际的服务节点,服务节点的架构对用户透明,以代理节点统一对外服务。
(注意:透明为计算机术语,指客观存在并且运行着但是我们看不到的特性。简单来说,透明就是黑盒,只需要应用它给出的接口,而不需要了解内在机理。)
以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器

反向代理基本配置
有关详细设置不进行详细赘述(仅简介)
- proxy_pass
将当前请求代理到URL参数指定的服务器上,URL可以是主机名或者IP地址加PORT的形式
proxy_pass URL;
配置块 location if
proxy_pass http://localhost:8000;
也可以结合负载均衡实用<负载均衡会说明这种情况>
也可以把HTTP转换成HTTPS
proxy_pass http://192.168.0.1;
- proxy_method
此配置项表示转发时的协议方法名:
proxy_method method_name;
配置块 http server location
proxy_method POST;
那么客户端发来的GET请求在转发时方法改为POST;
- proxy_hide_header
Nginx会将上游服务器的响应转发给客户端,但默认不转发HTTP头部字段(Date Server X-Pad X-Accel-* )
proxy_hide_header header1;
配置块 http server location;
使用proxy_hide_header可以指定任意头部不能被转发
proxy_hide_header Cache-Control;
- proxy_pass_header
功能与 proxy_hide_header相反,是设置哪些头部允许转发.
proxy_pass_header header1;
配置块 http server location
proxy_pass_header X-Accel-Redirect;
- proxy_pass_request_body
确定上游服务器是否向上游服务器转发HTTP包体
proxy_pass_request_body off|on;
默认 on
配置块 http server location;
- proxy_pass_request_header
确定是否转发HTTP头部
proxy_pass_request_header on | off;
默认on
配置块 http server location
- proxy_redirect
当上游服务响应时重定向或刷新(HTTP 301 302),proxy_redirect可以重设HTTP头部的location或refresh字段
proxy_redirect [default | off |redirect |replacement]
默认default
配置块 http server location
- proxy_next_upstream
表示上游一台服务器转发请求出现错误时,继续换一套服务器处理这个请求其参数用来说明在那些情况下继续选择下一台上游服务器转发请求.
proxy_next_upstream [error |timeout |invalid_header |http_500 |http_502~504 |http_404 | off]
默认 proxy_next_upstream error timeout;
配置块 http server location
可以通过阅读 ngx_http_proxy_module了解更多详细情况
#sudo vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
location / {
#保证代理机器能访问到 下面的机器并装有nginx 在主机号为100的机器上有响应网页
proxy_pass http://192.168.1.100;
root html;
index index.html index.htm;
}
}
sudo /usr/local/nginx/sbin/nginx -s reload
3.2 负载均衡(upstream)
负载均衡:由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种负载分担技术,将外部发送来的请求按照事先设定分配算法分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。
- upstream块
upstream name {...}
配置块 http
upstream块定义一个上游服务器的集群,便于反向代理中的proxy_pass使用
upstream mynet{
server www.wopai1.com;
server www.wopai2.com;
server www.wopai3.com;
}
server {
location /{
proxy_pass http://mynet;
}
}
- server
server name [paramenters]
配置块upstream
server配置项指定了一台上游服务器的名字,可以是域名 IP地址端口 UNIX句柄
weight= number;设置向这台服务器转发的权重,默认为1
max_fails=number;该选项域fail_timeout配合使用
指在fail_timeout时间段内如果转发上游失败超过number次就认为当前的fail_timeout时间内
这台服务器不可用,max_fails默认为1 如果设置为0 表示不检查失败次数
fail_timeout=time; fail_timeout表示该时间内转发多少次失败后就认为上游不可用.默认10s
down 表示上游服务器永久下线,只能在ip_hash配置时才有效
backup 在ip_hash配置时无效.只有所有非备份机都失败,才向上游备份服务器转发请求.
upstream mynet{
server www.wopai1.com weight=5;
server www.wopai2.com:8081 max_fails=3 fail_timeout=300s;
server www.wopai2.com down;
}
- ip_hash
配置块 upstream
希望来自某一个用户的请求始终落在固定的一台服务器上进行处理.
根据客户端的IP散列计算出一个key,将key按照upstream集群中的上游服务器进行取模,求得的值对应的主机接收转发请求.
ip_hash不可以与weight同时使用
如果upstream配置中有一台服务器暂时不可用,不能直接删除该配置,而应该使用down标识.
upstream mynet{
ip_hash;
server www.wowpai1.top;
server www.wowpai2.top;
server www.wowpai3.top down;
}
最后,附上 Nginx负载均衡基本配置(示例)
upstream my.net{ #my.net是自定义的命名 在server结构中引用即可
#代理服务器为 两台机器192.168.22.136 192.168.22.147做负载均衡操作
#两台机器上 可以跑apache负载功能更为强大的网页相关任务
#max_fails 表示尝试出错最大次数 即可认为该服务器 在fail_timeout时间内不可用
# server servername:port servername可以写主机名 或者点分式IP
server 192.168.22.136:80 max_fails=1 fail_timeout=300s;
server 192.168.22.147:80 max_fails=1 fail_timeout=300s;
}
server {
listen 80;
server_name localhost;
location / {
#upstream 块名
proxy_pass http://my.net;
root html;
index index.html index.htm;
}