Tối ưu VPS chạy NGINX và PHP-FPM

Tối ưu VPS chạy NGINX và PHP-FPM

Nginx + PHP-FPM là mô hình webserver rất phổ biến hiện nay và dần thay thế cho Apache, tốc độ xử lý PHP script của Nginx + PHP-FPM nhanh hơn Apache + Fcgi gấp nhiều lần. Nên được rất nhiều bạn sử dụng và cài đặt trên VPS. Nhưng bạn có biết Nginx + PHP-FPM còn có thể nhanh hơn nữa? Tính đến năm 2015, Adrian Singer đã có hơn 8 năm kinh nghiệm trong việc sử dụng Nginx và PHP-FPM cho các website lớn. Ông đã chia sẽ những thủ thuật và kinh nghiệm giúp tối ưu hóa Nginx và PHP-FPM cho các website có lượng traffic lớn trên blog của mình. Và hôm nay mình xin note lại các kinh nghiệm này để các bạn tham khảo. Trong những cấu hình này có những cấu hình có cả ưu và nhược điểm, nhưng nhìn chung thì các bạn vẫn nên áp dụng.

1. Sử dụng UNIX Domain Sockets thay cho TCP Sockets

upstream backend
{
# UNIX domain sockets
server unix:/var/run/fastcgi.sock;

# TCP sockets
# server 127.0.0.1:8080;
}

Nếu có hơn 1000 kết nối 1 lúc thì nên sử dụng TCP Sockets - chúng có khả năng đáp ứng tốt hơn.

2. Điều chỉnh Worker Processes bằng số CPU Cores

Bạn có thể xem là có bao nhiêu CPU đã được sử dụng:

Linux:

cat /proc/cpuinfo | grep processor

FreeBSD:

sysctl dev.cpu | grep location

Điều chỉnh worker_processes trong file nginx.conf:

# We have 16 cores
worker_processes 16;

# connections per worker
events
{
worker_connections 4096;
multi_accept on;
}

3. Xây dựng upstream load balancing với nhiều backend

upstream backend {
server unix:/var/run/php5-fpm.sock1 weight=100 max_fails=5 fail_timeout=5;
server unix:/var/run/php5-fpm.sock2 weight=100 max_fails=5 fail_timeout=5;
}

4. Tắt Access Logs (Có cả ưu nhược, nên cẩn thận khi làm)

access_log off;
log_not_found off;
error_log /var/log/nginx-error.log warn;

5. Sử dụng Gzip (CPU sẽ hoạt động cao hơn)

gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 1100;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

6. Sử dụng open_file_cache

open_file_cache max=2000 inactive=20s;
open_file_cache_valid 60s;
open_file_cache_min_uses 5;
open_file_cache_errors off;

7. Điều chỉnh client timeouts

client_max_body_size 50M;
client_body_buffer_size 1m;
client_body_timeout 15;
client_header_timeout 15;
keepalive_timeout 2 2;
send_timeout 15;
sendfile on;
tcp_nopush on;
tcp_nodelay on;

8. Điều chỉnh output buffers

fastcgi_buffers 256 16k;
fastcgi_buffer_size 128k;
fastcgi_connect_timeout 3s;
fastcgi_send_timeout 120s;
fastcgi_read_timeout 120s;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
reset_timedout_connection on;
server_names_hash_bucket_size 100;

9. Tối ưu /etc/sysctl.conf

# Recycle Zombie connections
net.inet.tcp.fast_finwait2_recycle=1
net.inet.tcp.maxtcptw=200000

# Increase number of files
kern.maxfiles=65535
kern.maxfilesperproc=16384

# Increase page share factor per process
vm.pmap.pv_entry_max=54272521
vm.pmap.shpgperproc=20000

# Increase number of connections
vfs.vmiodirenable=1
kern.ipc.somaxconn=3240000
net.inet.tcp.rfc1323=1
net.inet.tcp.delayed_ack=0
net.inet.tcp.restrict_rst=1
kern.ipc.maxsockbuf=2097152
kern.ipc.shmmax=268435456

# Host cache
net.inet.tcp.hostcache.hashsize=4096
net.inet.tcp.hostcache.cachelimit=131072
net.inet.tcp.hostcache.bucketlimit=120

# Increase number of ports
net.inet.ip.portrange.first=2000
net.inet.ip.portrange.last=100000
net.inet.ip.portrange.hifirst=2000
net.inet.ip.portrange.hilast=100000
kern.ipc.semvmx=131068

# Disable Ping-flood attacks
net.inet.tcp.msl=2000
net.inet.icmp.bmcastecho=1
net.inet.icmp.icmplim=1
net.inet.tcp.blackhole=2
net.inet.udp.blackhole=1

10. Thường xuyên theo dõi

Thông qua module stub_status, mặc định đã có khi cài đặt qua YUM.

Bạn sẽ cần phải biên dịch lại NGINX:

./configure --with-http_ssl_module --with-http_stub_status_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module
make install BATCH=yes

Tham khảo:Softwareprojects