很多做站的朋友,可能为了避免国内麻烦的备案程序,和我一样购买和使用国外的VPS,有很多新手对国外VPS的使用了解太少,虽然买了个512M内存的VPS或者256M内存的VPS,总觉得速度不行或者经常出现502错误等问题,那么今天就由我来告诉你,购买VPS后,要如何进行优化才能发挥VPS最大的性能。当然,购买后我建议大家都使用lnmp,而不要使用什么iis以及apache之类的服务器软件,因为小内存VPS使用iis以及apache的话你会觉得内存占用太大。
1.优化CPU
先来优化CPU吧,使用命令cat /proc/cpuinfo看看自己的CPU是几核的,Linode虽然内存给的不多,但是CPU还是挺实在的,我这服务器的CPU是4核的,使用该命令可以看到processor 0,1,2,3。
确定了CPU之后,在Nginx的配置文件中写入如下这样两行:
1 | worker_processes 4 |
2 | worker_cpu_affinity 0001 0010 0100 1000 |
这两行的意思是说,开启4个工作进程,并同时启用CPU的4个核心,这样能加快Nginx的响应速度。之后可以用top命令来验证,是不是开启了4个CPU在工作。
2. 在events中开启epoll。
1 | events{ |
2 | use epoll; |
3 | } |
Epoll事件模型是Nginx之所以优于Apache的杀手锏技术,但只有在Linux 2.6及以上内核中才可采用,如果内核是2.6以上的,一定要打开。
3. 设定Nginx文件句柄数
使用ulimit -n得到文件查看数限制,设置到worker_rlimit_nofile中,我的系统中是1024。
1 | worker_rlimit_nofile 1024 |
4. 设定连接数worker_connections:
1 | events{ |
2 | worker_connections 1024; |
3 | } |
根据Nginx的理论计算公式:最大连接数=worker_processes*worker_connections/4,因此,本例中的计算结果应该是:
最大连接数=4*1024/4=1024
所以,如果要设置max_clients的话,可将其设置为1024。我这是小内存Server,内存充足的话,设置成8000-10000也没问题的。
1 | events{ |
2 | max_clients 1024; |
3 | } |
5. 在某些情况下(具体可参考 wiki.nginx.org)
Nginx 内部重定向规则会被启动。如:当 URL 指向一个目录并且在最后没有包含“/”时,Nginx 内部会自动的做一个 301的重定向,这时会有两种情况:
server_name_in_redirect on(默认),URL 重定向为: server_name 中的第一个域名 + 目录名 + /;
server_name_in_redirect off,URL 重定向为: 原 URL 中的域名 + 目录名 + /。
这里建议设置成off:
1 | server_name_in_redirect off |
6. 设置server_names_hash_bucket_size
保存服务器名字的hash表是由指令 server_names_hash_max_size和 server_names_hash_bucket_size所控制的。参数hash_bucket_size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。如果hash_bucket_size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键 值。因此,如果Nginx给出需要增大hash_max_size 或 hash_bucket_size的提示,那么首要的是增大前一个参数的大小。这里直接给出结果吧:
1 | server_names_hash_bucket_size 128; |
7. 隐藏Nginx版本号,设置server_tokens:
server_tokens off;
8. 设置client_header_buffer_size和large_client_header_buffers
Nginx中经常出现难以查找原因的400错误,主要是这两个配置造成的,配置这两项:
1 | client_header_bufffer_size 32k; |
large_client_header_buffers 4 32k;
9. 设置客户端通过Nginx提交文件的最大尺寸:
1 | client_max_body_size 8m; |
我这里写的是8M,足够上传照片了,如果还嫌不够,可以修改成32M。
10. 打开sendfile:
1 | sendfile on; |
11. 禁止TCP Push:
1 | tcp_nopush on; |
该指令用于在FreeBSD或Linux系统上允许/禁止使用TCP PUSH标志位,仅当sendfile on开启时有效。
12. 设置keepalive超时时间
1 | keepalive_timeout 60; |
该指令用于设置keepalive会话超时时间,默认为75秒。
13.设置tcp_nodelay
1 | tcp_nodelay on; |
该指令用于允许或禁止Socket中的TCP延时。
14. 设置client_body_timeout
1 | client_body_timeout 10; |
该指令用于客户端的读取操作超时时间。
其他设置:
1 | output_buffers 1 32k; |
2 | postpone_output 1460; |
3 | open_file_cache max=1000 inactive=20s; |
4 | open_file_cache_valid 30s; |
5 | open_file_cache_min_uses 2; |
6 | open_file_cache_errors on; |
7 | fastcgi_connect_timeout 300; |
8 | fastcgi_send_timeout 300; |
9 | fastcgi_read_timeout 300; |
10 | fastcgi_buffer_size 32k; |
11 | fastcgi_buffers 4 32k; |
12 | fastcgi_busy_buffers_size 32k; |
13 | fastcgi_temp_file_write_size 32k; |
14 | gzip on; |
15 | gzip_buffers 4 16k; |
16 | gzip_http_version 1.0; |
17 | gzip_comp_level 2; |
18 | gzip_types text/plain application/x-javascript text/css application/xml; |
19 | gzip_proxied expired no-cache no-store private auth; |
20 | proxy_cache_path /var/lib/nginx/cache levels=1:2 keys_zone=staticfilecache:80m inactive=1d max_size=2500m; |
21 | proxy_temp_path /var/lib/nginx/proxy; |
22 | proxy_connect_timeout 300; |
23 | proxy_read_timeout 120; |
24 | proxy_send_timeout 120; |
25 | proxy_buffer_size 16k; |
26 | proxy_buffers 4 16k; |
最后,一定要优化php-fpm,以上的优化你可以不做,但是以下的优化你必须做。
再来优化PHP-FPM,打开/usr/local/php/etc/php-fpm.conf,这个文件和PHP的语法很相似,凡是需要激活的配置,直接删掉前面的分号(;)即可:
1 | [global] |
2 | pid = run/php-fpm.pid |
3 | process_control_timeout=5 |
4 | [www] |
5 | listen.allowed_clients = 127.0.0.1 |
6 | user=www-data |
7 | group=www-data |
8 | pm=dynamic |
9 | pm.max_children=20(一般情况,每增加1,则内存使用会增加20M。256M的VPS建议设置为10,512M的VPS建议设置为20) |
10 | pm.max_requests=10000(并发数越大,此请求数应越大) |
11 | pm.start_servers =10(初始php-fpm进程数) |
12 | emergency_restart_threshold = 60 |
13 | emergency_restart_interval = 60s |
上边这两个,表示在emergency_restart_interval所设值内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过 emergency_restart_threshold个,php-fpm就会优雅重启。这两个选项一般保持默认值。
学问却是太大了,有的时候连我自己都会忘记很多设置,如果你也使用VPS,那么赶快给你的VPS进行优化吧!