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服务器上的文档的存放路径。