user www; worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream app{ server 127.0.0.1:3001; } server { listen 80; server_name localhost; #charset koi8-r; client_max_body_size 100M; #access_log logs/host.access.log main; location / { root /home/www/music/p; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location ^~/app/{ proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; proxy_pass http://app/; proxy_redirect off; add_header Access-Control-Allow-Origin "*"; } } }
nginx 主要用于做一个nodejs与静态文件的负载均衡和静动态数据与文件的分发。
服务是购买的阿里云最便宜的服务器。先优化服务器端:
系统:CentOS release 6.5 (Final)
CPU信息:
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 45
model name : Intel(R) Xeon(R) CPU E5-2430 0 @ 2.20GHz
stepping : 7
cpu MHz : 2199.939
cache size : 15360 KB
physical id : 0
siblings : 1
core id : 0
cpu cores : 1
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat clflush mmx fxsr sse sse2 ht syscall nx lm up rep_good unfair_spinlock pni ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm
bogomips : 4399.87
clflush size : 64
cache_alignment : 64
address sizes : 46 bits physical, 48 bits virtual
power management:
内存:512MB
total used free shared buffers cached
Mem: 490 469 21 0 139 146
-/+ buffers/cache: 183 307
所剩内存并不多。21MB
nginx:
worker_processes 1; #这里是默认的为1,可以改为auto,这样如果你的服务器是多核的可以需要多少自动用多少。这里因为只有1核,所以不用修改.
在这条下面添加一条:worker_rlimit_nofile 100000;#这个是现在nginx同时打开的文件数,如果你不设置就是根据系统的默认值(ulimit -a查看)。如果nginx打开的文件超过了系统的默认值就会报too many open file.
然后就是Events模块
events { worker_connections 1024; }
上面是默认的,这里先修改worker_connections参数,这个是nginx的worker进程可以打开的最大进程数,因为我的目前的服务器配置很低,所以就设置为1024。因为我work连接数由系统的socket连接数限制,我再如何的提高也是没有效果的。如果你的服务器配置比较高可以修改为2048,4096,8192成2的倍数增加最好。
然后添加两条:
multi_accept on;#这里默认是off,这个参数是告诉nginx在接收到连接的时候是否接受更多的连接
use epoll; #如果是*BSD系列就是use kqueue 如果是其他kernel>2.6就使用epoll
如果不理解epoll和kqueue:epoll 或者 kqueue 的原理是什么?
然后是HTTP模块:
server_tokens off; #这个参数是关闭nginx的版本信息,因为各个版本有不同的安全漏洞,那么我们关闭版本,当入侵者攻击时需要做模糊攻击提高对方攻击应用的复杂度 sendfile on; #这个参数是将文件读入到缓存区 tcp_nopush on; #告诉nginx在发送数据包的时候一次性把所有文件包含到一个数据包中,不需要一个一个的发送
gzip on; #开启gzip压缩节省带宽 gzip_disable "msie6"; #兼容低版本的浏览器 gzip_proxied any; #允许或者禁止压缩基于请求和响应的响应流。我们设置为any,意味着将会压缩所有的请求。 gzip_min_length 1000; #当文件小于1000b的时候不压缩 gzip_comp_level 5;#这个是压缩级别,共有1-9,9压缩率最高,但是最慢。1则相反.这里我们折中5 gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; #设置被压缩文件的格式
最终版本:
user www; worker_processes auto; worker_rlimit_nofile 100000; events { worker_connections 1024; multi_accept on; use epoll; } http { include mime.types; default_type application/octet-stream; server_tokens off; sendfile on; tcp_nopush on; keepalive_timeout 65; gzip on; gzip_disable "msie6"; gzip_proxied any; 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; upstream app{ server 127.0.0.1:3001; } server { listen 80; server_name localhost; #charset koi8-r; client_max_body_size 100M; location / { root /home/www/music/p; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location ^~/app/{ proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; proxy_pass http://app/; proxy_redirect off; add_header Access-Control-Allow-Origin "*"; } } }
扩展阅读:
高并发下的 Nginx 优化