Linux下高并发socket最大连接数所受的各种限制1.修改用户进程可打开文件数限制 /etc/security/limits.conf nginx - nofile655352.Linux系统级的最大打开文件数限制 fs.file-max=188414 //和内存容量相关3.修改网络内核对TCP连接的有关限制 net.ipv4.ip_local_port_range=10244.限制接收新 TCP 连接侦听队列的大小 net.core.somaxconn=20485.启用tcp连接timewait快速回收和重用 net.ipv4.tcp_tw_recycle=1 net.ipv4.tcp_tw_reuse=1
vim nginx.conf3 worker_processes auto;#设定cpu核心自动分配3 worker_processes2;#设定只是用2个核心4 worker_cpu_affinity 0110;#进行cpu核心的绑定
vim nginx.conf events{14 worker_connections65535;#设定nginx的最大连接数15}vim /etc/security/limits.conf60 nginx - nofile65535#添加后即可生效使用热插拔模块在内存中立刻生效
切换到nginx用户查看最大打开文件数即可看到为65535
vim /usr/local/nginx.com28 sendfile on;#开启sendfile可以开启高效文件传输模式(zero copy 方式),避免内核缓冲区数据和用户缓冲区数据之间的拷贝。29 tcp_nopush on;#采用tcp_cork标准进行传输即客户的访问数据在Nginx的缓冲区域到达一定量的时候会进行发送有助于解决网络阻塞30 tcp_nodelay on;#此参数和tcp_nopush互斥可以开启nginx会自行兼容本身参数,表示将所有的数据有了不论是否填满缓冲区域立刻发送 tcp_nopush,tcp_nodelay,开启前提必须开启sendfile
三个指令都开启的好处是,sendfile可以开启高效的文件传输模式,tcp_nopush开启可以确保在发送到客户端之前数据包已经充分“填满”, 这大大减少了网络开销,并加快了文件发送的速度。 然后,当它到达最后一个可能因为没有“填满”而暂停的数据包时,Nginx会忽略tcp_nopush参数, 然后,tcp_nodelay强制套接字发送数据。所以三个都开启比开启单个效率更高
7 error_log logs/error.log info;#设定日至的存放为位置以及日志级别日志输出级别有 debug,info,notice,warn,error,crit 可供选择,其中debug输出日志最为详细crit(严重)输出日志最少。默认是error
该日志的采集格式暂时不支持自定义方式采集,但是可以分开存储方式集进行存储不同级别的日志
脚本示例
#!/bin/bashcd /usr/local/nginx/logs&&mv access.log access_$(date +%F -d -1day).logkill -USR1`cat /usr/local/nginx/logs/nginx.pid` 写好后加入creoutab定时任务中定时执行一次即可,日志文件所在的目录不需要给nginx用户权限 chmo -R700 /usr/local/nginx/logs
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 或空字符串,那么该请求不会写入日志。 |
日志采集格式的设定方式
$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二进制程序
\cp -f objs/nginx /usr/local/nginx/sbin/ngin#复制nginx二进制文件到sbin目录下同时保证系统不会读取这一步复制过去的文件所以要加\进行转译ps ax|grep nginx#获取主程pidkill -USR227867#使得原来的主程序不再获得新的请求kill -WINCH27867#使新版本的主程序开始接受请求
\cp -f objs/nginx /usr/local/nginx/sbin/nginx#将新版本的程序覆盖过去kill -HUP28120#唤醒原有进程kill -WINCH28149#停止新的进程kill -928121#新版本的worker已经没用了可以禁掉了
https://docs.nginx.com/nginx/admin-guide/security-controls/controlling-access-proxied-http/ 官方文档位置
http{ upstream westos{ sticky; server172.25.254.92:80; server172.25.254.93:80;} limit_conn_zone$binary_remote_addrzone=addr:10m;#在内存中开一个10M大小的区域使得访问数据可以被记录同时 server{ listen80; server_name www.westos.com; location /{ limit_conn addr10;#限制最大的并发连接数为10 limit_rate 50k;#限制下载的带宽速度为50k proxy_pass http://westos;}}}
上传一张图片可以尝试进行压力测试可以看到的效果更加直观,测试后并发量为10时可以完成1000的并发数10次的访问量,限制带宽后明显很慢
http{ upstream westos{ server172.25.0.93:80; server172.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;#limit_conn_zone $binary_remote_addr zone=addr:200m; sendfile on; tcp_nopush on; tcp_nodelay on; limit_req_zone$binary_remote_addrzone=one:10mrate=1r/s;#限制了同一个IP对与该服务器每一秒只能访问一次#keepalive_timeout 0; keepalive_timeout10;gzip on; server{ listen80; server_name localhost; charset utf-8; access_log logs/access.server.log. main; location /{ proxy_pass http://westos; limit_reqzone=one;#开启访问频次限制他功能在RS上#limit_conn addr 1; #以经限制访问频次最大连接数不必限制#limit_rate 50k; #访问带宽不必限制}
location ~ /\.ht{ deny all;#拒绝所有人访问 allow127.0.0.1;#允许本地回环环访问 allow172.25.0.90;#只允许某个IP访问固}}
location /status{ stub_status on;#开启监控模块 deny all; allow127.0.0.1; access_log off;#禁止访问监控模块时还进行日志的统计 error_log off;#禁止错误日志的统计}
server{ listen443 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/{#代理westos.org/后边的内容但是不会代理indx.php,直接代理index.php是有危险的 proxy_pass http://www.westos.org/index.php;} location ~ .*\.(gif|jpg|png)${#将网站的数据缓存到站点上节省网站服务端的带宽 expires 365d; root /www;}}