前言
一、Nginx高并发
Linux下高并发socket最大连接数所受的各种限制
1.修改用户进程可打开文件数限制
/etc/security/limits.conf
nginx - nofile 65535
2.Linux系统级的最大打开文件数限制
fs.file-max = 188414 //和内存容量相关
3.修改网络内核对TCP连接的有关限制
net.ipv4.ip_local_port_range = 1024
4.限制接收新 TCP 连接侦听队列的大小
net.core.somaxconn = 2048
5.启用tcp连接timewait快速回收和重用
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
1.cpu核心数的优化
vim nginx.conf
3 worker_processes auto;
3 worker_processes 2;
4 worker_cpu_affinity 01 10;
2.最大连接数的优化
vim nginx.conf
events {
14 worker_connections 65535;
15 }
vim /etc/security/limits.conf
60 nginx - nofile 65535
切换到nginx用户查看最大打开文件数即可看到为65535
3.网络阻塞
vim /usr/local/nginx.com
28 sendfile on;
29 tcp_nopush on;
30 tcp_nodelay on;
tcp_nopush,tcp_nodelay,开启前提必须开启sendfile
三个指令都开启的好处是,sendfile可以开启高效的文件传输模式,tcp_nopush开启可以确保在发送到客户端之前数据包已经充分“填满”, 这大大减少了网络开销,并加快了文件发送的速度。 然后,当它到达最后一个可能因为没有“填满”而暂停的数据包时,Nginx会忽略tcp_nopush参数, 然后,tcp_nodelay强制套接字发送数据。所以三个都开启比开启单个效率更高
4.erro日志存放位置设定
7 error_log logs/error.log info;
该日志的采集格式暂时不支持自定义方式采集,但是可以分开存储方式集进行存储不同级别的日志
脚本示例
#!/bin/bash
cd /usr/local/nginx/logs && mv access.log access_$(date +%F -d -1day).log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
写好后加入creoutab定时任务中定时执行一次即可,日志文件所在的目录不需要给nginx用户权限
chmo -R 700 /usr/local/nginx/logs
5.访问日志的控制方式
location ~ .*\.(js|jpg|jpeg|png|css|bmp|gif)$ {
access_log off;
}
参数 | 作用 |
---|
main | 指定日志的采集格式 | gzip | 指定使用gzip的方式进行日志的压缩,压缩比率分为1-9默认为1压缩越高速度越慢 | buffer=32k | 指定日志写入时缓存数据为32K默认为64K | flush | 设置缓存的有效时间。如果超过 flush 指定的时间,缓存中的内容将被清空 | if | if 条件判断。如果指定的条件计算为 0 或空字符串,那么该请求不会写入日志。 |
6.日志的采集格式设定
日志采集格式的设定方式
$remote_addr 客户端地址
$remote_user 客户端用户名称
$time_local 访问时间和时区
$request 请求的URI和HTTP协议
$status HTTP请求状态
$body_bytes_sent 发送给客户端文件内容大小
$http_referer url跳转来源
$http_user_agent 用户终端浏览器等信息
$http_host 请求地址,即浏览器中你输入的地址(IP或域名)
$request_time 处理请求的总时间,包含了用户数据接收时间
$upstream_response_time 建立连接和从上游服务器接收响应主体的最后一个字节之间的时间
$upstream_connect_time 花费在与上游服务器建立连接上的时间
$upstream_header_time 建立连接和从上游服务器接收响应头的第一个字节之间的时间
二、平滑升级Nginx以及版本回退
1.平滑升级
重新制作一个新Nginx二进制程序
\cp -f objs/nginx /usr/local/nginx/sbin/ngin
ps ax | grep nginx
kill -USR2 27867
kill -WINCH 27867
2.版本回退
\cp -f objs/nginx /usr/local/nginx/sbin/nginx
kill -HUP 28120
kill -WINCH 28149
kill -9 28121
三、Nginx配置详解
1.Nginx对于访问流量的限制
https://docs.nginx.com/nginx/admin-guide/security-controls/controlling-access-proxied-http/
官方文档位置
http {
upstream westos{
sticky;
server 172.25.254.92:80;
server 172.25.254.93:80;
}
limit_conn_zone $binary_remote_addr zone=addr:10m;
server{
listen 80;
server_name www.westos.com;
location / {
limit_conn addr 10;
limit_rate 50k;
proxy_pass http://westos;
}
}
}
上传一张图片可以尝试进行压力测试可以看到的效果更加直观,测试后并发量为10时可以完成1000的并发数10次的访问量,限制带宽后明显很慢
2.对于当个IP的高频次访问控制
http {
upstream westos {
server 172.25.0.93:80 ;
server 172.25.0.94:80 ;
}
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
keepalive_timeout 10;
gzip on;
server {
listen 80;
server_name localhost;
charset utf-8;
access_log logs/access.server.log. main;
location / {
proxy_pass http://westos ;
limit_req zone=one;
}
3.nginx的访问控制
location ~ /\.ht {
deny all;
allow 127.0.0.1 ;
allow 172.25.0.90 ;
}
}
4.监控模块的设开启以及设定
location /status {
stub_status on;
deny all ;
allow 127.0.0.1 ;
access_log off;
error_log off;
}
5.nginx对https搭建方式、重定向功能以及php网页缓存的构建方式
server {
listen 443 ssl;
server_name localhost;
ssl_certificate cert.pem;
ssl_certificate_key cert.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location /westos.org/ {
proxy_pass http://www.westos.org/index.php;
}
location ~ .*\.(gif|jpg|png)$ {
expires 365d;
root /www;
}
}
总结
|