1. 全局配置

user nginx ngnix;

#运行nginx进程的用户与组

worker_process 2;

#启动几个worker进程

error_log logs/error.log;

#定义错误访问日志的路径

pid  logs/nginx.pid;

#定义pid文件的路径

worker_rlimit_nofile 8192;

#每个worker进程启动可以打开的文件数目

events {

worker_connections 4096;

#每个worker可以接收的请求连接数。

}


2. 日志配置

log_format   main '$remote_addr - $remote_user [$time_local]  $status '

'"$request" $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"';

#定义日志的记录格式,此格式的名字为main。


3. 虚拟主机配置

server {

listen    80;

#监听的地址与端口,后面可以跟参数,如listen 192.168.0.11:443 ssl。

server_name node1.yonchin.com;

#定义虚拟服务器的名字。

access_log logs/node1.access.log main;

#访问路径,和记录格式。

root html;

#文档根目录,可以是绝对路径也可以是相对路径。

}


4. 访问控制

location /status {

deny 192.168.0.11;

allow 192.168.0.0/24;

allow 10.128.1.0/16;

deny all;

#acl规则是从上到下的依此生效的。

}


5. 基本认证

location /status {

auth_basic    "Nginx Status Info";

#登陆时显示的信息。

auth_basic_user_file /etc/nginx/.htpasswd;

#定义密码认证文件,允许访问/status这个URI用户和对应的密码。

}

.htpasswd的创建:

htpasswd -cm /etc/nginx/.htpasswd user1


6. 状态信息

location /status {

stub_status    on;

#开启状态信息的查看功能。

access_log off;

#关闭访问/status的日志。

allow 192.168.0.12;

#仅允许192.168.0.12这个地址访问。

deny all;

}


7. gzip 配置

gzip    on;

#开启对响应报文的压缩功能。

gzip_buffers 168k;

#压缩响应报文所使用的缓冲区个数以及每个缓冲区的大小。

gzip_comp_level 6;

#压缩的程度,1-9压缩比例依此增加,不必太高要不浪费CPU时钟。

gzip_disable    "MSIE [1-6]\.";

#对不支持压缩功能的浏览器,禁用gzip功能。

gzip_min_length 1024;

#响应报文最小多大,可以对其使用gzip功能。

gzip_http_version 1.1;

#对哪个http协议的版本,进行压缩。

gzip_proxied expired no-cache no-store private;

#对来自后端的哪种响应头域的响应报文进行压缩,即当nginx本身为代理服务器的时候。

gzip_types text/plain application/xml;

#对哪种类型的响应文件需要进行压缩。

gzip_vary on;

#在响应头部信息中,添加一个头信息为"Vary: Accept-Encoding"


8. rewrite配置

域名跳转:

server {

listen 80;

server_name node1.yonchin.com;

rewrite    ^/     http://node2.yonchin.com;

#将对node1.yonchin.com的所有请求都重定向到http://node2.yonchin.com上。

}

指定路径跳转:

location / {

rewrite^/forum/?$    /bbs/ permanent;

#将对/forum下面的URI的访问永久重定向到/bbs/上。rewrite后面可以跟的参数有4种:

last:表示匹配完rewrite规则后,不再继续进行后面rewrite的匹配。但所匹配到的URL会去查找一个合适的location指令所定义的内容。所以,这个参数不用在location上下文中,否则容易产生死循环。

break:表示匹配完rewrite规则后,不再继续进行后面rewrite的匹配。这个参数可以用在location上下文中。

redirect:会返回302的临时重定向代码。如果重定向后的URL不是以http://或https://开头的话,可以使用这个参数。

permanent:返回一个301的永久重定向代码。

}


9. https配置

server {

listen 443 ssl;

#监听443端口并开启ssl功能。或者直接使用ssl on;也可以开启ssl。

server_name    node1.yonchin.com;

index    index.html;

#主页文件。

root    /www

ssl_protocols    SSLv3 TLSv1 TLSv1.1 TLSv1.2;

#定义ssl所支持的协议。

ssl_ciphers    AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;

#启用加密算法。

ssl_certificate    /etc/nginx/nginx.crt;

#公钥的路径。

ssl_certificate_key    /etc/nginx/nginx.key;

#私钥的路径。

ssl_session_timeout    10m;

#定义客户端重用缓存中ssl会话参数的超时时长。

ssl_session_cache    shared:SSL:10m;

#定义缓存ssl会话参数的类型和大小。类型分builtin和shared两种,builtin表示每个worker进程单独使用一个缓存,shared表示所有的worker进程共享一个缓存。建议使用shared类型。

}

