Trang chủ Linux WebserverNGINX LEMP cho VPS [Phần 7] – Sử dụng nhiều user cho PHP-FPM

LEMP cho VPS [Phần 7] – Sử dụng nhiều user cho PHP-FPM

Bởi Thạch Phạm
Ngày đăng: Cập nhật cuối: 2 bình luận 3,1K lượt xem
Bài này thuộc phần 7 của 9 phần trong serie LEMP cho VPS

Trong các bài trước, các bạn có thể thấy mỗi khi tạo VirtualHost thì phải dùng lệnh chown để cho user nginx và group nginx sở hữu thư mục đó, đồng thời chỉnh lại user và group có quyền thực thi PHP-FPM trong file www.conf.

Việc này vô tình gây bất lợi cho bạn nếu như VPS của bạn có nhiều website bởi vì nếu làm như vậy, toàn bộ website sẽ sử dụng chung một user để thực thi PHP-FPM nên nếu user nginx có vấn đề gì về bảo mật thì toàn bộ các website có dùng chung user nginx đều bị ảnh hưởng.

Ở bài này, mình sẽ hướng dẫn bạn cách cấu hình tất cả các website sử dụng chung một user để chạy worker_process nhưng sẽ dùng user riêng để thực thi PHP-FPM cho nhiều website khác nhau.

Cách thức hoạt động

Trước tiên, bạn hãy mở file php.conf trong thư mục /etc/nginx/conf.d/ lên thì sẽ thấy đoạn sau:

fastcgi_pass    127.0.0.1:9000;

Điều này có nghĩa là chúng ta sẽ truyền các file .php vào một proxy của CGI thông qua cổng 9000, và hiện tại chúng ta đang áp dụng cổng 9000 trên toàn bộ website có trên VPS.

Tham số này sẽ trùng với tham số listen = 127.0.0.1:9000 trong file /etc/php-fpm.d/www.conf.

Như vậy, để sử dụng user riêng cho từng website để thực thi file PHP thì chúng ta phải thiết lập mỗi website sẽ sử dụng một proxy khác nhau (ví dụ như 9001, 9002, 9003,…) và mỗi user sẽ đảm nhận quản lý 1 proxy (mặc định chúng ta đã thiết lập user nginx và group nginx quản lý proxy 9000).

Bạn tiếp tục mở file cấu hình chính của PHP-FPM là /etc/php-fpm.conf và nhìn gần đầu file sẽ thấy đoạn này:

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

Điều đó có nghĩa là PHP-FPM cho phép chúng ta sử dụng các file cấu hình riêng được đặt trong thư mục /etc/php-fpm.d/ như file www.conf là file cấu hình riêng mặc định nó tự tạo cho.

Vậy thì chúng ta sẽ làm sao? Đó là chúng ta sẽ tạo ra các file cấu hình riêng đặt trong thư mục /etc/php-fpm.d/ có nội dung giống như file www.conf và chỉ cần sửa lại cổng proxy và user/group sở hữu mà thôi.

Lưu ý trước khi thiết lập

Ở bài này, chúng ta chỉ tạo thêm user/group sở hữu proxy của PHP-FPM.

Để xem user nào mà NGINX đang sở hữu, thì mở file nginx.conf ở dòng đầu tiên bạn sẽ thấy user nginx, tức là user nginx đang sở hữu NGINX.

Hướng dẫn thiết lập

Tạo một user mới

Trước tiên để làm được thì bạn cần tạo ra một user mới. Mặc định khi tạo ra nó sẽ nằm trong group của chính nó (trùng tên).

Chẳng hạn bây giờ mình muốn tạo ra 1 user tên là thachpham thì sẽ gõ lệnh sau:

useradd thachpham

Do user này sẽ xử lý PHP nên chúng ta không cần thiết lập password cho nó đâu.

Xem thêm: Quản lý user trên VPS Linux.

Thêm Virtual Host

Trước tiên, chúng ta tạo thêm một Virtual Host cho VPS, cách thêm Virtual Host mình đã nói ở bài trước rồi nhưng mình cũng sẽ làm lại.

Ở đây mình muốn thêm một Virtual Host với domain là botay.com thì đầu tiên là tạo thư mục cho Virtual Host.

mkdir -p /home/nginx/botay.com/log
touch /home/nginx/botay.com/log/error.log
mkdir -p /home/nginx/botay.com/public_html

Kế tiếp là copy file cấu hình VirtualHost của một domain nào đó mà bạn đang có trong /etc/nginx/domains/. Chẳng hạn mình đang có sẵn file cấu hình abcxyz.com.conf thì sẽ copy từ file này và đổi tên nó thành botay.com.conf.

cp /etc/nginx/domains/abcxyz.com.conf /etc/nginx/domains/botay.com.conf

Hãy kiểm tra lại ai đang sở hữu thư mục đó bằng cách chạy lệnh sau:

chown-userfolder

Tạo thêm PHP-FPM Proxy

Như mình đã nói ở trên, mặc định file /etc/php-fpm.conf tự nạp cấu hình của toàn bộ file có đuôi là .conf trong thư mục /etc/php-fpm.d/ nên bây giờ bạn chỉ cần tạo một file .conf tên bất kỳ trong đó. Chẳng hạn mình sẽ tạo một file là /etc/php-fpm.d/botay.conf.

