Nginx
简介:
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
正向代理
概述
我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。
概念
是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
用途
- 为在防火墙内的局域网客户端提供访问Internet的途径
- 使用缓冲特性减少网络使用率
图解
反向代理
概念
以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
用途
- 将防火墙后面的服务器提供给Internet用户访问
- 为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务
- 可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下
图解
负载均衡
概述
负载均衡是由多台服务器以对称的方式组成一个服务器集合, 每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种负载分担技术,将外部发送来的请求按照事先设定分配算法分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。
作用
均衡负载能够平均分配客户请求到服务器列阵,籍此提供快速获取重要数据,解决大量并发访问服务问题。
算法
-
weight轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器, 如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。weight:指定轮询权值,weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。
-
ip_hash
每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。
-
fair
比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。
-
url_hash
按访问urI的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。
-
安装zlib依赖库
1
sudo apt-get install zlib1g-dev
-
解压相关文件
1
2
3tar -xzvf nginx-1.11.3.tar.gz
tar -xZvf openssl-1.0.1.tar.gz
tar -xZvf pcre- -841.tar.gz -
进入Nginx解压目录
1
./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.41 --with-openssl=../openssl-1.0.1
-
编译
1
make
注意:如果出现“pcre.h No such file or directory",安装"sudo apt-get install libpcre3 libpcre3-dev"
-
安装
1
sudo make install
-
说明
nginx会被安装在/usr/local/nginx目录下
- conf:存放配置文件
- html:静态网页
- logs:存放日志文件
- sbin:存放可执行文件
相关命令
-
启动Nginx服务
1
sudo /usr/local/nginx/sbin/nginx
-
关闭Nginx服务
1
sudo /usr/local/nginx/sbin/nginx -s stop
-
重新加载配置
1
sudo /usr/local/nginx/sbin/nginx -s reload
-
置顶配置文件
1
sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
-
查看版本信息
1
2sudo /usr/local/nginx/sbin/nginx -v
sudo /usr/local/nginx/sbin/nginx -V -
查看80端口占用情况
1
netstat -ano | grep 80
-
关闭占用80端口的程序
1
sudo fuser -k 80/tcp
测试
-
启动服务
1
sudo /usr/local/nginx/sbin/nginx
-
打开浏览器,输入Nginx服务器IP地址
配置
-
配置文件大致结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23main
events {
....
}
http {
....
upstream myproject {
....
}
server {
....
location {
....
}
}
server{
....
location {
....
}
}
....
} -
主要区域
- main(全局设置)
- events(nginx工作模式)
- http(http设置)
- sever(主机设置)
- location(URL匹配)
- upstream(负载均衡服务器设置)
-
main
- 作用:全局设置
- 内容
1
2
3
4
5
6#user nobody;
worker_ processes1;
error log logs/error.log notice;
pid
logs/nginx.pid;
worker_ _rlimit_ nofile 65535; - user
指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行。 - worker_ processes
指定了Nginx要开启的子进程数。每个Nginx进程平均耗费10M~12M内存。根据经验,一般指定1个进程就足够了,如果是多核CPU,建议指定和CPU的数量一样的进程数即可。 - error_ log
用来定义全局错误日志文件,输出级别:1
2
3
4
5
6debug
info
notice
warn
error
crit - pid
指定进程id的存储文件位置 - worker_rlimit_nofle
指定一个nginx进程可以打开的最多文件描述符数目,可以使用命令“ulimit -n 65535"来设置
-
events
- 作用
指定nginx的工作模式和连接数上限 - 内容
1
2
3
4events {
use epoll; #Linux平台
worker_ connections 1024;
} - use
- 作用
指定Nginx的工作模式 - 模式
1
2
3
4
5
6select 标准的工作模式
poll 标准的工作模式
kqueue 高效的工作模式,应用于BSD系统中
epoll 高效的工作模式,应用于Linux平台
rtsig
/dev/poll
- 作用
- worker_connections
- 定义Nginx每个进程的最大连接数,即接收前端的最大请求数,默认是1024
- 最大客户端连接数计算方式
1
2
3由worker_processes和worker_connections决定,即Max_clients=worker_processes*worker_connections,
在作为反向代理时,Max_clients变为: Max_dlients = worker_processes * worker_ connections/4。
进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后worker_connections的设置才能生效。
- 作用
-
http
- 作用
最核心的模块,它负责HTTP服务器相关属性的配置,它里面含有server和upstream子模块 - 内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20http {
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 logs/ access.log main;
sendfile on;
tcp_ nopush on;
tcp_ nodelay on;
keepalive_ timeout 65;
gzip on;
upstream myproject {
....
}
server {
....
}
} - include
设定文件的mime类型,类型在配置文件目录下的mime.type文件定义,来告诉nginx来识别文件类型 - default_type
设定了默认的类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置asp的locate环境时,Nginx是不予解析的,此时,用浏览器访问asp文件就会出现下载了 - log_format
设置日志的格式,和记录哪些参数,这里设置为main,刚好用access_log来纪录这种类型,格式:1
2127.0.0.1 - - [21/Apr/2015:18:09:54 +0800] "GET /index.php HTTP/1.1" 200 87151 "_" "Mozilla/5.0 (Macintosh;
Intel Mac OSX 10 .10_ 2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36" - access_log
纪录每次的访问日志的文件地址,后面的main是日志的格式样式,对应于log_format的main - sendfle
开启高效文件传输模式。将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞 - tcp_nopush
- keepalive_timeout
设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接 - gzip
使用压缩模块
- 作用
-
server
- 作用
用来定义一个虚拟主机 - 内容
1
2
3
4
5
6
7
8
9
10server {
listen 8080;
server_name localhost;
charset utf-8;
access_log logs/host.access.log main;
error_page 500 502 503 504 /50x.html;
location ... {
...
}
} - listen
指定虚拟主机的服务端口 - server_name
指定IP地址或者域名,多个域名之间用空格分开 - charset
设置网页的默认编码格式 - access_log
指定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式 - error_log
指定此虚拟主机的错误日志存放路径,最后的error用于指定访问日志的输出格式 - error_page
错误页面 - root
表示在这整个server虚拟主机内,全部的root web根目录。注意要和locate {}下面定义的区分开来 - index
全局定义访问的默认首页地址。注意要和locate {}下面定义的区分开来
- 作用
-
location
- 作用
- 是nginx中用的最多的,也是最重要的模块,负载均衡、反向代理、虚拟域名都与它相关
- 定位URL,解析URL,所以它也提供了强大的正则匹配功能,也支持条件判断匹配,用户可以通过location指令实现Nginx对动、静态网页进行过滤处理
- 访问nginx本机目录文件
1
2
3
4location / {
root html;
index index.html index.htm;
}1
2
3location /static/ {
alias /var/static/;
} - 反向代理配置
1
2
3
4
5location / {
proxy_pass http://www.suyin.tech:8000;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header Host $http_host;
}适用于Django使用自带runserver方式启动服务
- 采用wsgi方式
1
2
3
4
5# 采用uwsgi方式
location / {
include uwsgi_params;
uwsgi_pass suyin;
}适用于Django使用wsgi方式启动服务
- 作用
-
upstream
- 作用
负债负载均衡模块,通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡 - 内容
1
2
3
4
5
6upstream suyin {
ip_hash;
server 10.11.0.1:8080;
server 10.11.0.2:8080 down;
server 10.11.0.3:8080 max_fails=3 fail_timeout=20s;
} - suyin
指定负载均衡器的名称,这个名称可以任意指定,在后面需要的地方直接调用即可 - 负载均衡调度算法
- weight
- ip_hash
- fair
- url_hash
- down
表示当前的server暂时不参与负载均衡 - backup
预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻 - max_fails
允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream模块定义的错误 - fail_timeout
在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用 - 注意
当负载调度算法为ip_hash时, 后端服务器在负载均衡调度中的状态不能是weight和backup - 说明
nginx的worker_rlimit_nofle达到上限时,再有客户端链接报502错误,用了log_format指令设置了日志格式之后,需要用access_log指令指定日志文件的存放路径 - 使用
1
2
3
4
5
6upstream suyin {
server 10.11.0.1:8080 weight=1 max_fails=1 fail_timeout=300s;
server 10.11.0.2:8080 welght=2 max_falls=1 fall_timeout=300s;
server 10.11.0.3:8080 weight=1 max_fails=1 fail_timeout=300s;
}
}
- 作用
反向代理服务器的基本配置
-
proxy_pass
1
2
3
4
5
6
7
8
9proxy_pass URL;
配置块location if
此配置将当前请求代理到URL参数指定的服务器上,URL可以是主机名或者IP地址加PORT的形式
proxy_pass htp://localhost:8000;
也可以结合负载均衡实用<负载均衡会说明这种情况>
也可以吧HTTP转换成HTTPS
proxy_pass http://192.168.0.1;
默认情况反向代理不转发请求中的Host头部,如果需要设置转发头部
则:proxy_set_header Host $host; -
proxy_method
1
2
3
4proxy_method method_name;
配置块 http server location
此配置项表示转发时的协议方法名:proxy_method POST;
那么客户端发来的GET请求在转发时方法改为POST; -
proxy_hide_header
1
2
3
4
5
6proxy_hide_header header1;
配置块 http server location;
Nginx会将上游服务器的响应转发给客户端,但默认不转发HTTP头部字段(Date Server X-Pad X-Accel-* )
使用proxy_hide_header可以指定任意头部不能被转发
proxy_hide_header Cache-Control;
proxy_hide_header MicrosoftOfceWebServer; -
proxy_pass_header
1
2
3
4proxy_pass_header header1;
配置块 http server location
功能与 proxy_hide_header相反,是设置哪些头部允许转发.
proxy_pass_header X-Accel-Redirect; -
proxy_pass_request_body
1
2
3
4proxy_pass_request_body offlon;
默认 on
配置块 http server location;
确定上游服务器是否向上游服务器转发HTTP包体 -
proxy_pass_request_header
1
2
3
4proxy_pass_request_header on | off;
默认 on
配置块 http server location
确定是否转发HTTP头部 -
proxy_redirect
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26proxy_redirect [default | off | redirect | replacement]
默认 default
配置块 http server location
当上游服务响应时重定向或刷新(HTTP 301 302),proxy_ redirect可以重设HTTP头部的location或refresh字段
proxy_redirect http://locahost:8000/two/ http://frontend/one/;
上游响应302,location是URI是 http://locahost:8000/two/some/uri/
那是实际转发给客户端的是 http://frontend/one/some/uri/;
可以使用前面提到的 ngx_http_core_module 模块提供的变量
proxy_redirect http://locahost:8000/two/ http://$host:server_port/;
可以省略replacement参数的主机名部分,这时候用虚拟主机名填充
proxy_redirect http://locahost:8000/two/ /one/;
使用off参数的时候,将使location和refresh的字段维持不变
proxy_redirect off;
如果使用的proxy_redirect default;
下面两种配置是等效的
location /{
proxy_pass http://upstream:port/two/;
proxy_redirect default;
}
location /{
proxy_pass http://upstream:port/two/;
proxy_redirect http://upstream.port/two/ /one/;
} -
proxy_next_upstream
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16proxy_next_upstream [error | timeout | invalid_header | http_500 | http_502~504 | http_404 | off]
默认 proxy_next_upstream error timeout;
配置块 http server location
此配置表示上游一台服务 器转发请求出现错误时,继续换一套服务器处理这个请求
其参数用来说明在那些情况下继续选择下一台上游服务器转发请求.
error 向上游发起连接发送请求读取响应时出错
timeout 发送请求或读取响应时出错
invalid_header 上游服务器发送的响应时不合法
http_500 上游响应500
http_502 上游响应502
http_503 上游响应503
http_504 上游响应504
http_404 上游响应404
off 关闭 proxy_next_upstream 功能只要一出错就选择另外一台上游再次出发
Nginx反向代理模块中还提供很多配置,如设置连接的超时时间,临时文件如何存储,如何缓存上游服务器响应等功能。