建立证书:

(umask 077; openssl genrsa -out nginx.key 1024)

openssl req -new -X509 -key ngnix.key -out nginx.crt


10. proxy配置

http {

proxy_set_header Host$host;

#向代理服务发往后端的请求头域中,添加客户端所请求的主机名。

proxy_set_header   X-Real-IP    $remote_addr;

#向代理服务发往后端的请求头域中,添加X-Real-IP头域,值为$remote_addr即客户端IP。

proxy_set_header  X-Forwarded-For    $proxy_add_x_forwarded_for;

#将$remote_addr的值追加到X-Forwareded-For请求头域后面。如果没有X-Forwareded-For请求头域,则$proxy_add_x_forwarded_for的值与$remote_addr的值相等。

client_max_body_size  10m;

#客户端请求的请求体的最大大小。

client_body_buffer_size  128k;

#客户端请求体可以使用的缓冲大小。

proxy_buffering  on;

#开启代理对后端服务器响应数据的缓冲功能。

proxy_connect_timeout  90;

#代理服务器与后端连接建立的超时时间。

proxy_send_timeout  90;

#代理服务器向后端服务器发送请求的超时时间。

proxy_read_timeout  90;

#代理服务器接收后端服务器响应的超时时间。

proxy_buffers  4 64k;

#对于每个连接,所能使用的缓冲区的个数以及每个缓冲区的大小。

proxy_buffer_size  128k;

#表示可以接受后端服务器所响应的最大数据。

proxy_busy_buffers_size    128k;

#表示缓存中的响应数据要发送到客户端时,所使用的缓冲大小。

proxy_temp_file_write_size  128k;

#如果一次可写入临时文件的数据大小。

server {

listen 80;

server_name  node1.yonchin.com;

location / {

proxy_pass  http://192.168.0.12;

}

}

}

缓存所代理的数据:

http {

proxy_cache_path  /data/nginx/cache  levels=1:2 keys_zone=static:10m inactive=24h max_size=1g;

#定义缓存路径,几级的缓存目录,缓存区域的名称和大小,多长时间处于非活动状态时可以删除,最大缓存多少数据。

server {

proxy_pass  http://192.168.0.12;

proxy_set_header  Host $host;

proxy_cache  static;

#使用上面定义的缓存区域。

proxy_cache_valid  200 302 1d;

#不同的响应码的缓存时长。

proxy_cache_valid   any 1m;

#除了200,302外,其他的所有响应码缓存1分钟。

prox_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;

#表示出现那种情况的时候可以使用缓存中过期的数据。

}

}

11. 负载均衡

算法:

rr :轮询,默认即是这种算法。

wrr :加权轮询,需要添加weight参数。

ip_hash :基于客户端IP地址的hashing来进行请求的负载均衡。

least_conn :基于最少的活动连接数对请求负载均衡。

例子:

http {

upstream backend {

server 192.168.0.11    weight=2;

server 192.168.0.12    weight=3;

server 127.0.0.1 backup;

#backup表示正常情况下,127.0.0.1不提供服务,只有在所有的其他server宕机后才使用它。

}

或:

upstream backend {

ip_hash;

server 192.168.0.11;

server 192.168.0.12 down;

#down参数表示此后端服务器不可用,常与ip_hash算法结合使用。

server 127.0.0.1 backup;

}

server {

location / {

proxy_pass http://backend;

}

}

}


12. 动静分离

upstream dynamic {

server 192.168.0.12;

server 192.168.0.13;

}

server {

listen 80;

server_name node1.yonchin.com;

index index.html;

root /usr/shard/nginx/html;

location ~* \.(html|gif|jpg|jpeg|png|bmp|swf|flv|mp3|wma)$ {

expires 5d;

#在响应给客户端的响应头部,添加"Expires"和"Cache-Control"响应头部,此处表示对匹配到的文件在客户端缓存5天。

}

location ~* \.php$ {

proxy_pass http://dynamic;

}

}

