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:
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:
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.