Nginx软件优化
1、隐藏nginx版本信息
1、配置 # cat nginx.conf server_tokens off; #隐藏版本号 2、官网 http://nginx.org/en/docs/http/ngx_http_core_module.html#server_tokens 3、测试 # curl -I 127.0.0.1 Server: nginx
2、修改nginx版本信息
1、修改源码内核信息 # vim src/core/nginx.h 13 #define NGINX_VERSION "1.0" 14 #define NGINX_VER "clsn/" NGINX_VERSION 22 #define NGINX_VAR "clsn" 2、修改头部信息 # vim src/http/ngx_http_header_filter_module.c 49 static char ngx_http_server_string[] = "Server: clsn" CRLF; 3、修改错误页显示 # vim src/http/ngx_http_special_response.c 28 static u_char ngx_http_error_tail[] = 29 "<hr><center> clsn </center>" CRLF 4、重新编译 # ./configure --prefix=/opt/nginx --user=www --group=www 5、测试 # curl -I 127.0.0.1 Server: clsn
3、修改worker进程的用户
方法1: # useradd -s /sbin/nologin -M www # ./configure --user=www --group=www 方法2: # cat nginx.conf user www www; 官方:http://nginx.org/en/docs/ngx_core_module.html#user
4、设置文件的上传大小
# cat nginx.conf
http { client_max_body_size 8m; #默认1M }
#### context:http,server,location #可放置的位置
5、访问控制
1、禁止访问指定的信息 # cat nginx.conf location ~ ^/images/.*\.(php|php5|sh|pl|py|html)$ { deny all; } location ~ ^/static/.*\.(php|php5|sh|pl|py)$ { deny all; } location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$ { deny all; } 2、禁止访问并跳转 # cat nginx.conf location ~* \.(txt|doc)$ { if (-f $request_filename){ root /data/www/www; rewrite ^/(.*) http://www.baidu.com/$1 permanent; break; #重写后停止,不再匹配 } } 3、禁止ip地址访问 # cat nginx.conf location / { deny 192.168.1.1; allow 192.168.1.0/24; deny all; } # cat nginx.conf if ($remote_addr = 10.0.0.7 ){ return 403; }
6、 禁止非法域名解析访问
方法1: # cat nginx.conf server { listen 80; server_name - ; #配置虚拟主机区块 return 501; } 方法2: # cat nginx.conf server { listen 80 default_server; server_name _; rewrite ^(.*) http://www.abc.com/$1 permanent; }
方法3:
# cat nginx.conf
server { if ($host !~ ^www\.abc\.com$) { rewrite ^(.*) http://www.abc.com/$1 permanent; }
}
7、防盗链
利用referer,实现防盗链 # cat nginx.conf location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ { valid_referers none blocked server_names *.abc.com abc.com; if ($invalid_referer){ #rewrite ^/ http://www.abc.com/123.jpg; #不推荐,增加服务器负担 return 403; } }
8、修改错误页面
1、403自动跳转 # cat nginx.conf error_page 403 /403.html; #当出现403时,自动跳转到根目录页面 2、500自动跳转 # cat nginx.conf error_page 500 502 503 504 /50x.html; location = /50x.html { root /data/html; #单独目录 } 3、改状态码 # cat nginx.conf error_page 404 =200 /empty.gif; location / { root /data/www/bbs; fastcgi_intercept_errors on; #开启自定义错误页面 error_page 404 =200 /ta.jpg; } 4、错误状态码重定向 # cat nginx.conf error_page 404 https://www.qq.com; #当出现404时,自动跳转到指定的网址
9、Nginx目录权限优化
服务器角色 |
权限处理 |
安全系数 |
|
|
|
动态Web集群 |
目录权限755 文件权限644 所用的目录,以及文件用户和组都是root |
环境为Nginx+PHP 文件不能被改,目录不能被写入,安全系数10 |
static图片集群 |
目录权限755 文件权限644 所用的目录,以及文件用户和组都是root |
环境为Nginx 文件不能被改,目录不能被写入,安全系数10 |
上传upload集群 |
目录权限755 文件权限644 所用的目录,以及文件用户和组都是root |
特别:用户上传的目录设置为755,用户和组使用Nginx服务配置的用户 文件不能被改,目录不能被写入,但是用户上传的目录允许写入文件且需要通过Nginx的其他功能来禁止读文件,安全系数8 |
10、Nginx防爬虫优化
方法1:阻止下载协议代理 # cat nginx.conf if ($http_user_agent ~* LWP::Simple|BBBike|wget) { return 403; } 方法2:禁止爬虫的ua代理访问网站 # cat nginx.conf if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Yahoo!Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot") { return 403; }
11、限制HTTP的请求方法
# cat nginx.conf
if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 501; }
12、 使用普通用户启动nginx
1、创建普通用户 # useradd test # chown -R test /opt/nginx 2、修改配置,普通用户不能使用1024一下端口 $ cat nginx.conf server { listen 8080; server_name www.abc.com; root /home/nginx/blog/html; location / { index index.html index.htm; } 3、普通用户启动 $ /opt/nginx/sbin/nginx -t $ /opt/nginx/sbin/nginx $ /opt/nginx/sbin/nginx -c /opt/nginx/conf/nginx.conf
13、优化worker进程个数
1、nginx两个重要进程 master进程:控制nginx服务的启动、停止、重启 worker进程:处理用户请求信息 2、修改worker进程数 # cat nginx.conf worker_processes 1; #推荐worker数==cpu核数 3、查看cpu核数 # top 按1 # lscpu |grep CPU # grep processor /proc/cpuinfo
14、nginx绑定到不同的CPU上
1、4个worker进程绑定CPU # cat nginx.conf worker_processes 4; #4个进程 worker_cpu_affinity 0001 0010 0100 1000; #绑定4个核数 2、8个worker进程绑定CPU # cat nginx.conf worker_processes 8; worker_cpu_affinity 0001 0010 0100 1000 0001 0010 0100 1000; worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; 3、4个worker进程绑定2个cpu核数 # cat nginx.conf worker_processes 4; worker_cpu_affinity 0101 1010;
15、优化nginx事件处理模型
# cat nginx.conf
use epoll; #使用epoll模型处理
16、修改nginx单个进程最大连接数
1、查看nginx打开文件数 # lsof -i:80 2、查看系统打开文件数 # ulimit -a 3、修改最大连接数方法 # cat nginx.conf events #Nginx的工作模式及连接数上限 { worker_connections 1024; #单个进程的连接数,不超过系统打开文件数 }
4、修改worker进程打开文件数
# cat nginx.conf
worker_rlimit_nofile 2048;
5、其他
# cat nginx.conf
server_names_hash_bucket_size; #服务器名字的hash表大小
17、优化nginx高效文件传输模式
方法1:
# cat nginx.conf
sendfile on; #开启高效文件传输模式
tcp_nopush; #数据包积攒到一定量时,再进行传输
方法2:
# cat nginx.conf
sendfile on;
tcp_nodelay; #默认方式,不管大小多少,只要有数据包,就进行传输
18、nginx超时参数
# cat nginx.conf keepalive_timeout 75; #应用在长连接,连接超时时间,连接会话保持,超时时间 client_header_timeout 60; #客户端发送请求,间隔时间,读取客户端请求头信息,超时时间 client_body_timeout 60; #服务端回应请求,间隔时间,读取客户端主体信息,超时时间 send_timeout 60s; #客户端回应请求,间隔时间,回应客户端,超时时间
19、gzip压缩
# cat nginx.conf gzip on; #开启gzip压缩功能 gzip_min_length 1k; #压缩最小字节数,默认0,从header的Content-Length中获取 gzip_buffers 4 16k; #压缩缓冲区大小,4:缓存空间的个数,16k:每个缓存空间的大小 gzip_http_version 1.1; #压缩版本,默认1.1 gzip_comp_level 4; #压缩级别,1压缩比最小,最快,9压缩比最大,最慢 gzip_types text/css text/xml; #压缩类型,以空格分隔 gzip_vary on; #给代理服务器加vary标识,客户端浏览器是否要压缩,IE6不支持gzip ##官网:http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip
20、expires缓存
# cat nginx.conf location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires max; #缓存10年 root html/blog; } location ~ .*\.(js|css)$ { expires 30d; #缓存30天 root html/blog; } location / { expires -1; #不缓存,永久过期 }
##ms(毫秒),s(秒),m(分钟),h(小时),d(天),w(周), M(月),y(年)
21、配置FastCGI优化
fastcgi_connect_timeout 60; #连接超时时间,默认60秒,连接越多,消耗越大 fastcgi_send_timeout 240; #请求之间的间隔超时时间 fastcgi_read_timeout 240; #接收应答的超时时间 fastcgi_buffer_size 64k; #读取应答头信息,缓冲区大小 fastcgi_buffers 4 64k; #缓冲区数量及大小 fastcgi_busy_buffers_size 128k; #繁忙时的缓冲区大小,推荐fastcgi_buffer的两倍, fastcgi_temp_file_write_size 128k; #临时文件大小,太小会报502 fastcgi_temp_path /data/ngx_fcgi_tmp; #临时文件路径 fastcgi_cache ngx_fcgi_cache; #开启缓存并指定名称 fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g; 缓存路径 生成256*256子目录 缓存名及大小 缓存时间 最大容量 fastcgi_cache_valid 200 302 1h; #状态200、302,缓存1小时 fastcgi_cache_valid 301 1d; #状态301,缓存1天 fastcgi_cache_valid any 1m; #任意状态码,缓存1分钟 fastcgi_cache_min_uses 1; #请求1次就缓存 fastcgi_cache_use_stale error http_500; #错误状态码,不缓存 fastcgi_cache_key http://$host$request_uri; #设置缓存key,host域名),request_uri(请求的路径) ###官网:http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache
22、日志切割
# cat nginx_log.sh #!/bin/bash nginx_dir=/application/nginx cd $nginx_dir/logs /bin/mv access.log access_$(date +%F -d -1day).log $nginx_dir/sbin/nginx -s reload
# crontab -l
00 00 * * * /bin/sh /data/scripts/nginx_log.sh > /dev/null 2>&1
23、查看软件编译时的参数
查看软件编译时的参数 1、查看nginx参数 # nginx -V 2、查看apache参数 # apachectl -V #查看安装时编译信息,但显示的不全 3、查看mysql参数 # grep CONFIGURE_LINE /app/mysql/bin/mysqlbug #二进制安装方式,查看不到 4、查看php参数 # ./bin/php -i | grep configure
24、防DOS攻击
控制IP或域名的访问次数
# cat nginx.conf limit_conn_zone $binary_remote_addr zone=test:10m; #定义10M内存及名称,限制ip limit_conn_zone $binary_remote_addr zone=test1:10m rate=2r/s; #同个ip,1秒请求2次 limit_conn_zone $server_remote_addr zone=test2:10m; #定义10M内存及名称,限制虚拟主机 server { limit_conn test 10; #限制客户端ip连接数10 limit_req zone=test1 burst=5 nodelay; #burst:队列长度,nodelay:不延时 limit_conn test2 100; #限制虚拟主机处理并发数100 limit_rate 100k; #对每个连接限速100k }
25、配置nginx用户和密码
1、修改配置文件 # cat nginx.conf location /phpmyadmin/ { auth_basic "Please input password"; #验证提示 auth_basic_user_file /home/nginx/passwd; #用户和密码文件 } 2、创建用户和密码 # htpasswd -cb /home/nginx/passwd admin 123456 # cat /home/nginx/conf/htpasswd admin:Pl80EhiC2Z/5I # chmod 400 /home/nginx/passwd # chown nginx /home/nginx/passwd
QQ:328864113 微信:wuhg2008