11/08/2018, 20:43

Cấu hình nginx cơ bản - Phần 2

Như đã hứa trong phần 1, trong phần này, tôi sẽ tập trung viết về cấu hình vhost cho nginx và cấu hình php-fpm để vhost xử lý được file php. Vhost viết tắt của virtual host là kỹ thuật cho phép nhiều website có thể chia sẻ chung một IP. Thuật ngữ này bắt nguồn từ apache. Tác giả nginx thì lại ...

Như đã hứa trong phần 1, trong phần này, tôi sẽ tập trung viết về cấu hình vhost cho nginx và cấu hình php-fpm để vhost xử lý được file php.

Vhost viết tắt của virtual host là kỹ thuật cho phép nhiều website có thể chia sẻ chung một IP. Thuật ngữ này bắt nguồn từ apache. Tác giả nginx thì lại thích gọi nó là Server block. Hơi dị nhỉ. Cá nhân tôi vẫn thích cách gọi truyền thống hơn. Trước khi có dịch vụ VPS thì share hosting phát triển rất mạnh. Các share hosting tận dụng các kỹ thuật này để cung cấp chỗ đặt của nhiều website trên webserver.

Nhưng làm cách nào webserver hiểu được request cần đến đâu để đẩy vào website phù hợp ?

Bản thân webserver tất nhiên biết được các host mà nó có. Phía client, khi người dùng nhập một địa chỉ ví dụ www.vhost.example.com domain này được resolve thành IP đến webserver chứa site đó. Bản thân trong http request bắn đến webserver có một trường Host. Ở đây trường này có giá trị www.vhost.example.com (Các bạn capture http request bằng wireshark sẽ thấy) Webserver sẽ đọc giá trị trường này và map nó với server_name của các host nó có. Nếu khớp nó sẽ đẩy request đến vhost đó.

Các file sẽ cấu hình
/usr/local/nginx/conf/nginx.conf - Đây là file cấu hình chung của nginx
/usr/local/nginx/conf.d/vhost.example.com.conf - Đây chính là file cấu hình cho vhost

vi /usr/local/nginx/conf/nginx.conf

user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /usr/local/nginx/conf/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    include /usr/local/nginx/conf.d/*.conf;
}

Hầu hết config trong file này giống như file măc định của nginx. Tôi chỉ sửa đôi chút:

  • Chuyển log vào /var/log/nginx không để trong thư mục cài đặt
  • Chuyển pid file vào /var/run không để trong thư mục cài đặt
  • Bỏ comment dòng log_format
  • Sử dụng đường dẫn tuyệt đối hoàn toàn
  • Thêm dòng include /usr/local/nginx/conf.d/*.conf;
  • Thêm dòng user nginx;

Tạo sẵn một directory để chứa log nginx

mkdir -p /var/log/nginx
chown -R nginx:nginx /var/log/nginx

Tạo directory để chứa config vhost
mkdir -p /usr/local/nginx/conf.d/

vi /usr/local/nginx/conf.d/vhost.example.com.conf

server{
     listen       80;
     server_name vhost.example.com www.vhost.example.com;
     root /home/www/vhost.example.com;
     error_log  /var/log/nginx/vhost.example.com_error.log error;
     access_log  /var/log/nginx/vhost.example.com_access.log  main;
     location /{
         index index.html index.php;
     }
}

Tạo document root cho vhost vhost.example.com

mkdir -p /home/www/vhost.example.com
chown -R nginx:nginx /home/www/vhost.example.com

Chuẩn bị một file html:

vim /home/www/vhost.example.com/test.html
<html><body>test vhost.example.com</body></html>

Trên client, tôi cấu hình trỏ host đơn giản như sau.

vim /etc/hosts
192.168.3.252 vhost.example.com

Trong thực tế, để website có thể được truy cập bởi người dùng trên internet, tôi cần đăng ký IP wan cho webserver, một domain name và cấu hình domain name server để trỏ domain name đã đăng ký về IP wan của webserver.

restart nginx sau đó trên browser tôi gõ:
http://vhost.example.com/test.html
trình duyệt bèn trả lại:

alt text

Bản thân nginx không hỗ trợ xử lý php. Việc xử lý php sẽ do một service khác đảm nhận. Nginx sẽ forward request đến service này và nhận kết quả về. Service này là php-fpm.

Trước hết tôi cần cài php-fpm
yum instal php-fpm

Các file sẽ cấu hình:
/etc/php-fpm.conf
/etc/php-fpm.d/www.conf
/usr/local/nginx/conf.d/vhost.example.com.conf

vim /etc/php-fpm.conf

include=/etc/php-fpm.d/*.conf
[global]
pid = /var/run/php-fpm/php-fpm.pid
error_log = /var/log/php-fpm/error.log
log_level = warning
daemonize = yes

vim /etc/php-fpm.d/www.conf

[www]
listen = /tmp/php_fpm.sock
listen.allowed_clients = 127.0.0.1
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
user = apache
group = apache
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session

Tôi chỉ sửa ba chỗ so với config mặc định của www.conf
listen = /tmp/php_fpm.sock
listen.owner = nginx
listen.group = nginx

Cuối cùng bổ sung vào cuối file /usr/local/nginx/conf.d/vhost.example.com.conf

 location ~ .php {
    fastcgi_pass unix:/tmp/php_fpm.sock;
    fastcgi_index   index.php;
    include         /usr/local/nginx/conf/fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME $document_root/$fastcgi_script_name;
}

Mục đích của đoạn cấu hình trên là: Toàn bộ các request đến các file có tận cùng là php sẽ được đẩy đến unix socket mà php-fpm lắng nghe để biên dịch. Chính vì thế listen.owner và listen.group của unix socket tôi để là nginx:nginx

Chuẩn bị một file php để test

vim /home/www/vhost.example.com/test.php
<?php
echo "test php";
?>

restart nginx và php-fpm service sau đó trên browser tôi gõ:
http://vhost.example.com/test.php
trình duyệt bèn trả lại:
alt text

Kết thúc phần 2, trong phần tiếp, tôi sẽ viết về cách phân quyền thư mục chứa web, basic authentication và giới hạn truy cập đến vhost theo IP.

0