Chạy nhiều website trên một VPS với Nginx server block và SSL riêng
Chạy nhiều website trên một VPS giúp tiết kiệm chi phí: mỗi tên miền có thư mục, cơ sở dữ liệu và chứng chỉ SSL riêng, cùng dùng chung tài nguyên máy chủ. Bài viết hướng dẫn cấu hình Nginx server block cho từng tên miền trên Ubuntu, kèm cách tách quyền để website này không đọc được dữ liệu website kia.
Chuẩn bị
- VPS đã cài Nginx, PHP-FPM và MariaDB. Nếu chưa, làm theo bài cài LEMP trên Ubuntu 22.04.
- Các tên miền đã trỏ bản ghi A về IP VPS. Xem cách trỏ tên miền.
Bước 1: Tạo thư mục cho từng website
mkdir -p /var/www/site1.com/public /var/www/site2.com/public
echo "Site 1" > /var/www/site1.com/public/index.html
echo "Site 2" > /var/www/site2.com/public/index.html
Bước 2: Tạo server block cho mỗi tên miền
nano /etc/nginx/sites-available/site1.com
server {
listen 80;
server_name site1.com www.site1.com;
root /var/www/site1.com/public;
index index.php index.html;
access_log /var/log/nginx/site1.com.access.log;
error_log /var/log/nginx/site1.com.error.log;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
location ~ /\.(?!well-known) { deny all; }
}
Làm tương tự cho site2.com, đổi server_name, root và tên file log. Kiểm tra đúng tên socket PHP-FPM bằng ls /run/php/.
ln -s /etc/nginx/sites-available/site1.com /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/site2.com /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
Bước 3: Cơ sở dữ liệu riêng cho từng website
mysql -e "CREATE DATABASE site1 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -e "CREATE USER 'site1'@'localhost' IDENTIFIED BY 'MatKhauManh1';"
mysql -e "GRANT ALL ON site1.* TO 'site1'@'localhost'; FLUSH PRIVILEGES;"
Mỗi website một tài khoản cơ sở dữ liệu: website này bị lộ mật khẩu cũng không đụng được dữ liệu website khác.
Bước 4: Tách quyền bằng PHP-FPM pool (khuyên dùng)
Mặc định mọi website PHP chạy chung tài khoản www-data, một website bị hack có thể đọc file của website khác. Tạo người dùng và pool riêng:
useradd -M -s /usr/sbin/nologin site1
chown -R site1:site1 /var/www/site1.com
cp /etc/php/8.1/fpm/pool.d/www.conf /etc/php/8.1/fpm/pool.d/site1.conf
nano /etc/php/8.1/fpm/pool.d/site1.conf
Sửa các dòng sau trong site1.conf:
[site1]
user = site1
group = site1
listen = /run/php/php8.1-fpm-site1.sock
listen.owner = www-data
listen.group = www-data
systemctl restart php8.1-fpm
Rồi đổi fastcgi_pass trong server block của site1 sang unix:/run/php/php8.1-fpm-site1.sock, chạy nginx -t && systemctl reload nginx. Thư mục cần cho Nginx đọc file tĩnh: chmod 750 /var/www/site1.com và thêm www-data vào nhóm site1 (usermod -aG site1 www-data).
Bước 5: SSL cho từng tên miền
certbot --nginx -d site1.com -d www.site1.com
certbot --nginx -d site2.com -d www.site2.com
certbot renew --dry-run
Một VPS chạy được bao nhiêu website?
Phụ thuộc lượng truy cập và loại website hơn là số lượng. Vài website WordPress ít truy cập chạy tốt trên VPS 2 GB RAM; website đông khách hoặc cửa hàng nên tính thêm tài nguyên. Theo dõi tải bằng các lệnh trong bài kiểm tra CPU, RAM, ổ đĩa VPS Linux.
Kết luận
Mỗi tên miền một server block, một cơ sở dữ liệu, một pool PHP-FPM là cách quản lý nhiều website gọn gàng và an toàn trên một VPS. Nếu không muốn tự quản trị máy chủ, Reseller Hosting cho bạn tạo nhiều tài khoản cPanel tách biệt sẵn. Còn muốn toàn quyền, chọn Cloud VPS.
Bạn thấy bài viết này hữu ích?
Chia sẻ lên Facebook