nginx配置详情介绍及分析

本文介绍如何在Linux系统上安装高性能的HTTP服务器Nginx,并利用反向代理支持JAVA及利用FASTCGI支持Django的运行环境。

Nginx 简介
Nginx("engine x")是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。Nginx是由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的。Igor 将源代码以类 BSD 许可证的形式发布。Nginx 因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名了。

详细请访问Nginx的中文维基:https://www.360docs.net/doc/416858479.html,

为了确保能在Nginx中使用正则表达式进行更灵活的配置,安装之前需要确定系统是否安装有PCRE(Perl Compatible Regular Expressions)包。可以到ftp://https://www.360docs.net/doc/416858479.html,/pub/software/programming/pcre/下载最新的PCRE源码包,使用下面命令编译和安装:
# tar zxvf pcre-7.8.tar.gz
# cd pcre-7.8
# ./configure
# make
# make install

接下来安装Nginx,下面是把Nginx安装到/usr/local/nginx目录下的详细步骤:
# tar zxvf nginx-0.6.34.tar.gz
# cd nginx-0.6.34
# ./configure --with-http_stub_status_module
# make
# make install

其中参数--with-http_stub_status_module是为了启用nginx的NginxStatus功能,用来监控nginx的当前状态。
其它可选参数: --with-md5=/usr/lib --with-sha1=/usr/lib --with-openssl=/usr/lib/ssl/ --with-http_ssl_module
安装成功后/usr/local/nginx目录下有四个子目录分别是:conf、html、logs、sbin 。其中配置文件位于conf/nginx.conf,程序文件位于sbin/nginx。确保系统的80端口没被其他程序占用,运行sbin/nginx命令来启动Nginx,打开浏览器访问此机器的IP,如果浏览器出现 Welcome to nginx! 则表示已经安装并运行成功。

Nginx安装后只有一个程序文件,本身并不提供管理程序,它是使用参数和系统信号机制对Nginx进程本身进行控制的。
Nginx的参数包括有如下几个:
-c :使用指定的配置文件而不是 conf 目录下的 nginx.conf 。
-t:测试配置文件是否正确,在运行时需要重新加载配置的时候,此命令非常重要,用来检测所修改的配置文件是否有语法错误。
-v:显示 nginx 版本号。
-V:显示 nginx 的版本号以及编译环境信息以及编译时的参数。
例如我们要测试某个配置文件是否书写正确,我们可以使用以下命令:sbin/nginx -t -c conf/nginx2.conf

通过信号对 Nginx 进行控制
Nginx 支持下表中的信号:
信号名 作用描述
TERM, INT 快速关闭程序,中止当前正在处理的请求
QUIT 处理完当前请求后,关闭程序
HUP 重新加载配置,并开启新的工作进程,关闭就的进程,此操作不会中断请求
USR1 重新打开日志文件,用于切换日志,例如每天生成一个新的日志文件
USR2 平滑升级可执行程序
WINCH 从容关闭

工作进程

有两种方式来通过这些信号去控制Nginx
第一是通过logs目录下的nginx.pid查看当前运行的Nginx的进程ID,通过kill -XXX 来控制Nginx,其中XXX就是上表中列出的信号名。
如果系统中只有一个Nginx进程,那您也可以通过killall命令来完成,例如运行killall -s HUP nginx来让Nginx重新加载配置。

先用代理方式运行Java的配置文件:

worker_processes 2;# 工作进程数,一般与 CPU 核数等同
#error_log logs/error.log;
#pid logs/nginx.pid;

events {
use epoll;#Linux 下性能最好的 event 模式
worker_connections 2048;# 每个工作进程允许最大的同时连接数
}

http {
include mime.types;
default_type application/octet-stream;

#access_log off;
access_log logs/access.log;# 日志文件名

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;

# 集群中的所有后台服务器的配置信息
upstream tomcats {
ip_hash; #同一个客户端IP会落在同一台WEB上,不用考虑session共享的问题
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}

server {
listen 80;#HTTP 的端口
server_name localhost;

charset utf-8;

#access_log logs/host.access.log main;

#Nginx 状态监控配置
location ~ ^/NginxStatus/ {
stub_status on;
access_log off;
}
#禁止访问 WEB-INF 目录
location ~ ^/(WEB-INF)/ {
deny all;
}

location ~ \.(htm|html|gif|jpg|jpeg|png|bmp|ico|rar|css|js|zip|java|jar|txt|flv|swf|mid|doc|ppt|xls|pdf|txt|mp3|wma)$
{
root /opt/webapp;
expires 24h;
}
#反向代理
location / {
proxy_pass http://tomcats;
include proxy.conf;
}

error_page 404 /html/404.html;

# redirect server error pages to the static page /50x.html
error_page 502 503 /html/502.html;
error_page 500 504 /50x.html;
location = /50x.html {
root html;
}
}
}

