Notes for a front-end developer, esyou.net

0%

小内存VPS安装LNMP的优化,你做了吗?

很多做站的朋友,可能为了避免国内麻烦的备案程序,和我一样购买和使用国外的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,则内存使用会增加20M256M的VPS建议设置为10512M的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进行优化吧!