Tối ưu Nginx

I – Tối ưu Nginx:
1) B trí li các tp tin cu hình:
Thông thưng thì các tp tin cu hình ca Nginx s đưc lưu tr trong thư mc /etc/nginx. Mt cách t chc li vic lưu tr  tt hơn theo phong cách ca Apache như sau
## Tp tin cu hình chính ##/etc/nginx/nginx.conf## Tp tin cu hình các virtual host ##/etc/nginx/sites-available//etc/nginx/sites-enabled/ ## Các tp tin cu hình khác… ##/etc/nginx/conf.d/
Phn tp tin cu hình virtual host s có 2 thư mc chính:
  • sites-available: Cha danh sách các file cu hình khác nhau như: file cu hình hoàn chnh, file cu hình tm thi, file cu hình li,Lưu tr nhng tp tin cu hình mà ta hin có.
  • sites-enabled: Cha danh sách các symbolic link tr ti các tp tin cu hình hoàn chnh, đã ti ưu thư mc sites-available.
Vì chúng ta tách bit phn file cu hình ca các virtual host ra lưu tr riêng nên ta cn phi include dòng đa ch thư mc lưu tr các file cu hình này vào file cu hình chính. filenginx.conf ta thêm vào
## Tp tin cu hình virtual host. ##include /etc/nginx/sites-enabled/*; ## Các tp tin cu hình khác…/ ##include /etc/nginx/conf.d/*;
Chú ý: Vic ti ưu li cách sp xếp này giúp chúng ta ddàng qun lý h thng webserver hơn chkhông có tác dng ti hiu sut ti hiu sut.
2) Ti ưu worker_processes:
Vi cu hình mc đnh, Nginx s s dng mt CPU đ x lý các tác v ca mình. Tùy theo mc đ hot đng ca web server mà chúng ta có th thay đi li thiết lp này. Ví d vi các web server hay sdng v SSL, gzip thì ta nên đt ch s cworker_processes này lên cao hơn. Nếu website ca bn có sng các tp tin tĩnh nhiu, và dung lưng ca chúng ln hơn b nh RAM thì vic tăng worker_processes s ti ưu băng thông đĩa ca h thng.
Đ xác đnh s cores ca CPU ca h thng ta có th thc hin lnh
# cat /proc/cpuinfo | grep processor
[root@server ~]# cat /proc/cpuinfo | grep processorprocessor    : 0processor    : 1processor    : 2processor    : 3
Như trên, CPU ca chúng ta có 4 cores. Đ thay đi mc s dng CPU ca nginx ta sa tp tin cu hình chính
# vi /etc/nginx/nginx.conf
Ti dòng s 3 ta thay đi giá tr cworker_processes là 4.
nginx-php-fpm-config-2
3) Ti ưu worker_connections:
worker_connections s cho biết sng connection mà CPU s x lý. Mc đnh, sng connection này đưc thiết lp là 1024. Đ xem v mc gii hn s dng ca h thng bn có th dng lnh ulimit
# ulimit –n
nginx-php-fpm-config-3
Con s thiết lp cworker_connections nên nh hơn hoc bng gii hn này!
Nếu bn đã điu chnh li giá tr worker_processes giúp Nginx s dng nhiu cores đ x lý các tác v hơn thì có th thêm dòng cu hình sau đ tăng sng clients lên cao nht
max_clients = worker_processes * worker_connections
4) Ti ưu buffers (b nh đm):
Mt trong nhng cu hình quan trng đ ti ưu Nginx là thiết đt các giá tr buffer. Nếu bn thiết lp b nh buffer quá nh thì s d dn ti tình trng tht c chai khi web server ca chúng ta tiếp nhn mt lưng traffic ln. Đ thay đi các giá tr buffer này, chúng ta có th thêm vào các dòng cu hình th http ca file cu hình chính nginx.conf
client_body_buffer_size 8K; client_header_buffer_size 1k; client_max_body_size 2m; large_client_header_buffers 2 1k;
Trong đó:
  • client_body_buffer_size: Thiết đt giá tr kích thưc ca body mà client yêu cu. Nếu kích thưc đưc yêu cu ln hơn giá tr buffer thì s đưc lưu vào temporary file.
  • client_header_buffer_size: Thiết đt giá tr kích thưc ca header mà client yêu cu. Thông thưng thì kích thưc này 1K là đ.
  • client_max_body_size: Thiết đt giá tr kích thưc ti đa ca body mà client có th yêu cu đưc, xác đnh bi dòng Conent-Length trong header. Nếu kích thưc body yêu cu vưt gii hn nãy thì client s nhn đưc thông báo li “Request Entity Too Large” (413).
  • large_client_header_buffers: Thiết đt giá tr kích v sng và kích thưc ln nht ca buffer dùng đ đc các headers có kích thưc ln t các request ca client. Nếu client gi mt header quá ln Nginx s tr v li Request URL too large (414) hoc Bad request (400) nếu header ca request quá dài.