Nội dung file đó bạn đặt đoạn này vào:

listen = 127.0.0.1:9002
user = thachpham
group = thachpham
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/slowlog-botay.log
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 5
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 200
listen.backlog = -1
pm.status_path = /status
request_terminate_timeout = 120s
rlimit_files = 131072
rlimit_core = unlimited
catch_workers_output = yes
env = $HOSTNAME
env = /tmp
env = /tmp
env = /tmp

Những dòng mình in đậm là cần các bạn sửa lại. Cụ thể:

  • listen: Bạn chỉ cần đổi cái port của nó, bạn có thể đổi sang 1 port bất kỳ, miễn là không va chạm với các port của những ứng dụng khác. Ví dụ mình thiết lập port proxy cho nó là 9001.
  • user: tên user sở hữu proxy này.
  • group: tên group sở hữu proxy này.

Lưu lại file này.

Cấu hình lại file VirtualHost

Bây giờ hãy mở file botay.com.conf ra, tìm dòng:

include /etc/nginx/conf.d/php.conf;

Thay thành


location ~* \.php$ {
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9002;
#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;

# Thiết lập timeout cho proxy
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 512k;
fastcgi_buffers 512 16k;
fastcgi_busy_buffers_size 512k;
fastcgi_temp_file_write_size 512k;
fastcgi_intercept_errors on;
}

Chỗ mình in đậm là cần bạn sửa, hãy sửa lại port cho trùng với port mà bạn đã thiết lập cho file /etc/php-fpm.d/botay.conf.

Đừng quên sửa luôn 2 đoạn server_nameroot để thiết lập đường dẫn cho VirtualHost này nhé.

Bây giờ file /etc/nginx/domains/botay.com.conf của mình là như thế này (nếu hỏi tại sao mình đặt listen là port 8080 cho VirtualHost thì xem lại bài Varnish):

server {
listen 8080;
server_name www.botay.com botay.com;

#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
error_log /home/nginx/botay.com/log/error.log error;

root /home/nginx/botay.com/public_html;

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

location ~* \.php$ {
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9002;
#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;

# Thiết lập timeout cho proxy
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 512k;
fastcgi_buffers 512 16k;
fastcgi_busy_buffers_size 512k;
fastcgi_temp_file_write_size 512k;
fastcgi_intercept_errors on;
}
include /etc/nginx/conf.d/staticfiles.conf;
include /etc/nginx/conf.d/block.conf;
include /home/nginx/abcxyz.com/public_html/nginx.conf;
}

Bây giờ thì hãy restart lại NGINX và PHP-FPM.

service nginx restart
service php-fpm restart

Để kiểm tra xem nó có hoạt động hay không, bạn cứ thử đặt 1 file .php đơn giản vào thư mục public_html của domain này rồi chạy. Nếu nó xử lý được thì oke.

Đây là 1 mẫu file PHP cực đơn giản.


<?php
for ($i = 1; ; $i++) {
if ($i > 10) {
break;
}
echo $i;
}
?>

Và một việc vô cùng quan trọng, đó là cấp quyền sở hữu thư mục /home/nginx/botay.com/ cho user thachpham và group thachpham.

chown -R thachpham:thachpham /home/nginx/botay.com

Sau đó chạy file này, nếu file PHP này xử lý thành công thì bạn đã làm thành công. Đồng thời gõ lệnh netstat -ntlup để kiểm tra các port đang được thực thi, bạn sẽ thấy port 9002 đang chạy.

# netstat -ntlup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 0.0.0.0:8080                0.0.0.0:*                   LISTEN      6403/nginx
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      3795/varnishd
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      866/sshd
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      942/master
tcp        0      0 127.0.0.1:6082              0.0.0.0:*                   LISTEN      3794/varnishd
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      6420/php-fpm
tcp        0      0 127.0.0.1:9001              0.0.0.0:*                   LISTEN      6420/php-fpm
tcp        0      0 127.0.0.1:9002              0.0.0.0:*                   LISTEN      6420/php-fpm
tcp        0      0 :::80                       :::*                        LISTEN      3795/varnishd
tcp        0      0 :::22                       :::*                        LISTEN      866/sshd
tcp        0      0 ::1:25                      :::*                        LISTEN      942/master
tcp        0      0 :::3306                     :::*                        LISTEN      4295/mysqld

Và sau này để tránh bị lỗi phân quyền, nếu cần sửa hay thao tác tập tin trong này thì bạn hãy đăng nhập bằng user mà nó đang sổ hữu thư mục này (ví dụ trong bài này là thachpham). Chỉ vậy thôi, cũng dễ mà đúng không?

Đánh giá nội dung này

Tham gia nhóm hỗ trợ WordPress

Tham gia nhóm Hỗ trợ Server - Hosting & WordPress để cùng nhau hỏi đáp và hỗ trợ các vấn đề về WordPress, tối ưu máy chủ/server.

Tham gia ngay
2 bình luận

Có thể bạn quan tâm

Hiện tại blog tạm đóng bình luận vì mình cần tập trung thời gian vào cập nhật bài viết. Bình luận sẽ mở ra cho đến khi mình sẵn sàng.