main 优化
1.调整参数隐藏nginx软件版本号
http {
……
server_tokens off;
……
}
2.更改nginx服务的默认用户
grep "#user" /opt/application/ngnix/nginx/conf/nginx.conf.default
#user nobody
(1).新建用户
useradd nginx -s /sbin/nologin -M
(2).修改nginx的配置文件
user nginx nginx
ps :或者在编译nginx的时候就指定用户和所属组
./configure --user=nginx --group=nginx ……
3.nginx 配置参数优化
搭建服务器时,worker进程数最开始的设置等于cpu的核数,高并发场合下可以考虑将进程数提高至cpu * 2,也可以再大点,根据具体的硬件和业务来调整。
#查看cpu的核心数
grep processor /proc/cpuinfo | wc -l
#编辑nginx的配置文件
vim nginx.conf
worker_processes 2;
4.绑定不同的nginx进程到不同的cpu上。
#编辑 nginx 的配置文件
vim nginx.conf
worker_processes 4;
#0001 0010 0100 1000是掩码,分别代表1,2,3,4核cpu。
worker_cpu_affinity 0001 0010 0100 1000;
ps: 配置该项过后,进行top命令查看cpu的负载情况,差别不是很大,nginx本身就会做这方面的优化。
events 优化
1.nginx事件处理模型选择
根据不同的系统选择不同的事件处理模型,可供选择有“kqueue | rstig | epoll | /dev/poll | select | poll ”
events {
use epoll;
}
#select ,poll 是标准的工作模式。kqueue ,epoll 是搞笑工作模式,epoll长用在linux平台,kqueue 常用在BSD系统。solaris系统中常用/dev/poll
2.单进程允许客户端最大连接数
events {
#默认是1024,可以修改大点,65535.
worker_connections 65535;
}
ps : 进程的最大连接数受linux系统的最大文件打开数限制,执行“ulimit -HSn 65535” 修改文件最大文件打开数。
3.worker 的最大文件打开数
worker_rlimit_nofile 该参数与系统优化执行“ulimit -HSn 65535”,后,保持一致。
events {
worker_connections 1024;
worker_rlimit_nofile 65535;
}
http配置块优化
1.优化服务器域名散列表大小
http {
server_names_hash_max_size 512; #默认是512,一般设置为cpu 以及缓存的4-5倍。
server_names_hash_bucket_size 128;
}
2.开启高效文件传输模式
http {
sendfile on ;
#防止网络及磁盘I/O阻塞。
tcp_nopush on;
}
3.nginx连接超时参数设置
http {
keeplive_timeout 3; #默认60s
tcp_nodelay on;
client_header_timeout 15s; #默认60s
client_body_timeout 15s; #默认60s
send_timeout 25s; #默认60s
}
4.上传文件大小限制
http {
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;
}
fastCGI参数配置优化
http{
fastcgi_connect_timeout 300; #默认60s
fastcgi_send_timeout 300; #默认60s
fastcgi_read_timeout 300; #默认60s
fastcgi_buffer_size 256k;
fastcgi_buffers 16 256k;
fastcgi_busy_buffers_size 512k;
fastcgi_temp_file_write_size 512k;
fastcgi_intercept_errors on;
#levels=2:2 设置目录层级,生成256*256个子目录 inactive默认失效时间,max_size 使用最大磁盘空间。
fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;
server {
listen 80;
server_name www.dnzhu-blog.com;
root html/blog;
location / {
root html/blog;
index index.php index.html index.htm;
}
location ~ .*\.(php|php5)?$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_cache ngx_fcgi_cache;
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; #设置请求几次后,响应被缓存
fastcgi_cache_use_stale error timeout invalid_header http_500; #在哪些情况下使用过期缓存
fastcgi_cache_key http://$host$request_uri;
}
}
}
nginx配置gzip 压缩性能优化
1.为什么要压缩
1.提升用户体验,发送的内容少,网页加载的快。
2.节省带宽成本。
2.压缩的对象
纯文本压缩比例比较高,最好进行压缩。如: html ,js,css ,xml, shtml等。
被压缩的内容必须大于1kb,极小的文件压缩后可能会更大。
图片,视频等文件尽量不压缩,这些文件大多数是经过压缩处理的,压缩大文件可能会消耗大量的cpu ,内存资源。
参数说明:
http {
gzip on; #开启压缩
gzip_min_length 1k; #允许压缩页面的最小字节数
gzip_buffers 4 16k; #压缩缓冲区大小
gzip_http_version 1.1; #压缩版本
gzip_comp_level 2; #压缩比率,1是压缩比例最小,处理速度最快,9是压缩比大,速度最慢
#支持的压缩类型
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on; #支持前端的缓存服务器缓存经过gzip压缩的页面。
}
nginx 配置expires缓存实现性能优化
expires功能就是允许通过nginx配置文件控制http的expires和cache-control响应头的内容。告送浏览器是否缓存和缓存多长时间。
(1).根据文件扩展名进行判断
location ~ .*\.(gif | jpg | jpeg | png | nmp | swf)$ {
expires 365d;
}
(2).缓存某个特定的文件
location ~(robots.txt) {
expires 7d;
break;
}
设置nginx缓存的两面性:涉及到缓存更新机制的问题
1).对于经常变动或更新的数据,缩短缓存周期。
2).网站改版或更新时,可以在服务器将缓存对象改名。同步参数控制不同的版本。
nginx 日志相关优化
(1).配置日志切割脚本
vim cut_nginx_log.sh
#!/bin/bash
cd /opt/application/nginx/nginx/logs && \ /bin/mv blog_access.log blog_access_$(date +%F -d -1day).log
/opt/application/ngnix/nginx/sbin/nginx -s reload
crontab -e
00 00 * * * /bin/sh /usr/local/cut_nginx_log.sh >/dev/null 2>&1
(2).不记录不需要的访问日志
如果日志写入太频繁,会占用大量的磁盘I/O,从而降低了服务器的性能。
location ~ .*\.(js | css | gif | jpg | jpeg | png | nmp | swf)$ {
access_log off ;
}
(3).访问日志权限设置
不需要在日志目录上给nginx用户可读可写权限,会有一定的安全隐患。
chown -R root.root /opt/application/nginx/nginx/logs
chmod -R 700 /opt/application/nginx/nginx/logs
限制IP访问
location / {
root html/blog;
index.index.php index.html index.htm;
deny 10.20.0.56;
allow 127.0.0.1/24;
allow 192.168.0.0/16;
allow 10.10.0.0/16;
deny all;
}
注意: deny 一定要加一个ip,否则调转到403。 对于allow的ip段,允许访问的段位从小到大排列。 24,代表子网掩码:255.255.255.0 16,代表子网掩码:255.255.0.0 8,代表子网掩码:255.0.0.0
nginx图片及目录防盗链
location ~* ^.+\.(js | css | gif | jpg | jpeg | png | nmp | rar | zip )$ {
valid_referers none blocked server_names *.dnzhu-blog.com dnzhu-blog.com;
if ($invalid_referer) {
rewrite ^/ http://www.dnzhu-blog.com;
}
access_log off;
root html/blog;
expires 1d;
break;
}
location /images {
root html/data/img;
valid_referers none blocked *.dnzhu-blog.com dnzhu-blog.com;
if ($invalid_referer) {
return 403;
}
}
优雅的显示错误页面
给一个tmall的demo:
error_page 500 501 502 503 504 https://err.tmall.com/error2.html
error_page 400 403 404 405 408 410 411 412 413 414 415 https://err.tmall.com/error1.html
nginx 企业网站集群超级安全设置
(1).动态web服务器集群 :目录权限755 ,文件权限644,所用的目录及文件的用户和组都是root。
(2).静态服务器集群 : 目录权限755,文件权限644,所用的目录及文件的用户和组都是root。
上传upload集群 : 禁止解析 .php /.sh 文件,程序目录:f 644 d755 root root ,上传目录: f 644 d755 web web 。
控制nginx并发连接数量
ngx_http_limit_conn_module 这个模块用于限制key的连接数。
语法:limit_conn_zone key zone=name:size;
上下文:http
语法:limit_conn num
上下文:http server location
1.限制单ip并发连接数
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
……
server {
……
location / {
……
limit_conn addr 1; #限制单ip的并发连接为1
}
}
}
2.限制虚拟主机总连接数
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn_zone $server_name zone=perserver:10m;
……
server {
……
location / {
……
#limit_conn addr 1; #限制单ip的并发连接为1
limit_conn perserver 2;设置虚拟主机的连接数为2
}
}
}
控制客户端请求nginx的速率
ngx_http_limit_req_module 模块用于限制每个ip访问key的请求速率。
语法:limit_req_zone key zone=name:size rate=rate;
上下文:http
语法:limit_req zone=name [burst=number] [nodelay]
上下文:http server location
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
#以客户端ip为key,one是内存区域名,分配10m空间,速率为1秒1次请求。
……
server {
……
location / {
……
limit_req one burst=5; #队列值为5,可以5个请求队列等待。
}
}
}