Ngoài ra chúng ta cũng cn thiết đt li các giá tr timeout đ ti ưu hiu sut hot đng ca web server vi các client
client_body_timeout     10; client_header_timeout   10; keepalive_timeout       15; send_timeout            10;
Trong đó:
  • client_body_timeout: Thiết đt thi gian ti body ca webpage t client. Nếu quá thi gian này, client s nhn thông báo tr v “Request time out” (408).
  • client_header_timeout: Thiết đt thi gian ti title ca webpage t client. Nếu quá thi gian này, client s nhn thông báo tr v “Request time out” (408).
  • keepalive_timeout: Thiết đt thi gian sng ca kết ni t client, nếu quá thi gian này thì kết ni s b đóng.
  • send_timeout: Thiết đt thi gian phn hi d liu gia client và server, nếu quá thi gian này thì nginx s tt kết ni.
5) Tt Access Logs:
Mc đnh thì Nginx s ghi li các request lên mt file trên đĩa cng như là mt vic ghi logs. Nêu bn không s dng các access logs thì bn có th tt tính năng này đi đ gim bt thi gian nhp xut. Đ thc hin điu này, trong th server ca file cu hình chính nginx.conf bn có th đt giá tr sau
access_logs off;
6) Nén các gói d liu gi đi bng Gzip
Gzip s giúp nén các d liu trưc khi chuyn chúng ti Client. Đây là mt cách đ tăng tc đ tuy cp website ca cúng ta. Trong th http ca file cu hình chính nginx.conf  ta có th thêm
gzip              on;gzip_comp_level   2;gzip_min_length   1000;gzip_proxied      expired no-cache no-store private auth;gzip_types        text/plain application/xml;gzip_disable      “MSIE [1-6].”;
7) Cache ni dung các tp tin tĩnh:
Hu hết các request t client ti website ca chúng ta đ load các nôi dung như: hình nh, java script, css, flash, Chúng ta nên thc hin vic lưu cache li các tp tin có ni dung tĩnh này trên Nginx
location ~* “.(js|ico|gif|jpg|png|css|html|htm|swf|htc|xml|bmp|cur)$” {    root            /home/site/public_html;    add_header      Pragma “public”;    add_header      Cache-Control “public”;    expires         3M;    access_log      off;    log_not_found   off;}
8) n phiên bn ca Nginx:
Vic n đi phiên bn ca Nginx t Server Header s giúp h thng webserver ca chúng ta đưc bo mt tt hơn. Đ thc hin điu này, trong th http ca ca tp tin cu hình chínhnginx.conf ta thêm vào dòng sau
server_tokens off;
9) Thc thi các tp tin PHP thông qua PHP-FPM:
đây ta có th s dng TCP/IP stack mc đnh hoc dùng tr tiếp Unix Socket Connection. Chúng ta cũng có th s dng PHP-FPM đ lng nghe trên IP:Port (thưng là 127.0.0.1:9000).
location ~* .php$ {    try_files       $uri /index.php;    fastcgi_index   index.php;    fastcgi_pass    127.0.0.1:9000;    #fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;    include         fastcgi_params;    fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;    fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;}
Chúng ta hoàn toàn có th tách bit PHP-FPM và Nginx chy trên các server khác nhau.
10) Cm các truy cp ti các tp tin n trên Nginx:
Đôi khi trên các thư mc web chúng ta có lưu nhng tp tin n (bt đu vi du chm .”) như .svn, .htaccess. Đây là các tp tin không mang tính  public đi vi ngưi dùng. Đ ngăn chn các truy xut ti các tp tin n này ta có th thêm vào đon cu hình sau
location ~ /. {    access_log off;    log_not_found off;     deny all;}
II – Tối ưu PHP-FPM
1) B trí li các tp tin cu hình:
Thông thưng thì các cu hình ca PHP-FPM đưc thiết lp trong file cu hình /etc/php-fpm.conf và thư m/etc/php-fpm.d. Các tp tin cu hình khác ca PHP-FPM nên đt trong cùng thư mc/etc/php-fpm.d. Chúng ta có th thêm dòng cu hình sau vào file php-fpm.conf đ thc hin điu này
include=/etc/php-fpm.d/*.conf
2) Cu hình nhiu PHP-FPM Pool:
Đi vi PHP-FPM ta có th to ra nhiu pool khác nhau cho các website khác nhau có trên web server. Bng cách này chúng ta có th có đưc các cu hình cp phát tài nguyên và nhóm s hu khác nhau đi vi tn website. Ví d đây mình to 3 pool cho 3 website khác nhau là
/etc/php-fpm.d/site.conf
/etc/php-fpm.d/blog.conf
/etc/php-fpm.d/forums.conf
Các cu hình mu:
/etc/php-fpm.d/site.conf
[site]listen = 127.0.0.1:9000user = sitegroup = siterequest_slowlog_timeout = 5sslowlog = /var/log/php-fpm/slowlog-site.loglisten.allowed_clients = 127.0.0.1pm = dynamicpm.max_children = 5pm.start_servers = 3pm.min_spare_servers = 2pm.max_spare_servers = 4pm.max_requests = 200listen.backlog = -1pm.status_path = /statusrequest_terminate_timeout = 120srlimit_files = 131072rlimit_core = unlimitedcatch_workers_output = yesenv[HOSTNAME] = $HOSTNAMEenv[TMP] = /tmpenv[TMPDIR] = /tmpenv[TEMP] = /tmp
/etc/php-fpm.d/blog.conf
[blog]listen = 127.0.0.1:9001user = bloggroup = blogrequest_slowlog_timeout = 5sslowlog = /var/log/php-fpm/slowlog-blog.loglisten.allowed_clients = 127.0.0.1pm = dynamicpm.max_children = 4pm.start_servers = 2pm.min_spare_servers = 1pm.max_spare_servers = 3pm.max_requests = 200listen.backlog = -1pm.status_path = /statusrequest_terminate_timeout = 120srlimit_files = 131072rlimit_core = unlimitedcatch_workers_output = yesenv[HOSTNAME] = $HOSTNAMEenv[TMP] = /tmpenv[TMPDIR] = /tmpenv[TEMP] = /tmp
/etc/php-fpm.d/forums.conf
[forums]listen = 127.0.0.1:9002user = forumsgroup = forumsrequest_slowlog_timeout = 5sslowlog = /var/log/php-fpm/slowlog-forums.loglisten.allowed_clients = 127.0.0.1pm = dynamicpm.max_children = 10pm.start_servers = 3pm.min_spare_servers = 2pm.max_spare_servers = 4pm.max_requests = 400listen.backlog = -1pm.status_path = /statusrequest_terminate_timeout = 120srlimit_files = 131072rlimit_core = unlimitedcatch_workers_output = yesenv[HOSTNAME] = $HOSTNAMEenv[TMP] = /tmpenv[TMPDIR] = /tmpenv[TEMP] = /tmp
3) Cu hình PHP-FPM Pool Process Manager (pm):
Trong vic qun lý các tiến trình ca PHP-FPM ta nên s dng cách qun lý đng đ ch khi đng nhng tiến trình khi cn thiết. Các cu hình đây cũng tương t như là cu hình các thông s ca worker_porcess và worker_connection ca Nginx mà mình đã trình bày trên. Tùy theo lưng truy cp ti website ca chúng ta và dung lưng b nh RAM ca web server hin có mà ta có các cách cu hình cho phù hp.
Gii s Web Server ca chúng ta có 512 MB ram, nhng lúc website có lưng truy cp cao, ta check dung lưng b nh RAM hin đang dùng (bng lnh top chn hn). Dung lưng RAM đưc cp phát cho PHP-FPM là 220 MB, mi tiến trình ca nó s dng 24 MB. Ta có thtính đưc giá tr cmax_children là 220/24 = 9.17.
Vy giá tr pm.max_children ta nên thiết đt cho web server là 9.
Trong file cu hình pool ca website ta có th có cu hình mu như sau:
pm.max_children = 9pm.start_servers = 3pm.min_spare_servers = 2pm.max_spare_servers = 4pm.max_requests = 200
Mc đnh thì sng request mi tiến trình là không b gii hn. Tuy nhiên ta nên thiết đt li nó mt giá tr xác đnh đ tránh các vn đ v b nh. Như ví d trên pm.max_requestsđưc gán giá tr là 200.