或:

upstream static {

server 192.168.0.11;

}

upstream dynamic {

server 192.168.0.12;

server 192.168.0.13;

}

server {

location ~* \.(html|gif|jpg|jpeg|png|bmp|swf|flv|mp3|wma) {

proxy_pass http://static;

}

location ~* \.php$ {

proxy_pass http://dynamic;

}

}


13. 防盗链

location ~* \.(png|gif|jpg|jpeg|ico|swf|flv|wma|wmv|mp3|asf|rar|zip)$ {

valid_referersnone blocked server_names

*.myselfsite.com

~\.google\. ~\.baidu\.;

}

#请求头中不包含Referer头域的,经过防火墙或代理服务器Referer被删除的,有Referer且属于server_name指令中定义的,Referer头域中是*.myselfsite.com的,包含google和baidu字段的,都允许访问。

if ($invalid_referer){

return 403;

#如果Referer中的URL不匹配指令valid_referers中定义的内容,那么$invalid_referer的值将为真,就会返回给客户端403的错误。

}


14. 后端健康监测

软件:tengine-2.0.1.tar.gz

系统:CentOS6.5

安装:

./configure   --user=nginx   --group=nginx     --with-http_flv_module   --with-http_stub_status_module   --with-http_gzip_static_module --enable-mods-shared=all --with-file-aio  --with-http_sysguard_module --with-pcre

make && make install

配置:

http {

upstream webs {

server 192.168.0.12;

server 192.168.0.13;

check interval=3000 rise=2 fall=5 timeout=1000 type=http;

#interval:发送健康监测的时间间隔。

#rise:如果连续成功检测2次,服务器就被认为是up。

#fall:如果连续失败检测5次,服务器就被认为是down。

#timeout:健康检测的超时时间。

#type:健康检查包的类型。支持tcp、ssl_hello、http、mysql、ajp。

check_http_send "HEAD / HTTP/1.0\r\n\r\n";

#健康检测的内容。注意HTTP协议的版本是1.0。1.1的版本无法正常检测后端。

check_http_expect_alive http_2xx http_3xx;

#后端返回什么状态码,就认为是健康的。还支持http_4xx和http_5xx。

}

server {

location / {

proxy_pass    http://webs;

}

location /status {

check_status;

#显示服务器的健康状态页面。

access_log    off;

allow 192.168.0.0/24;

denyall;

}

}

}

15. 过载保护

环境同上。

http {

dso {

load ngx_http_sysguard_module;

#动态加载sysguard模块

}

server {

sysguard on;

#开启sysguard功能。

sysguard_load load=2*0.5 action=/test.html;

#如果CPU的平均负载率超过2*0.5则就显示/test.html这个页面的内容。2表示CPU的个数为两个,0.5可以理解为每个CPU的的单独负载。

sysguard_mem swapratio=20% action=/test.html;

#如果swap分区的使用率超过20%的话,就返回test.html这个页面内容。

sysguard_mem free=100Maction=/test.html;

#如果空闲内存少于100M的话,就返回test.html这个页面内容。当然也可以直接返回错误状态码,例如:

server {

sysguard on;

sysguard load=1.5 action=/loadlimit;

location /loadlimit {

return 503;

}

}

}

}


16. 常用命令行

日志轮转:

mv access.log access.log.0

kill -USR1 `cat master.nginx.pid`

#USR1这个信号,就是告诉nginx主进程重新打开一个日志文件。

在线升级nginx:

kill -USR2 `cat master.nginx.pid`

平滑重启:

kill -HUP `cat master.nginx.pid`

从容关闭工作进程:

kill -WINCH `cat master.nginx.pid`

从容关闭:

kill -QUIT `cat master.nginx.pid`

#从容的意思就是等所有的连接断开后,在关闭进程。


17. 与PHP FPM结合的配置

location ~ \.php$ {

fastcgi_pass 192.168.0.12:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;

include fastcgi_params;

}


在文件fastcgi_params中加入下面一行配置:

fastcgi_paramSCRIPT_FILENAME $document_root$fastcgi_script_name;

:此处也可以不加上面的一行配置,但是fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;这行中的/scripts需要改成php-fpm服务器上的文档的存放路径。