Cài đặt nginx và PHP-FPM

Sun, 19 May 2013

Hiện nay nginx (Engine X) là một web server mã nguồn mở đang khá được ưa chuộng trong cộng đồng các nhà phát triển web. Lúc trước mình vẫn thường dùng Apache, còn nginx sử dụng làm proxy.

Các dự án sau này mình đã chuyển sang hẳn dùng nginx vì mình muốn đồng bộ sử dụng 1 loại web server cũng phần mình thấy nginx chạy hiệu suất ổn định và việc cấu hình cũng như sử các plugin dễ dàng hơn.

Bài này mình sẽ hướng dẫn các bạn cài đặt nginx và chạy mã PHP trên môi trường CentOS 6

Thiết lập và cài đặt nginx

Mặc định trên Centos6 không có sẵn gõi nginx nên chúng ta sẽ cài đặt thông qua repository.

Thiết lập repository

Chúng ta tạo file /etc/yum.repos.d/nginx.repo với nội dung

[nginx]
name=nginx
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=1

Cài đặt nginx

Bây giờ chúng ta có thể cài đặt dịch vụ nginx

yum install nginx

Khởi động dịch vụ nginx

service nginx start

Tiếp theo, chúng ta cần tạo 2 thư mục sites-availablesites-enabled.

sites-available: Thư mục chứa file cấu hình các vhost của server
sites-enabled: Thư mục chứa các symlink từ thư mục sites-available

mkdir -p /etc/nginx/sites-{enabled,available}

Sau đó, bạn mở file /etc/nginx/nginx.conf, thêm 1 dòng include trong thân của http.

worker_processes  1;
error_log  /Library/Logs/nginx/error.log;
events {
    worker_connections  1024;
}

http {
    ...
    include /usr/local/etc/nginx/sites-enabled/*.conf; 
}

Làm việc này rất có lợi khi bạn muốn enable hoặc disable một site nào đó ở server thì chúng ta chỉ cần link hoặc unlink file cấu hình đó là xong

Cấu hình nginx

Mình sẽ bắt đầu tạo 1 file host vói tên là minhtringuyen.info.conf để cấu hình cho domain minhtringuyen.info

server {
    listen       80;
    server_name  minhtringuyen.info;
    root /var/www/minhtringuyen.info;
    access_log  /var/log/nginx/minhtringuyen.info.access.log;
    error_log   /var/log/nginx/minhtringuyen.info.error.log;

    location / {    
        index  index.html index.htm;
    }
}

Tạo symlink từ thư mục sites-avaiable sang sites-enabled

ln -s /etc/nginx/sites-available/minhtringuyen.info.conf /etc/nginx/sites-enabled/minhtringuyen.info.conf

Vậy là xong phần cấu hình và cài đặt cho phần nginx

Cấu hình để xử lý PHP

Vì nginx không thể tự xử lý được các file PHP (như Apache có sẵn mod_php) nên chúng ta cần đến php-fpm để hỗ trợ xử lý các tác vụ này.

Cài đặt php-fpm

yum install php-fpm

Về cơ bản nginx sẽ forward các request đến php-fpm và nhận kết quả. Ở đây chúng ta có 2 cách để thực hiện

Chạy thông qua port:

  • Cấu hình nhanh gọn, đơn giản nhưng không được khuyến nghị chạy cho production
location / {
    index index.php;
    try_files $uri $uri/ /index.php?$args;
}

location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include fastcgi_params;
}

Chạy thông qua socket:

  • Cấu hình phức tạp hơn nhưng bảo đảm hiệu năng khi chạy trên môi trường production

vim /etc/php-fpm.conf

;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

[global]
...
pid = /var/run/php-fpm/php-fpm.pid

...
error_log = /var/log/php-fpm/error.log

...
log_level = warning

...
daemonize = yes

...
include=/etc/php-fpm.d/*.conf

Mở file /etc/php-fpm.d/www.conf và thay đổi lại các dòng sau:

[www]
...
listen = /var/run/php5-fpm.sock

...
listen.owner = nginx
listen.group = nginx

Khi php-fpm được khởi động thì file socket php5-fpm.sock sẽ được tạo ra. Vì vậy chúng ta cần thay đổi quyền của file này sang owner và group nginx lúc đó nginx mới có thể giao tiếp được với file socket này.

Ở file cầu hình nginx chúng ta sẽ thay đổi fastcgi_pass tới file socket chạy php:

location / {
    index index.php;
    try_files $uri $uri/ /index.php?$args;
}

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include fastcgi_params;
}

Cuối cùng chúng ta cần reload 2 dịch vụ này lại là quá trình cài đặt đã hoàn tất

sudo service nginx reload
sudo service php-fpm reload
Loading...