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.

Bài liên quan

[BÀI 33] HƯỚNG DẪN VIẾT MỘT TRANG WEB CƠ BẢN (PHẦN 2: TẠO CHỨC NĂNG ĐĂNG NHẬP)

Trong bài số 32, chúng ta đã cơ bản hoàn tất các cấu trúc file của 1 trang web và giao diện của trang chủ. Ở bài này tôi sẽ hướng dẫn các bạn tạo giao diện trang admin, và viết chức năng đăng nhập theo mô hình MVC hướng đối tượng. Phần 1: tạo giao diện trang admin: Trong thư mục admin/view/ ...

Trịnh Tiến Mạnh viết 17:02 ngày 04/10/2018

Các kỹ thuật phân tích động mức cơ bản (Phần 2)

Tiếp tục chuyên đề các kỹ thuật phân tích động mức cơ bản, ở phần cuối này chuyên gia an ninh mạng Bùi Đình Cường sẽ giới thiệu đến các bạn đọc các nội dung như: so sánh sự thay đổi của công cụ Registry so với công cụ Regshot, các phương pháp giả lập mạng. So sánh sự thay đổi Registry ...

Trịnh Tiến Mạnh viết 14:57 ngày 18/09/2018

Kỹ thuật phân tích tĩnh cơ bản (Phần 2) – Liên kết động, runtime…

Tiếp tục chuyên đề kỹ thuật phân tích tĩnh cơ bản ở bài viết này thì chuyên gia an ninh mạng Bùi Đình Cường sẽ gửi đến bạn đọc các thư viện và hàm liên kết, cách phân biệt liên kết tĩnh, liên kết runtime và liên kết động, đồng thời cũng nhận biết được thế nào là các hàm được import các hàm được ...

Hoàng Hải Đăng viết 14:52 ngày 18/09/2018

Hướng dẫn tự học Tensorflow cơ bản - Phần 2 - Linear Regression

Tiếp tục với series về Tensorflow của Toàn. Chúng ta sẽ đến với một bài hướng dẫn về giải thuật Linear Regression thực hiện trên framework Tensorflow Linear Regression là một thuật toán cơ bản nhất mà ai khi mới bắt đầu bước chân vào lĩnh vực Machine Learning cũng đều đã từng học qua. Tuy ...

Trịnh Tiến Mạnh viết 08:31 ngày 07/09/2018

React cơ bản (Phần 2 - Lifecycle methods)

Xin chào các bạn, trong phần 1 react cơ bản, mình đã giới thiệu cho mọi người những khái niệm cơ bản nhất của react, bằng ví dụ sinh động và thực tế để mọi người dễ hiểu hơn. Phần một các bạn đã học và hiểu cách sử dụng của hai khái niệm rất quan trọng trong react đó là State và Prop, trong phần ...

Tạ Quốc Bảo viết 17:59 ngày 12/08/2018
0