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

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à onetidc thì sẽ gõ lệnh sau:

useradd onetidc

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:

 [botay.com] listen = 127.0.0.1:9002 user = onetidc group = onetidc 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] = $HOSTNAME env[TMP] = /tmp env[TMPDIR] = /tmp env[TEMP] = /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.
  • u
    ser
    : 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 onetidc và group onetidc.

chown -R onetidc:onetidc /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.

[root@lempstack ~]# 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à onetidc). Chỉ vậy thôi, cũng dễ mà đúng không?

Leave your comment