1 扩展名为.jpg,.gif.jpeg等文件交给nginx处理,而expires用来指定静态文件的过期时间,这里是30天
location ~ .*\.(gif|jpg|jpeg|png)$ {
root /web/wwwroot/www.ixdba.net;
expires 30d;
}
2 将upload和html下的所有文件交给nginx处理,upload和html目录包含在/web/wwwroot/www.ixdba.net下面
location ~ ^/(upload|html)/ {
root /web/wwwroot/www.ixdba.net;
expires 30d;
}
3 location是对此虚拟主机下动态网页的过滤处理,以下将所有.jsp为后缀的文件都交给本机的8080端口处理
location ~ .*.jsp$ {
index index.jsp;
proxy_pass http://localhost:8080;
}
4 检测配置文件配置是否正确
nginx/sbin/nginx -t 或者nginx/sbin/nginx -t -c /opt/nginx/conf/nginx.conf
-t 用于检查配置文件是否正确,-c用于指定配置文件路径
显示nginx的版本信息 nginx/sbin/nginx -v
显示nginx的版本信息以及编译参数相关信息 nginx/sbin/nginx -V
平滑重启nginx kill -HUP `cat /opt/nginx/logs/nginx.pid`
关闭nginx kill -QUIT `cat /opt/nginx/logs/nginx.pid`
重新打开一个日志文件 kill -USR1 `cat /opt/nginx/logs/nginx.pid`
平滑升级可执行程序 kill -USR2 `cat /opt/nginx/logs/nginx.pid`
5 负载均衡示例
http {
upstream myserver {
server 192.168.12.181:80 weight=3 max_fails=3 fail_timeout=20s;
server 192.168.12.182:80 weight=1 max_fails=3 fail_timeout=20s;
server 192.168.12.183:80 weight=4 max_fails=3 fail_timeout=20s;
}
server {
listen 80;
server_name www.domain.com 192.168.12.189;
index index.html index.htm;
root /ixda/web/wwwroot;
location / {
proxy_pass http://myserver;
proxy_next_upstream http_500 http_502 error timeout invalid_header;
include /opt/nginx/conf/proxy.conf;
}
}
}
先定义了一个负载均衡组myserver,通过loacation部分实现负载调度,proxy_pass指令指定后端代理服务器的地址和端口
proxy_next_upstream用来定义故障转移策略,当后端节点返回500,502,503,504和执行超时等错误时,自动将请求转发到upstream负载均衡组中的另一台服务器
inluce指令包含进的proxy文件内容为
proxy_redirect off;
proxy_set_header Host $host;#由后端服务器获取用户的主机名或真实ip地址,以及代理者的真实ip
proxy_set_header X-real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_body_buffer_size 128k;#客户端请求body缓冲区大小,可以理解为先保存到本地,再传递给用户
proxy_connect_timeout 90;#表示与后端服务器连接的超时时间,即发起握手等候响应的超时时间
proxy_send_timeout 90;#后端服务器数据到回传时间,即在规定时间内后端服务器必须传完所有数据,否则nginx将断开这个连接
proxy_read_timeout 90;#nginx从后端的服务器获取信息的时间,表示连接建立成功后,nginx等待后端服务器的响应时间,即nginx已经进入后端的排队之中等候处理的时间
proxy_buffer_size 4k;
proxy_buffer 4 32k;#缓冲区数量和大小,nginx从后端服务器获取到响应信息,会放置到缓冲区
proxy_busy_buffer_size 64k;#设置系统很忙时可以使用的proxy_bufer大小
proxy_temp_file_write_size 64k;#指定proxy缓存临时文件大小
6 防盗链设置
location ~* \.(gif|jpg|png|swf|flv|wma|asf|mp3)$ {
valid_referers none blocked *.ixdal.net ixdal.net;
if ($invalid_referer) {
rewrite ^/ http://www.ixda.net/img/error.gif;
#return 403;
}
location /images {
root /opt/nginx/html;
valid_referers none blocked *.ixdal.net ixdal.net;
if ($invalid_referer) {
return 403;
}
}
}
如果不是指定的地址格式,则跳转到rewrite指定的地址或者直接返回403错误
7 nginx日志分割
#!/bin/bash
savelog_path='/home/nginx/logs';
nglogs='/opt/nginx/logs';
mkdir -p $savelog_path/$(date +%Y)/$(date +m)
mv $nglogs/access.log $savelog_path/$(date +%Y)/$(date +%m)/access.$(date +%Y%m%d).log
mv $nglogs/error.log $savelog_path/$(date +%Y)/$(date +%m)/error.$(date +%Y%m%d).log
kill -USR1 `cat /opt/nginx/logs/nginx.pid`
8 nginx编译优化
8.1 nginx源码auto/cc/gcc文件,注释或删除掉如下两行
#debug
CFLAGS=" $CFLAGS -g"
8.2 编译参数
--with-cc-opt=' -O3'
--with-cpu-opt=CPU #CPU值为cat /proc/cpuinfo | grep "model name",如pentium,pentiumpro,pentium3,pentium4,athlon,opteron,amd64,sparcc32,sparc64,ppc64
8.2 内核参数
/etc/sysctl.conf
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.core.somaxconn = 262144
net.core.netdev_max_backlog = 252144
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keeplive_time = 30
vm.overcommit_memory=1
/sbin/sysctl -p使参数生效
net.ipv4.tcp_max_tw_buckets 设定timewait的数量,默认是180 000
net.ipv4.tcp_local_port_range 允许系统打开的端口范围
net.ipv4.tcp_tw_recycle 设定启动timewait快速回收
net.ipv4.tcp_tw_reuse 设置开启重用,允许将TIME-WAIT sockets重新用于新的tcp连接
net.ipv4.tcp_syncookies设置开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies进行处理
net.core.somaxconn默认值为128,用于调节系统同时发起的tcp连接数,在高并发的请求中,默认的值可能会导致连接超时或者重传,因此需要结合并发请求数来调节此值
net.core.netdev_max_backlog表示每个网络端口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目
net.ipv4.tcp_max_orphans设置系统中有多少个tcp套接字不被关联到任何一个用户文件句柄上,如果超过这个数字,孤立连接将立即被复位并打印出警告信息。这个限制只是为了防护简单的Dos攻击,不能过分依赖这个限制甚至人为减小这个值,更多的情况下应该增加这个值
net.ipv4.tcp_max_syn_bakclog记录那些尚未收到客户端确认信息的连接请求的最大值,对于128M内存的系统而言,此值为1024,小内存的系统则为128
net.ipv4.tcp_synack_retries内核放弃连接之前发送SYN+ACK包的数量
net.ipv4.tcp_fin_timeout套接字保持在FIN-WAIT-2状态的时间,默认值为60秒,正确设置这个值很重要,有时即使一个负载很小的web服务器,也会大量的死套接字而产生内存溢出的风险
net.ipv4.tcp_syn_retries内核在放弃连接之前发送SYN包的数量
如果发送端要求关闭套接字,net.ipv4.tcp_fin_timeout选项决定了套接字保持在FIN-WAIT-2状态的时间,接收端可以出错并永远不关闭连接,甚至意外宕机
net.ipv4.tcp_fin_timeout的默认值为60秒,需要注意,有时即使一个负载很小的web服务器,也会大量的死套接字而产生内存溢出的风险,FIN-WAIT-2的危险性比FIN-WAIT-1要小,因为它最大只消耗1.5KB的内存,但是其生存期长些。
net.ipv4.tcp_keepalive_time表示当keeplive启用的时候,TCP发送keeplive的频度,默认值为2(单位为小时)
vm.overcommit_memory指定内核针对内存分配的策略,可以为0,1,2
0,表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存
9 nginx配置支持php
server {
inlucde port.conf;
server_name www.ixdba.net ixdba.net;
location / {
index index.html index.php;
root /web/www/www.ixdba.net;
}
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCIPT_FIENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
通过咯擦提哦你指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理,这里到ip地址和端口就是FastCGI进程监听的IP地址和端口
fastcgi_param指令指定放置PHP动态程序的主目录,也就是$fastcgi_script_name前面指定的路径,这里是/root/local/nginx/html目录,建议这个目录与nginx虚拟主机指定的根目录保持一致,可以不一致
fastcgi_params文件是FastCGI进程的一个参数配置文件,在安装nginx后,会默认生成一个这样的文件,这里通过一个include指令将这个参数配置文件包含进来
FastCGI指令优化,将以下配置添加到nginx主配置文件中到Http层级
fastcgi_cache_path /usr/local/nginx/fastcgi_cache level=1:2 keys_zone=TEST:10m inactive=5m;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffer_size 128k;
fastcgi_temp_file_size 128k;
fastcgi_cache TEST;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_path为FastCGI缓存文件的路径和目录结构等级,关键字区域存储时间,以及非活动删除时间
fastcgi_connect_timeout连接到后端FastCGI的超时时间
fastcgi_send_timeout指定向FastCGI传送请求的超时时间,已经完成两次握手后向FastCGI传送请求的超时时间
fastcgi_read_timeout指定接收FastCGI应答的超时时间,已经完成两次握手后接收FastCGI应答的超时时间
fastcgi_buffer_size使用一个64KB的缓冲区读取应答的第一部分
fastcgi_buffers指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求
fastcgi_temp_file_size页面大于缓冲区缓存时,大于的部分会缓存到文件,这里指定缓存文件大小
fastcgi_cache表示开启FastCGI缓存并为其指定一个名称,开启缓存非常有用,可以有效降低cpu的负载,并且防止502错误的发生,但是开启缓存也会引起很多问题,要视情况而定
fastcgi_cache_valid用来指定应答代码的缓存时间,示例中表示将200,302应答缓存一个小时,将301应答缓存一天,其他缓存均缓存1分钟
10 nginx和tomcat搭配
server {
listern 80;
server_name www.ixdba.net;
root /web/www/html;
location /img/ {
alias /web/www/html/img;
}
location ~ (\.jsp)|(\.do)|(\.action) {
proxy_pass http://192.168.12.130:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remode_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;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
负载均衡配置
upstream mytomcats {
server 192.168.12.131:8000;
server 192.168.12.132:8080;
server 192.168.12.133:8090;
}
location ~ (\.jsp)|(\.do)|(\.action) {
proxy_pass http://mytomcats;
.....
}
注意,如果在location指令中使用正则表达式后再使用alias指令,nginx不支持