proxy.conf 文件内容:
proxy_redirect off;
#设定header
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#限制了上传文件的大小
client_max_body_size 10m;
client_body_buffer_size 128k;
#代理连接超时
proxy_connect_timeout 90;
#代理发送超时
proxy_send_timeout 90;
#代理接收超时
proxy_read_timeout 90;
#代理缓冲大小
proxy_buffer_size 4k;
#代理缓冲,注意4和32中间有空格
proxy_buffers 4 32k;
#高负荷下缓冲大小
proxy_busy_buffers_size 64k;
#设定缓存文件夹大小
proxy_temp_file_write_size 64k;

Nginx 监控
上面是一个实际网站的配置实例,其中灰色文字为配置说明。上述配置

中,首先我们定义了一个 location ~ ^/NginxStatus/,这样通过 http://localhost/NginxStatus/ 就可以监控到Nginx的运行信息,显示的内容如下:
Active connections: 70
server accepts handled requests
14553819 14553819 19239266
Reading: 0 Writing: 3 Waiting: 67

NginxStatus 显示的内容意思如下:
#active connections – 当前Nginx正处理的活动连接数。
#server accepts handled requests -- 总共处理了14553819个连接 , 成功创建14553819次握手 ( 证明中间没有失败的 ), 总共处理了19239266个请求 ( 平均每次握手处理了1.3个数据请求 )。
#reading -- nginx 读取到客户端的Header信息数。
#writing -- nginx 返回给客户端的Header信息数。
#waiting -- 开启keep-alive的情况下,这个值等于active-(reading+writing),意思就是Nginx已经处理完正在等候下一次请求指令的驻留连接。

静态文件处理
通过正则表达式,我们可让Nginx识别出各种静态文件,例如images路径下的所有请求可以写为:
location ~ ^/images/ {
root /opt/webapp/images;
}


而下面的配置则定义了几种文件类型的请求处理方式。
location ~ \.(htm|html|gif|jpg|jpeg|png|bmp|ico|css|js|txt)$ {
root /opt/webapp;
expires 24h;
}

对于例如图片、静态HTML文件、js脚本文件和css样式文件等,我们希望Nginx直接处理并返回给浏览器,这样可以大大的加快网页浏览时的速度。因此对于这类文件我们需要通过root指令来指定文件的存放路径,同时因为这类文件并不常修改,通过expires指令来控制其在浏览器的缓存,以减少不必要的请求。expires指令可以控制HTTP应答中的“Expires”和“Cache-Control”的头标(起到控制页面缓存的作用)。您可以使用例如以下的格式来书写Expires:
expires 1 January, 1970, 00:00:01 GMT;
expires 60s;
expires 30m;
expires 24h;
expires 1d;
expires max;
expires off;

动态页面请求处理
Nginx 本身并不支持现在流行的JSP、ASP、PHP、PERL等动态页面,但是它可以通过反向代理将请求发送到后端的服务器,例如Tomcat、Apache、IIS等来完成动态页面的请求处理。前面的配置示例中,我们首先定义了由Nginx直接处理的一些静态文件请求后,其他所有的请求通过proxy_pass指令传送给后端的服务器(在上述例子中是Tomcat)。最简单的proxy_pass用法如下:
location / {
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
}


这里我们没有使用到集群,而是将请求直接送到运行在8080端口的Tomcat服务上来完成类似JSP和Servlet的请求处理。
当页面的访问量非常大的时候,往往需要多个应用服务器来共同承担动态页面的执行操作,这时我们就需要使用集群的架构。Nginx通过upstream指令来定义一个服务器的

集群,最前面那个完整的例子中我们定义了一个名为tomcats的集群,这个集群中包括了三台服务器共6个Tomcat服务。而proxy_pass指令的写法变成了:
location / {
proxy_pass http://tomcats;
proxy_set_header X-Real-IP $remote_addr;
}


再利用fastcgi运行Django,这里我们使用的是Windows环境,配置文件除了目录路径外无其它差别。

从https://www.360docs.net/doc/416858479.html,/software/flup/dist/下载flup并执行setup.py install安装。

