架构师的成长之路初片~nginx优化篇

1:开启对页面的压缩处理

gzip on;                            //开启压缩
gzip_min_length 1000;                //小文件不压缩
gzip_comp_level 4;                //压缩比率
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
                                    //对特定文件压缩,类型参考mime.types

2:服务器内存缓存

http { 
open_file_cache          max=2000  inactive=20s;
        open_file_cache_valid    60s;
        open_file_cache_min_uses 5;
        open_file_cache_errors   off;
//设置服务器最大缓存2000个文件句柄,关闭20秒内无请求的文件句柄
//文件句柄的有效时间是60秒,60秒后过期
//只有访问次数超过5次会被缓存
} 

3:通过location实现动静分离,一个location匹配动态,一个location匹配其他所有页面

###修改默认首页为index.php###

location / {
            root   html;
            index  index.php index.html index.htm;
        }
...省略部分配置文件内容...
location ~ .php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            include        fastcgi.conf;

4:修改版本信息,并隐藏具体的版本号

http{
     server_tokens off;                            #在http下面手动添加这么一行
     … …
}

5:限制并发量,降低DDOS的攻击,但需要提供一个模块:

模块名: ngx_http_limit_req_module 

http{
… …
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    server {
        listen 80;
        server_name localhost;
        limit_req zone=one burst=5;
            }
}
解释:
  1. #备注说明:
  2. #limit_req_zone语法格式如下:
  3. #limit_req_zone key zone=name:size rate=rate;
  4. #上面案例中是将客户端IP信息存储名称为one的共享内存,内存空间为10M
  5. #1M可以存储8千个IP信息,10M可以存储8万个主机连接的状态,容量可以根据需要任意调整
  6. #每秒中仅接受1个请求,多余的放入漏斗
  7. #漏斗超过5个则报错

6:拒绝非法的请求:由于网站使用的是http协议,协议中定义了N中方法,可以放用户连接服务器,获取的资源。但实际应用中,常用到的只是get和post

配置:

http{
       server {
                 listen 80;
#这里,!符号表示对正则取反,~符号是正则匹配符号
#如果用户使用非GET或POST方法访问网站,则retrun返回错误信息
              if ($request_method !~ ^(GET|POST)$ ) {
                     return 444;
               }    
        }

7:防止buffer溢出

  --当客户端连接服务器时,服务器会启用各种缓存,用来存放连接的状态信息。

  --如果攻击者发送大量的连接请求,而服务器不对缓存做限制的话,内存数据就有可能溢出(空间不足)

 修改Nginx配置文件,调整各种BUFFER参数,可以有效降低溢出风险。

http{
client_body_buffer_size  1k;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
 … …
}

8:线程和ulimit的优化

worker_processes 8;    nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu计为8)。
worker_connections 65535;    这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。
修改ulimit
echo ulimit -n 65535 >>/etc/profile
source /etc/profile              #加载修改后的profile
验证: ulimit -n    //如若显示65536,则表示修改成功



