本篇为Nginx的优化设置指南,和网上千篇一律的文章不一样,本文并不是要告诉你Nginx如何安装以及修改其中几行配置来获得一个Web服务器。虽然在大多数情况下,Nginx的常规配置已经可以良好的工作,但是想提升Nginx性能就必须深入一些。这个也是本文的主要内容,将解释Nginx不同设置微调的效果优化性能。 通常优化Nginx时要修改的文件只有一个——Nginx的主配置文件nginx.conf,该文件包含了Nginx不同模块的设置。本文根据配置文件默认的模块顺序挨个讲解哪些设置能够让服务器在大量客户端访问时依然拥有良好的性能以及为什么会提高性能,做到知其然并知其所以然,在文章结尾还会有一个完整的配置文件。 user nginx; pid /var/run/nginx.pid; worker_processes auto; worker_rlimit_nofile 10000; user和pid两个选项其实不用做过多修改,因为改与不改都不影响性能。 worker_processes选项用来定义Nginx提供服务时生成的进程数。一般设置和CPU个数相等,如果不能确定的时候,可以设置为“auto”,这样会自动检测。 worker_rlimit_nofile选项是更改每个进程可以打开的最大文件数。如果没设置的话,这个值为操作系统的限制(ulimit -a可以查看系统限制个数)。当经常遇到“too many open files”问题的时候可以考虑把这个值设高。 events { worker_connections 2048; multi_accept on; use epoll; } worker_connections选项是设置每个worker进程能同时打开的最大连接数。如果设置了worker_rlimit_nofile,可以将这个值设得很高。 multi_accept选项开启后可以让Nginx收到新连接通知后接受尽可能多的连接。 use epoll 是让Nginx使用epoll模型(事件驱动),这个也是Nginx为什么在处理速度上优于Apache的原因,Apache使用的是Select模型。 http { server_tokens off; sendfile on; tcp_nopush on; tcp_nodelay on; } server_tokens 设置为off可以在错误页面中不显示nginx版本,和Apache一样。 sendfile on 提升效率,具体功能是将数据立即从磁盘读到缓存。 tcp_nopush on 在一个数据包里发送多个头文件,而不是一个一个发送 tcp_nodelay on 一段一段的发送数据,当需要及时发送数据时,就应该给应用设置这个属性。 access_log off; error_log /var/log/nginx/error.log crit; access_log 设置nginx是否生成访问日志。关闭这个选项可以让读取磁盘IO操作更快。 error_log 设置错误日志级别以及路径,crit为严重的错误。 keepalive_timeout 10; client_header_timeout 10; client_body_timeout 10; reset_timedout_connection on; send_timeout 10; keepalive_timeout 设置会话超时时间,超过时间后服务器会关闭链接。将它设置低些可以让Nginx持续工作的时间更长。 client_header_timeout 和client_body_timeout 设置请求头和请求体超时时间,可以设置低些。 reset_timeout_connection 关闭不响应的客户端连接。这将释放客户端占有的内存空间。 send_timeout 指定客户端的响应超时时间。如果在这段时间内客户端没有读取数据,nginx就会关闭连接。 include /etc/nginx/mime.types; default_type text/html; charset UTF-8; include 是指包含另一个文件内容的配置。这里使用它来加载MIME类型。 default_type 设置文件使用的默认MIME-type。 charset 设置默认字符集。 gzip on; gzip_disable "msie6"; gzip_min_length 1000; gzip_comp_level 4; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; gzip选项设置为on是开启gzip压缩,这样会减少发送的数据量提升效率。 gzip_disable 为指定的客户端禁用gzip功能。我们设置成IE6或者更低版本以使我们的方案能够广泛兼容。 gzip_min_length 设置对数据启用压缩的最少字节数。如果数据太小的话还进行压缩反而会越压越大,所以这里设置为至少要1000字节才进行压缩 gzip_comp_level 设置数据的压缩等级。等级分为1-9级,数字越高压缩时间越长但是压缩比最大。 gzip_type 设置需要压缩的数据格式。 下面是一个完整的配置文件: user nginx; pid /var/run/nginx.pid; worker_processes auto; worker_rlimit_nofile 100000; events { worker_connections 2048; multi_accept on; use epoll; } http { server_tokens off; sendfile on; tcp_nopush on; tcp_nodelay on; access_log off; error_log /var/log/nginx/error.log crit; keepalive_timeout 10; client_header_timeout 10; client_body_timeout 10; reset_timedout_connection on; send_timeout 10; limit_conn_zone $binary_remote_addr zone=addr:5m; limit_conn addr 100; include /etc/nginx/mime.types; default_type text/html; charset UTF-8; gzip on; gzip_disable "msie6"; gzip_proxied any; gzip_min_length 1000; gzip_comp_level 6; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; open_file_cache max=100000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } 编辑完配置文件后,需要重启Nginx使设置生效,到此就已经全部搞定,Web服务器现在已经就绪!