NỘI DUNG
I. Giới thiệu
Khi phần cứng máy chủ trở nên nhanh hơn và hiệu quả hơn, việc lưu trữ nhiều trang web trên máy chủ web Nginx không còn là vấn đề nữa. Tuy nhiên để có hiệu suất tốt hơn, phân bổ quy trình và bảo mật, thì bạn hãy cân nhắc sử dụng các nhóm PHP FastCGI Process Manager (PHP-FPM) riêng biệt cho từng trang web của bạn.
Bài viết này mô tả những điều cơ bản của việc sử dụng nhóm PHP-FPM riêng biệt cho nhiều trang web trên Nginx với PHP 7.4 cấu hình trên Ubuntu 20.04.
II. Yêu cầu
- Sử dụng root hoặc sudo root
- Máy chủ đã cài đặt lemp stack (Linux + Nginx+ MySQL/MariaDB + PHP)
- Tạo 2 record A tương ứng cho 2 website và trỏ về IP máy chủ
- wesbite1.dotrungquan.site
- website2.dotrungquan.site
III. Cấu hình
1. Xoá trang website mặc định
Nginx cài đặt một trang web mặc định không cần thiết vì vậy bạn hãy xoá nó đi. Để xóa trang web mặc định bạn sử dụng lệnh sau.
rm -rf /etc/nginx/sites-enabled/default
2. Tạo user cho trang web
Mỗi trang web cần chạy với tư cách người dùng khác nhau vì mục đích bảo mật và độc lập. Vì vậy bạn hãy tạo 2 tài khoản người dùng và chỉ định người dùng www-data
cho các nhóm tương ứng.
Điều này cho phép máy chủ web tương tác với người dùng và ngược lại. Không cấp cho người dùng website1
và website2
đặc quyền đăng nhập hoặc liên kết bất kỳ thông tin nào khác với tài khoản. Để tạo người dùng, hãy chạy lệnh sau
useradd website1 useradd website2 usermod -a -G website1 www-data usermod -a -G website2 www-data
3. Chỉ định quyền cho thư mục web
Tiếp theo bạn hãy tạo 2 thư mục cho 2 web riêng biệt và gán quyền như sau
mkdir /var/www/website1 chown -R website1:website1 /var/www/website1 mkdir /var/www/website2 chown -R website2:website2 /var/www/website2 chmod 770 /var/www/website1 chmod 770 /var/www/website2
Các quyền của Unix là 770. Mỗi người dùng và nhóm liên kết của người dùng có đầy đủ quyền (7) trên thư mục. Cài đặt này hạn chế người dùng website1
xem dữ liệu cho website2
và ngược lại.
4. Tạo PHP-FPM Pools mới
Bạn hãy copy pools php mặc định ra làm 2 bản, tương ứng của 2 web.
cp /etc/php/7.4/fpm/pool.d/www.conf /etc/php/7.4/fpm/pool.d/fpm-website1.conf cp /etc/php/7.4/fpm/pool.d/www.conf /etc/php/7.4/fpm/pool.d/fpm-website2.conf
Xoá bỏ pool cũ không sử dụng đi
rm -rf /etc/php/7.4/fpm/pool.d/www.conf
5. Cấu hình Pool
Mỗi groups sẽ có user liên kết với Unix socket. Vì vậy bạn cần mở từng file và sửa lại tương ứng như sau.
5.1. Cấu hình Pool website1
vi /etc/php/7.4/fpm/pool.d/fpm-website1.conf
Thay đổi các dòng sau:
- Thay đổi dòng trên cùng, bên trong dấu ngoặc từ
[www]
sang[website1]
- Thay đổi dòng
user = www-data
thànhuser = website1
- Thay đổi dòng
group = www-data
thànhgroup = website1
- Thay đổi dòng
listen = /run/php/php7.4-fpm.sock
thànhlisten = /run/php/php7.4-website1-fpm.sock
Sau khi thay đổi hoàn tất, bạn save lại file cấu hình và thực hiện tiếp với Pool ở website2.
5.2. Cấu hình Pool website2
vi /etc/php/7.4/fpm/pool.d/fpm-website2.conf
Thay đổi các dòng sau:
- Thay đổi dòng trên cùng, bên trong dấu ngoặc từ
[www]
sang[website2]
- Thay đổi dòng
user = www-data
thànhuser = website
2 - Thay đổi dòng
group = www-data
thànhgroup = website2
- Thay đổi dòng
listen = /run/php/php7.4-fpm.sock
thànhlisten = /run/php/php7.4-website2-fpm.sock
6. Khởi động lại PHP-FPM
Bạn hãy khởi động lại php-fpm để áp dụng thay đổi.
service php7.4-fpm restart
Kiểm tra pool của PHP-FPM. Nếu cấu hình chính xác bạn sẽ thấy các nhóm như sau với các pool đã tạo.
root@sv:~# service php7.4-fpm status ● php7.4-fpm.service - The PHP 7.4 FastCGI Process Manager Loaded: loaded (/lib/systemd/system/php7.4-fpm.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2021-09-05 07:03:35 CEST; 10s ago Docs: man:php-fpm7.4(8) Process: 15541 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/7.4/fpm/pool.d/www.conf 74 (code=exited, status=0/SUCCESS) Main PID: 15526 (php-fpm7.4) Status: "Processes active: 0, idle: 4, Requests: 0, slow: 0, Traffic: 0req/sec" Tasks: 5 (limit: 1074) Memory: 7.8M CGroup: /system.slice/php7.4-fpm.service ├─15526 php-fpm: master process (/etc/php/7.4/fpm/php-fpm.conf) ├─15537 php-fpm: pool website1 ├─15538 php-fpm: pool website1 ├─15539 php-fpm: pool website2 └─15540 php-fpm: pool website2
Vì bạn đang kết nối qua sock, không còn kết nối qua TCP nữa. Vì vậy bạn không thể kiểm tra qua lệnh netstat
mà hãy sử dụng ps aux
để check tiến trình.
Ví dụ:
root@sv:~# ps aux | grep php root 15526 0.0 1.9 198484 19452 ? Ss 07:03 0:00 php-fpm: master process (/etc/php/7.4/fpm/php-fpm.conf) website1 15537 0.0 1.4 198876 14336 ? S 07:03 0:00 php-fpm: pool website1 website1 15538 0.0 1.2 198876 12404 ? S 07:03 0:00 php-fpm: pool website1 website2 15539 0.0 0.6 198876 6920 ? S 07:03 0:00 php-fpm: pool website2 website2 15540 0.0 1.4 198876 14324 ? S 07:03 0:00 php-fpm: pool website2 root 16993 0.0 0.0 8900 724 pts/1 S+ 07:37 0:00 grep --color=auto php
7. Tạo file cấu hình website Nginx
Máy chủ cần hai trang web mới để sử dụng hai nhóm PHP-FPM, một trang được liên kết với mỗi nhóm tương ứng.
1. Tạo website1
Bạn hãy sử dụng lệnh sau để tạo file mới.
vi /etc/nginx/sites-available/website1
Lưu ý: Thay server_name website1.dotrungquan.site;
bằng server_name của bạn
server { server_name website1.dotrungquan.site; access_log /var/log/nginx/website1.access.log; error_log /var/log/nginx/website1.error.log; root /var/www/website1; index index.php; try_files $uri $uri/ /index.php?$query_string; location ~ \.php$ { fastcgi_pass unix:/run/php/php7.4-website1-fpm.sock; include snippets/fastcgi-php.conf; } }
Trong đó:
- server_name – Tên domain/sub của site 1
- access_log – đường dẫn của file access_log
- error_log – đường dẫn của file error log
- root – đường dẫn mã nguồn
- fastcgi_pass – đường dẫn của file sock php-fpm
2. Tạo website2
vi /etc/nginx/sites-available/website2
Lưu ý: Thay server_name website2.dotrungquan.site;
bằng server_name của bạn
server { server_name website2.dotrungquan.site; access_log /var/log/nginx/website2.access.log; error_log /var/log/nginx/website2.error.log; root /var/www/website2; index index.php; try_files $uri $uri/ /index.php?$query_string; location ~ \.php$ { fastcgi_pass unix:/run/php/php7.4-website2-fpm.sock; include snippets/fastcgi-php.conf; } }
Trong đó:
- server_name – Tên domain/sub của site 2
- access_log – đường dẫn của file access_log
- error_log – đường dẫn của file error log
- root – đường dẫn mã nguồn
- fastcgi_pass – đường dẫn của file sock php-fpm
8. Tạo liên kết
ln -s /etc/nginx/sites-available/website1 /etc/nginx/sites-enabled/website1 ln -s /etc/nginx/sites-available/website2 /etc/nginx/sites-enabled/website2
Khởi động lại nginx
service nginx restart
9. Kiểm tra file cấu hình
Bây giờ mình sẽ tạo mới một file php để kiểm tra như sau.
vi /var/www/website1/index.php
Sau đó bạn dán mã bên dưới vào và lưu lại file
<?php phpinfo(); ?>
Bạn hãy truy cập vào trình duyệt để kiểm tra. Nếu xuất hiện ra thông tin có nghĩa bạn đã cấu hình và đã hoạt động.
Việc tạo các nhóm PHP-FPM riêng biệt cho mỗi trang web được phục vụ trên một máy chủ duy nhất mang lại cho quản trị viên sự bảo mật mạnh mẽ hơn, ranh giới xác định hơn và giúp dễ dàng khắc phục sự cố liên quan đến các trang web riêng lẻ.
Cũng có thể điều chỉnh cài đặt trang web riêng lẻ cho hiệu suất. Các cài đặt này nằm trong tệp cấu hình /etc/php/7.4/fpm/pool.d
. Cài đặt chính thường bị thay đổi là cài đặt chiều, kiểm soát quá trình tạo, với các cài đặt dynamic, static hoặc ondemand.
Chúc bạn thực hiện thành công.