从https://www.360docs.net/doc/416858479.html,/tag/nginx/下载nginx Windows版本的安装程序。运行并安装。

打开配置文件 nginx/conf/nginx.conf 修改为:

worker_processes 1;

#error_log logs/error.log;

events {
worker_connections 64;
}

http {
include mime.types;
default_type application/octet-stream;

#access_log logs/access.log main;

sendfile on;

keepalive_timeout 65;

#gzip on;

server {
listen 80;
server_name localhost;

root /cygdrive/D/html;
index index.html index.htm;

charset utf-8;

#access_log logs/host.access.log main;

# 静态资源
location ~ \.(html|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$
{
expires 30d;
break;
}

location / {
# 指定 fastcgi 的主机和端口
fastcgi_pass 127.0.0.1:8051;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_pass_header Authorization;
fastcgi_intercept_errors off;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

现在重启启动nginx后在Django项目下执行
python manage.py runfcgi method=threaded host=127.0.0.1 port=8051

django的fastcgi模式有如下几个重要参数:

protocol=PROTOCOL fcgi, scgi, ajp, ... (default fcgi)
host=HOSTNAME hostname to listen on..
port=PORTNUM port to listen on.
socket=FILE UNIX socket to listen on.
method=IMPL prefork or threaded (default prefork)
maxrequests=NUMBER number of requests a child handles before it is killed and a new child is forked (0 = no limit).
maxspare=NUMBER max number of spare processes / thr

eads
minspare=NUMBER min number of spare processes / threads.
maxchildren=NUMBER hard limit number of processes / threads
daemonize=BOOL whether to detach from terminal.
pidfile=FILE write the spawned process-id to this file.
workdir=DIRECTORY change to this directory when daemonizing.
outlog=FILE write stdout to this file.
errlog=FILE write stderr to this file.
umask=UMASK umask to use when daemonizing (default 022).


这里没有设置media目录,现在是以扩展名来分辨是不是转发到Django的程序处理。
想要只允许nginx处理media目录只需要将
location ~ \.(html|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$
换成
location ~ ^/media/
就可以了。

主目录为d:\html,定义是:root /cygdrive/D/html;

也可以利用负载均衡的方式配置,修改nginx.conf文件,关键几点如下:

worker_processes 2;#开2个nginx进程,在任务管理器可以看到这2个子进程和一个nginx主进程,一般按CPU数配置

events {
worker_connections 64;#每个进程链接队列长度,可按实际设置
}

http {
... #省略其它配置
#upstream段要放在http段中
#和后端的2个fastcgi 服务通讯,注意fastcgi ,后面用到,weight是权重
upstream fastcgi {
server 127.0.0.1:8051 weight=1;
server 127.0.0.1:8052 weight=1;
}

server {
listen 80;
server_name localhost;
...#省略其它配置
location / {
# 指定 fastcgi 的主机和端口,这里的fastcgi指的是上面的upstream
fastcgi_pass fastcgi;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_pass_header Authorization;
fastcgi_intercept_errors off;
}
...#省略其它配置
}
...#省略其它内容
}

运行nginx(administrator用户),运行2个fastcgi服务,开2个cmd窗口,在Django的project目录下运行:
python manage.py runfcgi host=127.0.0.1 port=8051 method=threaded daemonize=false
python manage.py runfcgi host=127.0.0.1 port=8052 method=threaded daemonize=false

http://127.0.0.1/或http://localhost/可以看到输出结果。

开2个fastcgi的cmd窗口,终止其中一个访问看看,其实没有任何影响。再把运行的停止,停止的启动看看,还是能访问。若2个都终止,发现不能访问。在测试过程中注意C:\nginx\logs下的log的输出信息



在Nginx的集群配置中,Nginx使用最简单的平均分配规则给集群中的每个节点分配请求。一旦某个节点失效时,或者重新起效时,Nginx都会非常及时的处理状态的变化,以保证不会影响到用户的访问。

总结
尽管整个程序包只有五百多K,但麻雀虽小、五脏俱全。Nginx官方提供的各种功能模块应有尽有,结合这些模块可以完整各种各样的配置要求,例如:压缩、防盗链、集群、FastCGI、流媒体服务器、Memcached 支持、URL 重写等等,更关键的是 Nginx 拥有 Apache 和其他 HTTP 服务器无法比拟的高性能。您甚至可以在不改变原有网站的架构上,通过在前端引入 Nginx 来提升网站的访问速度。

相关文档
最新文档