1、open file(调整同时打开文件数量)的限制 使用命令ulimit -a可以查看
修改在 vim /etc/security/limits.conf
文件最后输入
建议配置:注意open file建议不超过65535
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535
注意:
root :指定用户,如对所有用户,则写 *
soft:软限制
hard:硬件限制
nofile 是代表最大文件打开数
2、内核的配置修改
在文件 /etc/sysctl.conf
内 修改后 使用命令 sysctl -p 生效
net.ipv4.tcp_syncookies = 0
# 此参数是为了防止洪水攻击的,但对于大并发系统,要禁用此设置
net.ipv4.tcp_max_tw_buckets = 6000
# timewait的数量,默认是180000。可以不修改
net.ipv4.tcp_tw_recycle = 1
# 是否加速TIME_WAIT的sockets的回收,默认为0。
net.ipv4.tcp_tw_reuse = 1
# 是否可将TIME_WAIT状态的sockets用于新的TCP连接,默认为0。
net.core.somaxconn = 20480
# 定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数。默认是128 优化可以根据系统配置做优化。不更改uwsgi的监听队列不能大于这个值
net.ipv4.ip_local_port_range = 1024 65000
# 允许系统打开的端口范围,这表明将系统对本地端口范围限制设置为1024~65000之间。注意,最小值必须大于或等于1024;最大值则应小于或等于65535。
net.ipv4.ip_conntrack_max = 20480
# 这表明将系统对最大跟踪的TCP连接数限制设置为20480。请注意,此限制值要尽量小,以节省对内核内存的占用。
net.ipv4.tcp_max_syn_backlog = 20480
# 定义SYN_RECV状态队列的数量,一般默认值为512或者1024,即超过这个数量,系统将不再接受新的TCP连接请求,一定程度上可以防止系统资源耗尽。可根据情况增加该值以接受更多的连接请求。
注意:swap空间使用
推荐的配置:
修改 /etc/sysctl.conf 增加以下内容
net.ipv4.tcp_syncookies = 0 # 注意查看是否和原有的冲突
# net.ipv4.tcp_max_tw_buckets = 18000 # 使用默认即可
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.core.somaxconn = 20480
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.ip_conntrack_max = 20480
net.ipv4.tcp_max_syn_backlog = 20480
其他云服务器的推荐配置
Tencent server:
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 0
kernel.msgmnb = 65536
kernel.msgmax = 65536
net.ipv4.conf.all.promote_secondaries = 1
net.ipv4.conf.default.promote_secondaries = 1
net.ipv6.neigh.default.gc_thresh3 = 4096
net.ipv4.neigh.default.gc_thresh3 = 4096
kernel.softlockup_panic = 1
kernel.sysrq = 1
kernel.numa_balancing = 0
kernel.shmmax = 68719476736
kernel.printk = 5
ali server:
vm.swappiness = 0
net.ipv4.neigh.default.gc_stale_time=120
# see details in https://help.aliyun.com/knowledge_detail/39428.html
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_announce=2
# see details in https://help.aliyun.com/knowledge_detail/41334.html
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
kernel.sysrq=1
3、nginx配置
# 配置用户 推荐使用安装时默认即可
user nginx;
# 工作进程数(建议跟CPU的核数量一致) 推荐使用auto即可
worker_processes auto;
# 设置自动绑定cpu,目的是将进程分配到指定cpu
worker_cpu_affinity auto;
# 设置可由工作进程打开的同时连接的最大数量(不能超过系统设置的最大值)
worker_rlimit_nofile 65535;
# 进程文件 默认即可
pid /run/nginx.pid;
# 包含其他的配置
include /etc/nginx/modules-enabled/*.conf;
events {
# 工作模式(多路IO复用方式)
use epoll;
# 每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes * worker_connections
worker_connections 1024;
# 是否同时接受多个新的网络连接请求
multi_accept on;
# 设置网路连接序列化,是否防止惊群现象发生
accept_mutex on;
}
# HTTP服务器相关配置
http {
# 日志格式
# 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 off;表示关闭访问日志
access_log /var/log/nginx/access.log main;
# 错误日志 默认即可 彻底关闭的配置error_log /dev/null;常见的错误日志级别有debug|info|notice|warn|error|crit|alert|emerg,级别越高记录的信息越少
error_log /var/log/nginx/error.log crit;
# 是否启用文件快速传输 开启高效文件传输模式 用sendfile传输文件时有利于改善性能
sendfile on;
# 是否缓存数据后集中发送,适用于大文件传输
tcp_nopush on;
# 是否立即发送数据包,使用于即时性传输 禁用Nagle来解决交互性问题
tcp_nodelay on;
# 是否隐藏nginx版本号 默认即可
# server_tokens off;
# 客户端保持连接时间 可以禁用用来提高并发
keepalive_timeout 30;
# types_hash_max_size影响散列表的冲突率。types_hash_max_size越大,就会消耗更多的内存,但散列key的冲突率会降低,检索速度就更快
types_hash_max_size 2048;
# 包含MIME类型的配置
include /etc/nginx/mime.types;
# 默认使用二进制流格式
default_type application/octet-stream;
# 开启gzip压缩
gzip on;
# 一下gzip配置一般默认即可
# 不压缩临界值,大于1K的才压缩
# gzip_min_length 1k;
# 指定申请缓存空间的个数和每个空间的大小
# gzip_buffers 16 8k;
# 设置压缩的最低HTTP版本,默认是1.1
# gzip_http_version 1.0;
# 压缩级别,1-10,数字越大压缩的越好,时间也越长,根据实际情况调整;默认是 1
# gzip_comp_level 2;
# 指定压缩的 MIME 类型
# gzip_types text/plain application/x-javascript text/css application/xml image/gif image/png;
# 表示不对IE6进行Gzip压缩,因为IE6支持的不友好
# gzip_disable "MSIE [1-6]\.";
# 包含其他配置文件 默认即可
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
# 一般情况下下面的配置都会按项目放在单独的配置文件中
# 定义一个简单负载均衡 指定权重方式
upstream test {
# weight表示权重,max_fails允许失败的次数 超过次数认为宕机,fail_timeout设置超时时间,当超时60秒时认为失败
server 127.0.0.1:8000 weight=1 max_fails=3 fail_timeout=60;
server 127.0.0.1:8001 weight=1 max_fails=3 fail_timeout=60 down; # down表示该server不参与负载均衡
}
# 定义一个简单负载均衡 ip_hash方式
upstream mycom {
ip_hash;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}
server {
# 指定监听端口
listen 80;
# 指定监听地址或域名 默认为_
server_name _;
# 指定根目录
root /usr/share/nginx/html;
# 指定请求体的大小
client_max_body_size 20M;
# 包含项目的Nginx配置文件
include /etc/nginx/default.d/*.conf;
location ~*^.+$ { # 请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
# root path; # 根目录
# index vv.txt; # 设置默认页
proxy_pass http://127.0.0.1:8000; # 请求转发给本地8000端口处理
# proxy_pass http://test; # 使用http代理 将所有请求转发给负载均衡test处理
# deny 127.0.0.1; # 拒绝的ip
# allow 172.18.5.54; # 允许的ip
# 地址重定向 break本条规则匹配完成后终止,不在匹配任何规则,redirect返回302临时重定向,permanent返回301永久重定向
# rewrite ^/api/(.*) /$1 break;
# 下面这段在反向代理时 用来设定被代理服务器接收到的header信息 一般情况下,这也是反向代理的标配
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Protocol $scheme;
}
# index的指定用法
location / {
root /var/www/mycom; # 此时/var/www/mycom目录下如果有一个index.html 那么访问配置域名时会默认进入该文件
}
# 使用uwsgi代理的推荐配置
location api/ {
include uwsgi_params; # 使用uwsgi代理
uwsgi_pass mycom; # 将所有请求转发给负载均衡mycom处理
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Protocol $scheme;
}
# 指定静态文件地址
location /static/ {
alias /var/www/mycom/static/; # 使用alias指定路径 需要到实际静态文件所在的目录的当前目录名,并且 / 必须前后一致
# root /var/www/mycom; # 使用root指定路径 需要到实际静态文件所在的目录的上一级目录,并且路由名需和实际目录名一致
}
# 404时的页面重定向
error_page 404 /404.html;
location = /40x.html {
}
# 发生错误时的页面重定向
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
注解:::
单机最大连接数:
系统用一个4四元组来唯一标识一个TCP连接:
{local ip, local port, remote ip, remote port}。
client每次发起tcp连接请求时,除非绑定端口,通常会让系统选取一个空闲的本地端口(local port),该端口是独占的,不能和其他tcp连接共享。tcp端口的数据类型是unsigned short,因此本地端口个数最大只有65536,端口0有特殊含义,不能使用,这样可用端口最多只有65535,所以在全部作为client端的情况下,最大tcp连接数为65535,这些连接可以连到不同的server ip。
server通常固定在某个本地端口上监听,等待client的连接请求。不考虑地址重用(unix的SO_REUSEADDR选项)的情况下,即使server端有多个ip,本地监听端口也是独占的,因此server端tcp连接4元组中只有remote ip(也就是client ip)和remote port(客户端port)是可变的,因此最大tcp连接=客户端ip数×客户端port数,对IPV4,不考虑ip地址分类等因素,最大tcp连接数约为2的32次方(ip数)×2的16次方(port数),也就是server端单机最大tcp连接数约为2的48次方。
在unix/linux下限制连接数的主要因素是内存和允许的文件描述符个数(每个tcp连接都要占用一定内存,每个socket就是一个文件描述符),另外1024以下的端口通常为保留端口。对server端,通过增加内存、修改最大文件描述符个数等参数,单机最大并发TCP连接数超过10万是没问题的。
题外话,使用uwsgi的推荐配置:
[uwsgi]
# 配置前导路径
base = /root/bin/django-test
# 配置项目名称
name = django-test
# 守护进程
master = true
# 进程个数
processes = 4
# 线程个数
threads = 2
# 通信的地址和端口(自己服务器的IP地址和端口)
socket = 127.0.0.1:8000
# wsgi-file文件地址
wsgi-file = %(base)/%(name)/wsgi.py
# 项目地址
chdir = %(base)
# 虚拟环境
home = /root/.envs/%(name)
# 指定python解释器
pythonpath = %(home)/bin/python
# 日志文件地址
daemonize = %(base)/%(name).log
# 关闭uwsgi访问日志
disable-logging = True
# 监听队列的长度,不能超过系统内核的net.core.somaxconn长度,该数值的增加有助于提供并发性。
listen = 10240
启动示例:
正常启动:uwsgi --ini uwsgi.ini
以协程方式启动:uwsgi --gevent 100 --gevent-early-monkey-patch uwsgi.ini
注意:要提前安装好gevent