ulimit -HSn 65536 #硬资源和软资源同时限制为最大打开文件描述符数65546 ulimit -v ulimited #将虚拟内存限制改为无限制
ulimit命令
-H 使用硬资源控制
-S 使用软资源控制
-a 查看所有的当前限制
-n 能打开的最大文件描述符数
-t 限制最大的 CPU 占用时间(每秒)
-u 限制最大用户进程数
-v 限制虚拟内存大小(kB

优化官网有详细的解释:

http://nginx.org/en/download.html

 ------------------------------------

上面优化是工作中经常使用的优化手段,具体的参数可根据服务器具体情况来写相应的参数。

内核优化,是借鉴下面链接,详细参数点击下方链接即可。 

8:内核的优化(具体看服务器的状况来决定是否进行相应的优化)

sysctl.conf文件

https://blog.51cto.com/yangrong/1321594

# 内核panic时,1秒后自动重启

kernel.panic = 1



# 允许更多的PIDs (减少滚动翻转问题); may break some programs 32768

kernel.pid_max = 32768



# 内核所允许的最大共享内存段的大小(bytes)

kernel.shmmax = 4294967296



# 在任何给定时刻,系统上可以使用的共享内存的总量(pages)

kernel.shmall = 1073741824



# 设定程序core时生成的文件名格式

kernel.core_pattern = core_%e



# 当发生oom时,自动转换为panic

vm.panic_on_oom = 1



# 表示强制Linux VM最低保留多少空闲内存(Kbytes)

vm.min_free_kbytes = 1048576



# 该值高于100,则将导致内核倾向于回收directory和inode cache

vm.vfs_cache_pressure = 250



# 表示系统进行交换行为的程度,数值(0-100)越高,越可能发生磁盘交换

vm.swappiness = 20



# 仅用10%做为系统cache

vm.dirty_ratio = 10



# 增加系统文件描述符限制 2^20-1

fs.file-max = 1048575



# 网络层优化

# listen()的默认参数,挂起请求的最大数量,默认128

net.core.somaxconn = 1024



# 增加Linux自动调整TCP缓冲区限制

net.core.wmem_default = 8388608

net.core.rmem_default = 8388608

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216



# 进入包的最大设备队列.默认是300

net.core.netdev_max_backlog = 2000



# 开启SYN洪水攻击保护

net.ipv4.tcp_syncookies = 1



# 开启并记录欺骗,源路由和重定向包

net.ipv4.conf.all.log_martians = 1

net.ipv4.conf.default.log_martians = 1



# 处理无源路由的包

net.ipv4.conf.all.accept_source_route = 0

net.ipv4.conf.default.accept_source_route = 0



# 开启反向路径过滤

net.ipv4.conf.all.rp_filter = 1

net.ipv4.conf.default.rp_filter = 1



# 确保无人能修改路由表

net.ipv4.conf.all.accept_redirects = 0

net.ipv4.conf.default.accept_redirects = 0

net.ipv4.conf.all.secure_redirects = 0

net.ipv4.conf.default.secure_redirects = 0



# 增加系统IP端口限制

net.ipv4.ip_local_port_range = 9000 65533



# TTL

net.ipv4.ip_default_ttl = 64



# 增加TCP最大缓冲区大小

net.ipv4.tcp_rmem = 4096 87380 8388608

net.ipv4.tcp_wmem = 4096 32768 8388608



# Tcp自动窗口

net.ipv4.tcp_window_scaling = 1



# 进入SYN包的最大请求队列.默认1024

net.ipv4.tcp_max_syn_backlog = 8192



# 打开TIME-WAIT套接字重用功能,对于存在大量连接的Web服务器非常有效。 

net.ipv4.tcp_tw_recycle = 1 

net.ipv4.tcp_tw_reuse = 0  



# 表示是否启用以一种比超时重发更精确的方法(请参阅 RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项

net.ipv4.tcp_timestamps = 0



# 表示本机向外发起TCP SYN连接超时重传的次数

net.ipv4.tcp_syn_retries = 2

net.ipv4.tcp_synack_retries = 2



# 减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接。 

net.ipv4.tcp_fin_timeout = 10  



# 减少TCP KeepAlive连接侦测的时间,使系统可以处理更多的连接。 

# 如果某个TCP连接在idle 300秒后,内核才发起probe.如果probe 2次(每次2秒)不成功,内核才彻底放弃,认为该连接已失效.

net.ipv4.tcp_keepalive_time = 300 

net.ipv4.tcp_keepalive_probes = 2

net.ipv4.tcp_keepalive_intvl = 2



# 系统所能处理不属于任何进程的TCP sockets最大数量

net.ipv4.tcp_max_orphans = 262144



# 系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。

net.ipv4.tcp_max_tw_buckets = 20000 



# arp_table的缓存限制优化

net.ipv4.neigh.default.gc_thresh1 = 128

net.ipv4.neigh.default.gc_thresh2 = 512

net.ipv4.neigh.default.gc_thresh3 = 4096
原文地址:https://www.cnblogs.com/ahaocloud/p/14823944.html