nginx及操作系统配置优化

最近做一个项目的上线,项目部署在公网上,使用jetty作为应用服务器,为了提高上线项目的访问速度,使用nginx作为前置机,后来对nginx及操作系统的配置进行了一些优化,写个日志以备忘。

nginx配置

#user  nobody;
#nginx进程数,建议按照cpu数目来指定,一般为它的倍数。
worker_processes  8;
#为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
#这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。
worker_rlimit_nofile 102400;
#错误日志
error_log  logs/error.log;
#nginx PID文件
pid        logs/nginx.pid;
events {
    #使用epoll的I/O模型
    use epoll;
    #每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections
    worker_connections  102400;
}

# load modules compiled as Dynamic Shared Object (DSO)
#
#dso {
#    load ngx_http_fastcgi_module.so;
#    load ngx_http_rewrite_module.so;
#}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    #tcp_nopush     on;
    #客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得
    client_header_buffer_size 4k;
    client_max_body_size 8M;
    client_body_buffer_size 128k;
    #这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存
    open_file_cache max=102400 inactive=20s;
    #这个是指多长时间检查一次缓存的有效信息
    open_file_cache_valid 30s;
    #open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除
    open_file_cache_min_uses 1;

    #keepalive超时时间
    keepalive_timeout  65;

    tcp_nodelay on;

    #开启压缩
    gzip  on;
    gzip_http_version 1.1;
    gzip_vary on;
    #大于1k的文件才进行压缩
    gzip_min_length  1k;
    #压缩等级,越大压缩得越小,但越消耗CPU资源
    gzip_comp_level 2;
    gzip_proxied any;
    #根据content-type进行压缩
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    #压缩的buffer大小
    gzip_buffers 4 16k;
    # Disable gzip for certain browsers.
    gzip_disable “MSIE [1-6].(?!.*SV1)”;
    #websocket相关处理
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

    log_format  access  '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for';

    server {
        listen       80;
        server_name  *.abc.com;

        charset UTF-8;

        access_log  /opt/nginx/logs/access.log  access;

        #将根目录设到jetty的root应用
        root /opt/jetty/webapps/root;

        #如果访问/,则301重定向到/A/
        location = / {
            return 301 /A/;
        }

        #处理/的请求
        location / {
            root   /opt/jetty/webapps/root/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        #处理所有静态资源,缓存过期时间10天
        location ~ /\.(gif|jpg|png|js|css)$ {
            root   /opt/jetty/webapps/root/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            expires 10d;
        }
        #连接/A/websocket1.do的websocket请求反向代理至jetty应用服务器
        location = /A/websocket1.do {
            proxy_pass http://127.0.0.1:8080/A/websocket1.do;
            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_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
        #连接/A/websocket2.do的websocket请求反向代理至jetty应用服务器
        location = /A/websocket2.do {
            proxy_pass http://127.0.0.1:8080/A/websocket2.do;
            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_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
        #处理应用A的静态资源,缓存过期时间10天
        location ~ /A/\.(gif|jpg|png|js|css)$ {
            root   /opt/jetty/webapps/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            expires 10d;
        }
        #其它/A的请求反向代理至jetty应用服务器
        location /A {
            proxy_pass http://127.0.0.1:8080/A;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        #处理jetty的文件下载请求
        location /download/ {
            internal;
            alias   /somewhere/; # note the trailing slash
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        #不允许访问/A/view/
        location = /A/view/ {
           return 404;
        }

        #其它错误页面设置
        error_page  403              /static/403.html;
        error_page  404              /static/404.html;
        error_page  500 503 504  /static/500.html;
        error_page  502  /static/502.html;
   }
}

相应地还修改了一些系统参数,如下:

vim /etc/sysctl.conf
# Disable response to broadcasts.
# You don't want yourself becoming a Smurf amplifier.
net.ipv4.icmp_echo_ignore_broadcasts = 1
# enable route verification on all interfaces
net.ipv4.conf.all.rp_filter = 1
# enable ipV6 forwarding
#net.ipv6.conf.all.forwarding = 1
# increase the number of possible inotify(7) watches
fs.inotify.max_user_watches = 65536
# avoid deleting secondary IPs on deleting the primary IP
net.ipv4.conf.default.promote_secondaries = 1
net.ipv4.conf.all.promote_secondaries = 1

#timewait的数量,默认是180000
net.ipv4.tcp_max_tw_buckets = 6000
#允许系统打开的端口范围
net.ipv4.ip_local_port_range = 1024    65000
#启用timewait快速回收
net.ipv4.tcp_tw_recycle = 1
#开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接
net.ipv4.tcp_tw_reuse = 1
#开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理
net.ipv4.tcp_syncookies = 1
#web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值
net.core.somaxconn = 262144
#每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.netdev_max_backlog = 262144
#系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)
net.ipv4.tcp_max_orphans = 262144
#记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128
net.ipv4.tcp_max_syn_backlog = 262144
#时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉
net.ipv4.tcp_timestamps = 0
#为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量
net.ipv4.tcp_synack_retries = 1
#在内核放弃建立连接之前发送SYN包的数量
net.ipv4.tcp_syn_retries = 1
#如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些
net.ipv4.tcp_fin_timeout = 1
#当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时
net.ipv4.tcp_keepalive_time = 30

另外加大了操作系统允许打开的最大文件数

vim /etc/security/limits.conf
*    hard    nofile  102400
*    soft    nofile  102400


你可能感兴趣的:(nginx及操作系统配置优化)