nginx优化
1)设置隐藏版本号:
[root@localhost 桌面]# vim /usr/local/nginx/conf/nginx.conf
http {
server_tokens off; //添加此行。
......
}
[root@localhost 桌面]# curl -I 192.168.4.205 #客户端访问,不显示版本号
HTTP/1.1 200 OK
Server: nginx //此处无版本号
2)更改nginx的默认用户
(默认是nobody,可以更改为一个特殊的用户,如:ngx,用户可以任意,但必须要存在,不要让其能登录且不让有家目录,此处为nginx,非特殊的)
在192.168.4.205上操作: //更改为nginx用户,但ps –elf 查看进程时,主进程还是root,worker进程是nginx。
方法1:修改配置文件
[root@localhost conf]# sed -i '1s#nobody#nginx#g' nginx.conf
[root@localhost conf]# cat /usr/local/nginx/conf/nginx.conf |head -1
user nginx;
3)配置nginx worker进程数,配置高并发
(192.168.4.205)并且让多个进程负载均衡,nginx的最大连接数计算
nginx的最大连接数=worker进程个数*单个进程的最大连接数
在高并发场景,我们需要事先启动更多的nginx进程以保证相应并处理用户的请求,但进程数太多了机器受不了,所以有个平衡点,建议:和cpu数量相等或是是cpu个数的2倍。
生产环境参数参考:
[root@localhost 桌面]# vim /usr/local/nginx/conf/nginx.conf
worker_processes 4; #默认是1,修改为等于cpu的个数或核数,或者是2倍
events {
worker_connections 65535; #单个work进程的最大连接数,默认是1024,有的到65535,太大
}
4)Nginx事件模型优化:(建议使用epoll模型)
Linux使用epoll事件模型更好点,epoll事件模型类似于以索引的方式去查找,提高效率。配置如下:
[root@localhost 桌面]# vim /usr/local/nginx/conf/nginx.conf
events {
worker_connections 65535;
use epoll; //添加,指定时间模型为epoll
}
5)优化Nginx服务器名字的hash表大小
配置文件中如果定义了非常长的域名、或大量的域名,就需要在http配置块调整server_names_hash_max_size和server_names_hash_bucket_size的值。(默认值都是32或64,一般默认的也不算小,如果小了会报错,这时可以把值调大些,可选优化,在http标签里面设置)
[root@localhost 桌面]# vim /usr/local/nginx/conf/nginx.conf
http {
server_names_hash_bucket_size 512; //添加,默认kb,生产参数:128
server_names_hash_max_size 512; //添加,默认kb
...............
}
6)设置Nginx的连接超时时间
keepalive_timeout 65; //设置客户端连接保持会话超时时间,超过该时间,服务器会关闭该连接.太大影响并发。客户端还没连接上服务器的超时。
client_header_timeout 15; //设置客户端请求头读取超时,如超返回408错误。客户端已经连接上服务器,但一直不发数据的超时。(请求header)
client_body_timeout 15; //设置客户端请求主体读取超时,如超时会有408错误。客户端已经连接上服务器,但一直不发数据的超时。(请求body)
send_timeout 300; //指定响应客户端的超时时间。如果超过该时间,客户端没有任何活动,nginx将关闭连接。
上面都是放在http标签里面即可。
7) Nginx设置fast-cgi调优(lnmp调用php时的参数,和php结合时)
fastcgi_connect_timeout 300; //指定连接到后端fast-cgi的超时时间(还未连接上fast-cgi,连接的超时)
fastcgi_send_timeout 300; //向fast-cgi传送请求的超时时间,(已经连接上fast-cgi,发送数据的超时)
fastcgi_read_timeout 300; //指接收fast-cgi应答的超时时间,(已经连接上fast-cgi)
fastcgi_buffer_size 64k; //指定读取fast-cgi应答第一部分需要用多大的缓冲区(1个64k的缓冲区)
fastcgi_buffer_size 4 64k; //指定读取fast-cgi应答第一部分需要用多大的缓冲区(4个64k的缓冲区)
fastcgi_busy_buffers_size 128k; //fast-cgi繁忙是buffer缓冲区给多大(128k)
fastcgi_temp_file_write_size 128k; //写入fast-cgi临时文件时用多大数据块(128k)
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
8)Nginx设置上传文件大小限制(动态应用)(和php结合时候)
client_max_body_size 10m; //客户端发送的最大内容的大小,根据业务调整。次参考为10M,如果是0就不检查,不限制。当然上传附件还受到php的限制,默认php配置文件中大小是2M,还需要修改一下值大小。
location ~ \.php$ {
root html;
...................
client_max_body_size 10m; //添加
}
9) Nginx设置gzip压缩功能
压缩文件可以减少带宽,提高效率,但是会消耗CPU,所以不是所有的东西都要压缩,只是把压缩比高的内容进行压缩(压缩比高的:文本、普通的数据文件、程序文件(js,css,html))
不要压缩的内容:图片、视频、flash,特别小的内容也不要压缩,可能越压越大。
gzip on; //释放压缩功能
gzip_min_length 1k; //压缩最小字节数,小于1k就不压缩了。建议设置成大于1k,小于1k可能越压越大。
gzip_buffers 4 16k; //压缩时候放在缓存里压缩,打开4个单位为16k的内存作为压缩结果流缓存。
gzip_comp_level 2; //压缩比率,用来指定压缩比,1比率最小,9压缩比最大,压缩比大的消耗cpu资源。
gzip_types text/plain application/x-javascript text/css application/xml; //指定压缩的类型
gzip_vary on; //让前端的缓存服务器缓存经过gzip压缩的页面。服务器压缩后先给前面缓存,这时先不解压,经过缓存后到最终客户才解压。
10) Nginx设置expires缓存功能 (expire过期)
在网站开发和运营中,对于图片、css,js等元素更改机会较少,特别是图片,这时可以将图片设置在浏览器本地缓存365天或更长,css,js,html等代码缓存10天,这样用户第一次打开页面后,会在本地的浏览器缓存相应的上述内容,这样的缓存可以提高下次用户打开类似页面的加载速度,并节省服务器的端大量的带宽。
设置expire好处:a)第一次访问以后,访问网站快,体验好。b)j节省网站带宽,节约成本。c)服务器压力降低,节约成本。
坏处:网站如果改版对应的用户看到的还是旧的。(包括:js,css,图片)
[root@localhost 桌面]# vim /usr/local/nginx/conf/nginx.conf
http {
................
server {
listen 80;
server_name bbs.etiantian.org;
location / {
root html;
index index.html index.htm;
}
.........................
location ~ .*\.(gif|jpg|png|bmp|swf)
{
expires 3650d; //图片expire过期时间设置为:10年
root html/bbs;
}
location ~ .*\.(js|css)?$
{
expires 30d; //js、css程序expire过期时间设置为:30天
root html/bbs;
}
}
}
11) Nginx设置防爬虫robot 和user_agent
[root@localhost 桌面]# vim /usr/local/nginx/conf/nginx.conf //防爬虫设置
http {
..................
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
if ($http_user_agent ~* "qihoobot|Babiduspider|Googlebot|Googlebot-Mobile|\
Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google| Yahoo! Slurp| \
Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot") //防止这些网站爬虫爬我的nginx网站
{
return 403;
}
}
}
12)在192.168.4.5上:nginx上配置防盗链技术。(返回403)
[root@localhost 桌面]# vim /usr/local/nginx/conf/nginx.conf
http {
................
server {
listen 80;
server_name www.baidu.com;
location / {
root baidu;
index index.html index.htm;
}
location /image { //该行也可换为:location ~*\.(jpg)$ {
root baidu;
valid_referers none blocked www.baidu.com;
if ($invalid_referer) {
return 403;
}
}
}
}
注意:上面的防盗链location匹配也可写成下面形式,下面形式比较全面,可以根据不同情况选择匹配即可。
location ~*\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
root baidu;
valid_referers none blocked www.baidu.com;
if ($invalid_referer) {
return 403;
}
}
13)nginx日志轮询切割优化(编写日志切割脚本)
[root@localhost 桌面]# vim /shell/cut_nginxlog.sh //编写日志切割脚本,以www虚拟主机为例
#!/bin/bash
cd /usr/local/nginx/logs/ && \
/bin/mv www.access.log www.access_$(date +%F -d -1day).log
/usr/local/nginx/sbin/nginx -s reload
[root@localhost 桌面]# crontab -l
00 00 * * * /bin/sh /shell/cut_nginxlog.sh >/dev/null 2>&1
14)nginx设置不记录不需要的访问日志
对于健康检查或某些图片,js,css的日志,一般不需要记录,因为在统计pv时是按照页面计算。而且日志写入频繁会消耗磁盘IO,降低服务性能。把下面内容加到server 虚拟主机里面就可以。
location ~ .*\.(js|jpg|JPG|JPEG|css|bmp|gif|GIF)$ {
access_log off;
}
15) nginx设置错误页面的优雅显示
[root@localhost 桌面]# vim /usr/local/nginx/conf/nginx.conf
location / {
root html;
index index.html index.htm;
}
error_page 404 /404.html; //默认,也可自己设计
error_page 500 502 503 504 /50x.html; //默认,也可自己设计
location = /50x.html {
root html;
}
16)nginx伪静态优化设置(具体实施,见单独的nginx伪静态项目)
把相应网站页面的nginx模块的rewrite规则内容粘贴到nginx站点目录的.htaccess文件中。(注意:也可是别的名字,如a,下面调用时要与此名字一致,上下一致就行,此处用这个名字可能要用一个功能。也可是其他名字)
[root@localhost 桌面]# vim /usr/local/nginx/bbs/.htaccess
rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last;
rewrite ^([^\.]*)/article-([0-9]+)-([0-9]+)\.html$ $1/portal.php?mod=view&aid=$2&page=$3 last;
rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
rewrite ^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
rewrite ^([^\.]*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3 last;
rewrite ^([^\.]*)/blog-([0-9]+)-([0-9]+)\.html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3 last;
rewrite ^([^\.]*)/(fid|tid)-([0-9]+)\.html$ $1/index.php?action=$2&value=$3 last;
rewrite ^([^\.]*)/([a-z]+[a-z0-9_]*)-([a-z0-9_\-]+)\.html$ $1/plugin.php?id=$2:$3 last;
if (!-e $request_filename) {
return 404;
}
修改nginx配置文件,调用上面的伪静态规则(rewrite规则)
[root@localhost 桌面]# vim /usr/local/nginx/conf/nginx.conf
http {
...............
server {
listen 80;
server_name bbs.etiantian.org;
location / {
root bbs;
index index.php index.html index.htm;
include /usr/local/nginx/bbs/.htaccess; //此处要和上面的对应,也可是别的名字,只要对应就行
}
location ~ \.php$ {
root bbs;
...................
}
}
}
wq
[root@localhost 桌面]# /usr/local/nginx/sbin/nginx -s reload
17) 限制来源IP访问(使用ngx_http_access_module限制)
禁止让某目录让外界访问,但允许某IP访问该目录且支持php解析。
如:
location ~ ^/oldboy/ {
allow 192.168.4.205;
deny all;
}
location ~ .*\.(php|php5)?$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
限制指定IP或IP段访问:
location / {
deny 192.168.4.205;
allow 192.168.4.0/24;
allow 172.10.10.0/34;
deny all;
}