Nginx服务器性能优化

2017.6.1 0 条评论 1.43k 次阅读 0 人点赞

Nginx的默认参数并不一定适合所有网站,可以根据网站规模和内容优化Nginx的参数,提高Nginx服务器的性能。这里主要优化worker进程、与客户端的连接、gzip压缩、expires等参数。
Nginx版本为1.12.0:

# /u01/app/nginx/sbin/nginx -V
nginx version: JWS/1.0.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) 
configure arguments: --user=nginx --group=nginx --prefix=/u01/app/nginx-1.12.0

1、修改Nginx主配置文件

# vi /u01/app/nginx/conf/nginx.conf

<br />
user nginx nginx;<br />
# worker进程的用户和组(如果省略了组,组的名字和用户一样),默认值nobody,这里编译时已经指定了为nginx,不指定则默认为为nginx。<br />
worker_priority 0;<br />
# worker进程的Nice值,默认值0,范围-20~20。<br />
worker_processes 1;<br />
# worker进程数量,默认值1,一般设为CPU核数(worker_processes auto),高流量高并发场合也可以提高到CPU核数*2。多核CPU还可以设置worker_cpu_affinity参数绑定不同的worker进程到不同的CPU核。<br />
worker_rlimit_nofile 65535;<br />
# worker进程最大打开文件数,设置为ulimit -HSn的值。<br />
events {<br />
    use epoll;<br />
    # 指定Nginx工作模式,通常不需要指定,Nginx会自动选择最高效的工作模式,对于Linux 2.6+会自动选择高效工作模式epoll。参考http://nginx.org/en/docs/events.html<br />
    worker_aio_requests 32;<br />
    # 使用aio+epoll连接方法时,设置单个worker进程的异步I/O数,默认值32。<br />
    worker_connections  512;<br />
    # 单个worker进程的最大连接数,默认值512,受worker_rlimit_nofile限制。Nginx总并发连接=worker_processes * worker_connections。<br />
}<br />
# 以上指令参考http://nginx.org/en/docs/ngx_core_module.html<br />
http {<br />
    include mime.types;<br />
    # 包含MIME定义文件mime.types。<br />
    default_type application/octet-stream;<br />
    # 默认MIME类型,默认值text/plain。<br />
    sendfile on;<br />
    # 使用带“SF_NODISKIO”标记的sendfile(),开启文件的高效传输模式,可防止磁盘阻塞,默认值off。<br />
    sendfile_max_chunk 0;<br />
    # 限制单个sendfile()调用的最大转换值,默认值0,不限制。<br />
    tcp_nopush on;<br />
    # 激活Linux上的TCP_CORK socket,允许把HTTP应答头部和文件的开始部分放在同一个数据包里,减少网络数据包。仅当sendfile on才有效。默认值off。<br />
    # aio on;<br />
    # 开启异步IO。默认值off。“[emerg] &quot;aio on&quot; is unsupported on this platform”。<br />
    directio 1m;<br />
    # 当读取大于或等于该值的文件时使用“O_DIRECT”标记,可防止读堵塞,默认值off。<br />
    keepalive_timeout 60s;<br />
    # 设置和客户端连接保持会话的超时时间,默认值75s,超过这个时间,服务器会关闭该连接。<br />
    tcp_nodelay on;<br />
    # 激活“TCP_NODELAY”选项,发送数据时,内核会等待更多字节组成一个数据包,提高I/O性能。仅keep-alive状态时生效。默认值on。<br />
    client_body_buffer_size 8k;<br />
    # 读取请求主体的缓存大小,超过该值请求主体会写入到client_body_temp_path。默认为两个内存分页的大小,x86平台默认值8k。<br />
    client_body_in_file_only off;<br />
    # 将请求主体保存到文件,用于调试,默认值off。<br />
    client_body_in_single_buffer off;<br />
    # 是否保存整个请求主体到单个缓存,默认值off。<br />
    client_header_buffer_size 1k;<br />
    # 读取请求头的缓存大小。默认值1k。<br />
    client_max_body_size 1m;<br />
    # 设置最大允许的客户端请求主体大小,也就是请求头部“Content-Length”值。如果超过该值,服务器会返回413 (Request Entity Too Large)错误。一般情况下,HTTP的post方法在提交数据时才会带“Content-Length”。默认值1m。<br />
    client_header_timeout 60s;<br />
    # 设置读取客户端请求头的超时时间,如果超过这个时间,客户端还没发送完整的请求头,服务器会返回408(Request Time-out)错误,可防止利用http协议进行攻击。默认值60s。<br />
    client_body_timeout 60s;<br />
    # 设置读取客户端请求主体的超时时间(仅为两次成功的读取操作之间的超时,非整个主体的超时),如果超过这个时间,客户端还没发送完整的请求主体,服务器会返回408(Request Time-out)错误。默认值60s。<br />
    send_timeout 60s;<br />
    # 设置服务器传送HTTP响应信息到客户端的超时时间(仅为两次成功的写操作之间的超时,非整个响应的超时),如果超过这个时间,客户端还没接收到任何数据,连接将关闭。默认值60s。<br />
    # 以上指令参考http://nginx.org/en/docs/http/ngx_http_core_module.html<br />
    gzip on;<br />
    # 开启对响应报文的gzip压缩功能。默认值off。<br />
    gzip_buffers 32 4k;<br />
    # 压缩缓冲区大小,默认缓存大小等于内存分页大小,x86平台默认值32 4k。<br />
    gzip_comp_level 1;<br />
    # 压缩比,1~9,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢,默认值1。<br />
    gzip_min_length 1k;<br />
    # 设置允许压缩的页面最小字节数,字节数依据响应头的“Content-Length”值。默认值20。小文件压缩后可能越压越大。<br />
    gzip_http_version 1.1;<br />
    # 开启压缩的请求报文的HTTP最低版本。默认值1.1。<br />
    gzip_types text/plain text/css text/xml application/javascript;<br />
    # 指定压缩的MIME类型,默认值text/html,默认text/html总是被压缩,这里不需要加text/html,否则报“[warn] duplicate MIME type &quot;text/html&quot;”。<br />
    gzip_vary on;<br />
    # 填充响应头的“Vary: Accept-Encoding”区域,默认值off。<br />
    # 以上指令参考http://nginx.org/en/docs/http/ngx_http_gzip_module.html<br />
    upstream php {<br />
        server 127.0.0.1:9000;<br />
    }<br />
    # Upstream to abstract backend connection(s) for php,参考http://nginx.org/en/docs/http/ngx_http_upstream_module.html<br />
    server {<br />
        server_name www.jianxiangqiao.com jianxiangqiao.com;<br />
        # 使用确切的域名,避免多次查询域名散列表。<br />
        root /u01/data/wordpress;<br />
        # 请求的根目录。例如,请求“/robots.txt”将发送“/u01/data/wordpress/robots.txt”文件。<br />
        index index.php;<br />
        # 参考http://nginx.org/en/docs/http/ngx_http_index_module.html<br />
        location = /favicon.ico {<br />
            log_not_found off;<br />
            # 关闭文件未找到错误日志,默认值on。参考http://nginx.org/en/docs/http/ngx_http_core_module.html<br />
            access_log off;<br />
            # 关闭访问日志。参考http://nginx.org/en/docs/http/ngx_http_log_module.html<br />
        }<br />
        location = /robots.txt {<br />
            allow all;<br />
            # 允许所有人访问,参考http://nginx.org/en/docs/http/ngx_http_access_module.html<br />
            log_not_found off;<br />
            access_log off;<br />
        }<br />
        location / {<br />
            # This is cool because no php is touched for static content.<br />
            # include the &quot;?$args&quot; part so non-default permalinks doesn't break when using query string<br />
            try_files $uri $uri/ /index.php?$args;<br />
        }<br />
        location ~ \.php$ {<br />
            #NOTE: You should have &quot;cgi.fix_pathinfo = 0;&quot; in php.ini<br />
            include fastcgi.conf;<br />
            fastcgi_intercept_errors on;<br />
            fastcgi_pass php;<br />
        }<br />
        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {<br />
            expires max;<br />
            # 过期时间,设置响应报文头的“Expires”和“Cache-Control”字段。参考http://nginx.org/en/docs/http/ngx_http_headers_module.html<br />
            log_not_found off;<br />
        }<br />
    }<br />
}<br />

2、检查配置文件并重启Nginx服务器

[root@www conf]# ../sbin/nginx -t
nginx: the configuration file /u01/app/nginx-1.12.0/conf/nginx.conf syntax is ok
nginx: configuration file /u01/app/nginx-1.12.0/conf/nginx.conf test is successful
[root@www conf]# systemctl restart nginx
[root@www conf]# systemctl status nginx 
● nginx.service - nginx - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2017-06-01 07:56:19 CST; 5s ago
     Docs: http://nginx.org/en/docs/
  Process: 9601 ExecStop=/u01/app/nginx/sbin/nginx -s quit (code=exited, status=0/SUCCESS)
  Process: 26377 ExecReload=/u01/app/nginx/sbin/nginx -s reload (code=exited, status=0/SUCCESS)
  Process: 9608 ExecStart=/u01/app/nginx/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 9605 ExecStartPre=/u01/app/nginx/sbin/nginx -t (code=exited, status=0/SUCCESS)
 Main PID: 9610 (nginx)
   CGroup: /system.slice/nginx.service
           ├─9610 nginx: master process /u01/app/nginx/sbin/nginx
           └─9611 nginx: worker process

Jun 01 07:56:19 www systemd[1]: Starting nginx - high performance web server...
Jun 01 07:56:19 www nginx[9605]: nginx: the configuration file /u01/app/nginx-1.12.0/conf/nginx.conf syntax is ok
Jun 01 07:56:19 www systemd[1]: Started nginx - high performance web server.
Jun 01 07:56:19 www nginx[9605]: nginx: configuration file /u01/app/nginx-1.12.0/conf/nginx.conf test is successful
Hint: Some lines were ellipsized, use -l to show in full.

3、测试

通过网站评分系统比如http://ce.cloud.360.cn/的网站评分或者浏览器自带的F12开发人员工具测试keep-alive、gzip、expires等的优化效果。

健翔桥的奇迹

IT工程师/摄影历史/跑步骑行