Nginx là một web server chất lượng và hiệu quả, được sử dụng rộng rãi có thể hoạt động như một reverse proxy. Khi kết hợp với Apache, nó có thể cung cấp hiệu suất tốt hơn và tăng tính linh hoạt để phục vụ nội dung web. Trong bài viết này, Vietnix sẽ hướng dẫn bạn cách cấu hình Nginx làm web server và reverse proxy cho Apache trên Ubuntu 20.04.
Yêu cầu để cấu hình Nginx làm web server và reverse proxy cho Apache trên Ubuntu 20.04.
Để thực hiện hướng dẫn này, bạn cần có:
- Một máy chủ Ubuntu 20.04 với một user non-root có quyền sudo và firewall.
- 4 tên miền được cấu hình để trỏ đến địa chỉ IP cho server của bạn. Nếu bạn lưu trữ DNS của tên miền của mình ở nơi khác, bạn nên tạo các bản ghi A phù hợp ở đó.
Nếu bạn cần tên miền và máy chủ Ubuntu để cài đặt Nginx, hãy tham khảo đăng ký tên miền và VPS Server tại Vietnix. Vietnix hiện đang cung cấp dịch vụ đăng ký tên miền và cho thuê các gói VPS hỗ trợ hệ điều hành Ubuntu với nhiều cấu hình và chi phí hợp lý giúp bạn dễ dàng lựa chọn gói dịch vụ phù hợp với nhu cầu sử dụng.
Thuê VPS của Vietnix giúp bạn yên tâm cài đặt, triển khai các ứng dụng nhờ tốc độ cao, ổn định và bảo mật an toàn. Liên hệ ngay với Vietnix để được tư vấn chi tiết.
Bước 1: Cài đặt Apache và PHP-FPM
Đầu tiên, cập nhật danh sách gói:
sudo apt update
Tiếp theo cài đặt gói Apache và PHP-FPM:
sudo apt install apache2 php-fpm
Module FastCGI Apache sẽ không có sẵn trong kho lưu trữ Ubuntu nên phải tải từ kernel.org và cài đặt bằng câu lệnh dpkg
wget https://mirrors.edge.kernel.org/ubuntu/pool/multiverse/liba/libapache-mod-fastcgi/libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb
sudo dpkg -i libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb
Bước 2: Cấu hình Apache và PHP-FPM
Bạn đổi cổng Apache sang 8080
và cấu hình để làm việc với PHP-FPM bằng cách sửu dụng module mod_fastcgi
. Đổi tên file cấu hình ports.conf
của Apache bằng:
sudo mv /etc/apache2/ports.conf /etc/apache2/ports.conf.default
Tạo mới một file ports.conf
với cổng 8080
:
echo "Listen 8080" | sudo tee /etc/apache2/ports.conf
Lưu ý: Những web server thường được thiết lập để bắt các sự kiện trên địa chỉ 127.0.0.1:8080
khi cấu hình một reverse proxy. Tuy nhiên việc này sẽ thiết lập giá trị của biến môi trường SERVER_ADDR
của PHP thành địa chỉ IP loopback thay vì địa chỉ IP public của server. Để thiết lập Apache sao cho các trang web của nó không nhìn thấy một reverse proxy đặt trước nó, bạn cần cấu hình nó lắng nghe tại cổng 8080
trên tất cả các địa chỉ IP.
Tiếp theo tạo một file virtual server cho Apache, chỉ thị <VirtualHost>
trong tệp này sẽ được đặt để chỉ phục vụ các trang web trên cổng 8080
.
Vô hiệu hoá virtual server mặc định:
sudo a2dissite 000-default
Tiếp theo, tạo một file virtual server mới:
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/001-default.confsudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/001-default.conf
Mở file cấu hình mới bằng cách:
sudo nano /etc/apache2/sites-available/001-default.conf
Đổi listening port sang 8080
:
<VirtualHost *:8080>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Lưu và kích hoạt các cài đặt mới:
sudo a2ensite 001-default
Reload Apache:
sudo systemctl reload apache2
Cài đặt gói net-tools
chứa lệnh netstat
:
sudo apt install net-tools
Xác nhận lại rằng Apache đang listening trên cổng 8080
:
Kết quả sẽ hiển thị ra như sau, với apache2
đang listen trên cổng 8080
:
Output
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:22 0.0.0.0:* LISTEN 1086/sshd
tcp6 0 0 :::8080 :::* LISTEN 4678/apache2
tcp6 0 0 :::22 :::* LISTEN 1086/sshd
Xem thêm: Cách cài đặt Nginx trên Ubuntu 20.04
Bước 3: Cấu hình Apache để sử dụng mod_fastcgi
Apache phục vụ các trang PHP bằng cách sử dụng mod_php
theo mặc định, để hoạt động với PHP-FPM bạn cần cấu hình một số chi tiết.
Lưu ý: Nếu bạn đang thực hiện trên bản cài đặt LAMP với mod_php
thì trước tiên phải dùng sudo a2dismod php7.4
để tắt nó.
Bạn sẽ thêm khối cấu hình cho mod_fastcgi
, khối này phụ thuộc vào mod_action
. Theo mặc định, mod_action
sẽ bị vô hiệu hoá, vì vậy trước tiên bạn hãy bật nó lên bằng cách:
sudo a2enmod actions
Đổi tên file cấu hình FastCGI có sẵn:
sudo mv /etc/apache2/mods-enabled/fastcgi.conf /etc/apache2/mods-enabled/fastcgi.conf.default
Tạo mới một file cấu hình:
sudo nano /etc/apache2/mods-enabled/fastcgi.conf
Thêm các lệnh sau vào file để chuyển tiếp các yêu cầu cho file .php
sang socket UNIX PHP-FPM.
<IfModule mod_fastcgi.c>
AddHandler fastcgi-script .fcgi
FastCgiIpcDir /var/lib/apache2/fastcgi
AddType application/x-httpd-fastphp .php
Action application/x-httpd-fastphp /php-fcgi
Alias /php-fcgi /usr/lib/cgi-bin/php-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php-fcgi -socket /run/php/php7.4-fpm.sock -pass-header Authorization
<Directory /usr/lib/cgi-bin>
Require all granted
</Directory>
</IfModule>
Lưu các thay đổi và chạy thử để kiểm tra:
sudo apachectl -t
Lưu ý: Bạn hãy bỏ qua các cảnh báo: Could not reliably determine the server's fully / qualified domain name, using 127.0.1.1. Set the /'ServerName' directive globally/ to suppress this message
. Bạn sẽ cấu hình tên server ở các bước sau.
Tải lại Apache khi dòng chữ Syntax OK
hiển thị:
sudo systemctl reload apache2
Bước 4: Xác minh lại các chức năng PHP
Đảm bảo rằng PHP hoạt động bằng cách tạo tệp phpinfo()
và truy cập file đó từ trình duyệt web.
Tạo một tệp /var/www/html/info.php
, nó sẽ chứa lệnh gọi hàm phpinfo
:
echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
Lưu ý rằng nếu bạn đã làm theo thiết lập server ban đầu trong phần yêu cầu thì có thể bạn đã bật firewall Apache. Đảm bảo bạn có thể truy cập IP của mình trên cổng 8080
(hiện không thể truy cập được). Bạn sẽ hạn chế quyền truy cập công khai vào cổng này trong Bước 10.
Cho phép cổng 8080
thông qua firewall:
sudo ufw allow 8080
Đảm bảo lưu lượng truy cập TLS trên cổng 443
có thể vào.
Chấp nhận Apache Full kiểm soát lưu lượng truy cập trên cổng 80
và 443
:
sudo ufw allow "Apache Full"
Kiểm tra lại trạng thái firewall:
sudo ufw status
Kết quả sẽ hiển thị ra như sau:
Output
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Apache Full ALLOW Anywhere
8080 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apache Full (v6) ALLOW Anywhere (v6)
8080 (v6) ALLOW Anywhere (v6)
Bạn sẽ thấy rằng cổng 8080
và Apache Full
đã được cho phép thông qua firewall. Bây giờ hãy xem trang info.php
Để kiểm tra trang info.php
trên trình duyệt, hãy đi đến http://your_server_ip:8080/info.php
. Nó sẽ hiển thị list các hiệu chỉnh cài đặt PHP đang sử dụng:
Kiểm tra xem Server API có ghi FPM/FastCGI không, tiếp đến, phần PHP Variables sẽ cho bạn biết SERVER_SOFTWARE là Apache trên Ubuntu. Chúng xác nhận rằng mod_fastcgi
đang hoạt động và Apache đang sử dụng PHP-FPM để xử lí các tệp PHP.
Bước 5: Tạo virtual server cho Apache
Hãy tạo virtual server Apache cho tên miền apache1.your_domain
và apache2.your_domain
. Để làm được điều này, đầu tiên bạn tạo một thư mục gốc cho cả hai trang web và đặt một số tệp mặc định vào các thư mục đó để bạn có thể dễ dàng hơn trong việc kiểm tra cấu hình.
sudo mkdir -v /var/www/apache1.your_domain /var/www/apache2.your_domain
Tạo file index
cho từng site:
echo "<h1 style='color: green;'>Apache 1</h1>" | sudo tee /var/www/apache1.your_domain/index.html
echo "<h1 style='color: red;'>Apache 2</h1>" | sudo tee /var/www/apache2.your_domain/index.html
Sau đó, tạo file phpinfo()
cho từng trang web để có thể kiểm tra xem PHP có được cấu hình đúng hay không:
echo "<?php phpinfo(); ?>" | sudo tee /var/www/apache1.your_domain/info.php
echo "<?php phpinfo(); ?>" | sudo tee /var/www/apache2.your_domain/info.php
Tạo file virtual server cho apache1.your_domain
:
sudo nano /etc/apache2/sites-available/apache1.your_domain.conf
Thêm đoạn code sau vào file để định nghĩa virtual server:
<VirtualHost *:8080>
ServerName apache1.your_domain
ServerAlias www.apache1.your_domain
DocumentRoot /var/www/apache1.your_domain
<Directory /var/www/apache1.your_domain>
AllowOverride All
</Directory>
</VirtualHost>
Dòng AllowOverride All
cho phép bật tính năng hỗ trợ .htaccess
.
Lưu và đóng file. Sau đó, tạo một cấu hình tương tự cho apache2.your_domain
. Trước tiên, tạo file:
sudo nano /etc/apache2/sites-available/apache2.your_domain.conf
Sau đó, thêm cấu hình sau vào file:
/etc/apache2/sites-available/apache2.<^>your_domain<^>.conf
<VirtualHost *:8080>
ServerName apache2.your_domain
ServerAlias www.apache2.your_domain
DocumentRoot /var/www/apache2.your_domain
<Directory /var/www/apache2.your_domain
AllowOverride All
</Directory>
</VirtualHost>
Lưu file và thoát khỏi trình soạn thảo.
Sau khi 2 virtual host Apache đã thiết lập, bạn kích hoạt các trang web bằng lệnh a2ensite
. Lệnh này sẽ tạo một liên kết tượng trưng đến tệp virtual host trong thư mục sites-enabled
:
sudo a2ensite apache1.your_domain
sudo a2ensite apache2.your_domain
Kiểm tra lại Apache để xem có lỗi cấu hình không bằng cách chạy lệnh sau:
sudo apachectl -t
Nếu không có lỗi, bạn sẽ thấy “Syntax OK
” được hiển thị. Nếu bạn thấy bất kỳ thông báo nào khác, hãy xem lại cấu hình và thử lại.
Reload lại Apache để áp dụng các thay đổi sau khi cấu hình của bạn không có lỗi:
sudo systemctl reload apache2
Để xác nhận các trang web hoạt động, hãy mở http://apache1.your_domain:8080
và http://apache2.your_domain:8080
trong trình duyệt của bạn và xác nhận rằng mỗi trang web hiển thị tệp index.html
của riêng mình. Bạn sẽ thấy các kết quả sau đây:
Bạn sẽ thấy cùng một danh sách thông số cấu hình PHP trên mỗi trang web như bạn đã thấy trong Bước 4.
Bước 6: Cài đặt và cấu hình Nginx
Ở bước này, bạn sẽ cài đặt Nginx và cấu hình các tên miền nginx1.your_domain
và nginx2.your_domain
như các server ảo của Nginx.
Cài đặt Nginx bằng trình quản lý gói apt
:
sudo apt install nginx
Sau đó, xóa liên kết tượng trưng của server ảo mặc định vì bạn sẽ không sử dụng nó nữa:
sudo rm /etc/nginx/sites-enabled/default
Sau đó, bạn hãy tạo một trang web mặc định riêng của bạn (nginx1.your_domain
).
Bây giờ bạn sẽ tạo các server ảo cho Nginx sử dụng chung phương thức mà bạn đã dùng cho Apache. Đầu tiên tạo thư mục root cho cả hai trang web:
sudo mkdir -v /usr/share/nginx/nginx1.your_domain /usr/share/nginx/nginx2.your_domain
Bạn sẽ lưu trữ các trang web Nginx trong thư mục /usr/share/nginx
, đây là thư mục mặc định mà Nginx thường muốn được lưu trữ. Bạn có thể lưu trữ chúng dưới thư mục /var/www/html
cùng với các trang web Apache, nhưng việc phân tách này có thể khiến bạn liên kết các trang web với Nginx.
Tương tự với cách bạn đã làm với các server ảo của Apache, hãy tạo các tệp index
và phpinfo()
để kiểm tra sau khi hoàn thành cài đặt:
echo "<h1 style='color: green;'>Nginx 1</h1>" | sudo tee /usr/share/nginx/nginx1.your_domain/index.html
echo "<h1 style='color: red;'>Nginx 2</h1>" | sudo tee /usr/share/nginx/nginx2.your_domain/index.html
echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/nginx1.your_domain/info.php
echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/nginx2.your_domain/info.php
Bây giờ bạn tạo một virtual server cho cho miền nginx1.your_domain
:
sudo nano /etc/nginx/sites-available/nginx1.your_domain
Nginx xem server {. . .}
như là các khu vực của tệp cấu hình các khối server. Tạo một server block cho virtual server chính là nginx1.your_domain
. Chỉ thị cấu hình default_server
làm cho đây là virtual host mặc định xử lý các yêu cầu HTTP không phù hợp với bất kỳ virtual host nào khác. Cấu hình chỉ thị default_server
khiến cho đây trở thành virtual server mặc định xử lí các yêu cầu HTTP mà không phù hợp với bất kì với virtual server nào khác.
server {
listen 80 default_server;
root /usr/share/nginx/nginx1.your_domain;
index index.php index.html index.htm;
server_name nginx1.your_domain www.nginx1.your_domain;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
include snippets/fastcgi-php.conf;
}
}
Lưu và đóng file. Tạo file virtual server cho miền thứ hai của Nginx, nginx2.your_domain
:
sudo nano /etc/nginx/sites-available/nginx2.your_domain
Thêm những câu lệnh dưới đây vào file:
server {
root /usr/share/nginx/nginx2.your_domain;
index index.php index.html index.htm;
server_name nginx2.your_domain www.nginx2.your_domain;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
include snippets/fastcgi-php.conf;
}
}
Sau đó lưu và đóng file. Kích hoạt cả hai trang thông qua các liên kết tượng trưng đến thư mục sites-enabled
:
sudo ln -s /etc/nginx/sites-available/nginx1.your_domain /etc/nginx/sites-enabled/nginx1.your_domain
sudo ln -s /etc/nginx/sites-available/nginx2.your_domain /etc/nginx/sites-enabled/nginx2.your_domain
Chạy thử cấu hình Nginx:
sudo nginx -t
Reload lại nếu không có lỗi:
sudo systemctl reload nginx
Truy cập file phpinfo()
cho cả 2 virtual servers trên trình duyệt web bằng cách truy cập vào trang web http://nginx1.your_domain/info.php
và http://nginx2.your_domain/info.php
, nhìn vào các phần biến số PHP một lần nữa.
Mục [“SERVER_SOFTWARE”] sẽ hiển thị là Nginx
, biểu thị rằng các file được phục vụ trực tiếp bởi Nginx.
Mục [“DOCUMENT_ROOT”] sẽ chỉ bạn đến thẳng thư mục bạn đã tạo trước đó cho từng trang web Nginx. Hoàn thành bước này, bạn đã hoàn tất cài đặt Nginx và tạo 2 virtual server.
Bước 7: Cấu hình Nginx cho các virtual server của Apache
Tạo thêm một tệp virtual server Nginx với nhiều tên miền trong các chỉ thị server_name
. Các yêu cầu cho các tên miền này sẽ được chuyển tiếp đến Apache. Tạo một tệp virtual server Nginx mới để chuyển tiếp các yêu cầu đến Apache:
sudo nano /etc/nginx/sites-available/apache
Thêm đoạn code sau đây vào cấu hình, đoạn code này chỉ định tên miền của các virtual server trong Apache và chuyển tiếp yêu cầu của chúng đến Apache. Hãy nhớ sử dụng địa chỉ IP công khai trong proxy_pass
:
server {
listen 80;
server_name apache1.your_domain www.apache1.your_domain apache2.your_domain www.apache2.your_domain;
location / {
proxy_pass http://your_server_ip:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Lưu file và kích hoạt virtual server mới này bằng cách tạo một liên kết tượng trưng:
sudo ln -s /etc/nginx/sites-available/apache /etc/nginx/sites-enabled/apache
Kiểm tra lại cấu hình:
sudo nginx -t
Reload lại nếu không có lỗi:
sudo systemctl reload nginx
Mở trình duyệt và truy cập URL http://apache1.your_domain/info.php
thông qua trình duyệt của bạn. Kéo xuống phần biến số PHP và kiểm tra các giá trị được hiển thị. Các biến số SERVER_SOFTWARE và DOCUMENT_ROOT xác nhận rằng yêu cầu này đã được xử lý bởi Apache. Các biến số HTTP_X_REAL_IP và HTTP_X_FORWARDED_FOR đã được thêm bởi Nginx và sẽ hiển thị công khai địa chỉ IP của máy tính bạn đang sử dụng để truy cập URL (nếu bạn truy cập Apache trực tiếp trên cổng 8080
thì bạn sẽ không thấy các biến số trên).
Như vậy, bạn đã thành công trong việc thiết lập Nginx để chuyển tiếp các yêu cầu cho các tên miền cụ thể đến Apache. Ở bước tiếp theo, bạn sẽ cấu hình Apache để đặt biến REMOTE_ADDR
như thể biến này đang xử lý các yêu cầu một cách trực tiếp.
Bước 8: Cài đặt và cấu hình mod_rpaf
Trong bước này, bạn cài đặt một module của Apache được gọi là mod_rpaf,
module này sẽ viết lại các giá trị của REMOTE_ADDR, HTTPS và HTTP_PORT dựa trên các giá trị được cung cấp bởi một reverse proxy.
Nếu không có module này, một số ứng dụng PHP sẽ yêu cầu thay đổi mã để có thể hoạt động ngầm mượt mà phía sau proxy.
Module này có sẵn trong kho lưu trữ của Ubuntu với tên là libapache2-mod-rpaf
, tuy nhiên phiên bản hiện tại đã lỗi thời và không hỗ trợ một số chỉ thị cấu hình. Thay vào đó, bạn sẽ cài đặt nó từ mã nguồn.
Chuyển đến thư mục home và cài đặt các gói cần thiết để xây dựng module:
wget https://github.com/gnif/mod_rpaf/archive/stable.zip
Giải nén file đã tải:
unzip stable.zip
Chuyển vào thư mục mới chứa các file:
cd mod_rpaf-stable
Biên dịch và cài đặt module:
make
sudo make install
Tạo một tệp trong thư mục mods-available
để tải module rpaf
:
sudo nano /etc/apache2/mods-available/rpaf.load
Thêm đoạn code sau vào file để tải module:
LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf.so
Lưu và thoát khỏi trình soạn thảo.
Tạo một file khác trong thư mục này có tên rpaf.conf
chứa các chỉ thị cấu hình cho mod_rpaf
:
sudo nano /etc/apache2/mods-available/rpaf.conf
Thêm đoạn code sau để cấu hình mod_rpaf
, đảm bảo ghi rõ địa chỉ IP server của bạn:
<IfModule mod_rpaf.c>
RPAF_Enable On
RPAF_Header X-Real-Ip
RPAF_ProxyIPs your_server_ip
RPAF_SetHostName On
RPAF_SetHTTPS On
RPAF_SetPort On
</IfModule>
Dưới đây là mô tả ngắn gọn của mỗi chỉ thị. Xem tệp README của mod_rpaf
để biết thêm thông tin.
- RPAF_Header: Tiêu đề sử dụng cho địa chỉ IP thực của máy client.
- RPAF_ProxyIPs: Địa chỉ IP của proxy để điều chỉnh yêu cầu HTTP.
- RPAF_SetHostName: Cập nhật tên của virtual server để
ServerName
vàServerAlias
hoạt động. - RPAF_SetHTTPS: Đặt biến môi trường
HTTPS
dựa trên giá trị chứa trongX-Forwarded-Proto.
- RPAF_SetPort: Đặt biến môi trường
SERVER_PORT.
Điều này hữu ích khi Apache đứng sau một proxy SSL.
Lưu file rpaf.conf
và kích hoạt module:
sudo a2enmod rpaf
Điều này tạo ra các liên kết tượng trưng của các tệp rpaf.load
và rpaf.conf
trong thư mục mods-enabled
. Bây giờ thực hiện kiểm tra lại cấu hình:
sudo apachectl -t
Reload lại Apache nếu không phát hiện lỗi nào:
sudo systemctl reload apache2
Truy cập vào trang phpinfo()
http://apache1.your_domain/info.php
và http://apache2.your_domain/info.php
trong trình duyệt của bạn và kiểm tra phần PHP Variables. Biến REMOTE_ADDR sẽ là địa chỉ IP công khai của máy tính của bạn.
Bây giờ bạn sẽ thiết lập mã hóa TLS/SSL cho mỗi trang web.
Bước 9: Thiết lập website HTTPS với Let’s Encrypt (Tùy chọn)
Trong bước này, bạn sẽ cấu hình chứng chỉ TLS/SSL cho cả hai tên miền được lưu trữ trên Apache. Bạn có thể lấy chứng chỉ miễn phí của Let’s Encrypt (https://letsencrypt.org) hoặc sử dụng dịch vụ SSL trả phí của Vietnix. Vietnix cung cấp các gói SSL với mức giá chỉ từ 160.000 VND/Năm cho cả người dùng cá nhân lẫn các tổ chức, doanh nghiệp. Liên hệ với Vietnix để được tư vấn chi tiết hơn.
Nginx hỗ trợ việc hủy bỏ SSL, vì vậy bạn có thể thiết lập SSL mà không cần sửa đổi các tệp cấu hình của Apache. Module mod_rpaf
đảm bảo rằng các biến môi trường cần thiết đều được thiết lập trên Apache để các ứng dụng hoạt động ngầm một cách mượt mà trong một server proxy SSL.
Đầu tiên, bạn sẽ tách các khối server {...}
của cả hai tên miền để mỗi tên miền có thể có chứng chỉ SSL riêng của mình. Mở file /etc/nginx/sites-available/apache
trong trình soạn thảo của bạn:
sudo nano /etc/nginx/sites-available/apache
Chỉnh sửa lại file như bên dưới với mỗi tệp apache1.your_domain
và apache2.your_domain
trong các khối server
của riêng chúng:
server {
listen 80;
server_name apache1.your_domain www.apache1.your_domain;
location / {
proxy_pass http://your_server_ip:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 80;
server_name apache2.your_domain www.apache2.your_domain;
location / {
proxy_pass http://your_server_ip:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Sử dụng Certbot để tạo chứng chỉ TLS/SSL của riêng mình. Plugin Nginx sẽ đảm nhận trách nhiệm cấu hình lại Nginx và tải lại cấu hình bất cứ khi nào cần thiết.
Cài đặt Certbot
bằng snapd.
sudo snap install --classic certbot
Sau khi cài đặt xong Certbot
, hãy sử dụng câu lệnh certbot
để tạo các chứng chỉ SSL cho apache1.your_domain
và www.apache1.your_domain
sudo certbot --agree-tos --no-eff-email --email your-email --nginx -d apache1.your_domain -d www.apache1.your_domain
Lệnh này yêu cầu Certbot sử dụng plugin nginx
, sử dụng -d để chỉ định các tên mà bạn muốn chứng chỉ có hiệu lực.
Sử dụng lệnh tương tự cho tên miền thứ hai:
sudo certbot --agree-tos --no-eff-email --email your-email --nginx -d apache2.your_domain -d www.apache2.your_domain
Truy cập vào một trong các tên miền của Apache trên trình duyệt của bạn bằng cách sử dụng tiền tố https://
; truy cập https://apache1.your_domain/info.php
hoặc https://apache2.your_domain/info.php.
Hãy xem trong phần PHP Variables. Biến SERVER_PORT đã được chuyển thành 443 và biến HTTPS được đổi sang trạng thái on, dường như Apache đã được truy cập trực tiếp qua HTTPS. Với sự thay đổi của các biến trên, các ứng dụng PHP không cần phải được cấu hình đặc biệt để hoạt động ngầm phía trong một reverse proxy.
Bước 10: Chặn truy cập trực tiếp vào Apache (Tùy chọn)
Apache lắng nghe trên cổng 8080
thông qua địa chỉ IP công khai, vì vậy Apache có thể truy cập được bởi nhiều người. Apache có thể bị chặn bằng cách thiết lập lệnh IPtables sau vào rule firewall.
sudo iptables -I INPUT -p tcp --dport 8080 ! -s your_server_ip -j REJECT --reject-with tcp-reset
Sử dụng địa chỉ IP server của bạn ở vị trí được đánh dấu. Sau khi cổng 8080
bị chặn bởi firewall, hãy thử kiểm tra xem Apache có không thể truy cập được nó hay không. Mở trình duyệt web của bạn và thử truy cập một trong các tên miền của Apache trên cổng 8080
. Ví dụ: http://apache1.your_domain:8080
Trình duyệt của bạn sẽ hiển thị một thông báo lỗi “Unable to connect” hoặc “Webpage is not available”. Với tùy chọn tcp-reset
của IPtables được áp dụng, người khác sẽ không thấy bất kì sự khác biệt giữa cổng 8080
và một cổng không hoạt động.
Lưu ý: Quy tắc IPtables mặc định bị xóa ngay sau khi khởi động lại hệ thống. Có nhiều cách để bảo vệ các câu lệnh IPtables, nhưng cách đơn giản nhất là sử dụng iptables-persistent
trong kho lưu trữ của Ubuntu.
Bước 11: Thiết lập Nginx để phục vụ các static files (Tùy chọn)
Khi Nginx chuyển tiếp các yêu cầu cho các tên miền của Apache, Apache sẽ gửi mọi yêu cầu file cho tên miền đó đến Apache. Nginx hoạt động nhanh hơn Apache trong việc phục vụ các static files như hình ảnh, JavaScript và Stylesheets. Vì vậy, bạn hãy cấu hình file virtual server apache
của Nginx để phục vụ các static files một cách trực tiếp, nhưng gửi các yêu cầu PHP cho Apache xử lý.
Mở file /etc/nginx/sites-available/apache
trong trình soạn thảo của bạn:
sudo nano /etc/nginx/sites-available/apache
Thêm hai khối location
bổ sung vào mỗi khối server, cũng như sửa đổi các phần location
hiện có. Ngoài ra, bạn cần cho Nginx biết nơi để tìm các static files cho mỗi trang web.
Nếu không sử dụng chứng chỉ SSL và TLS, hãy sửa file như sau:
server {
listen 80;
server_name apache2.your_domain www.apache2.your_domain;
root /var/www/your_domain;
index index.php index.htm index.html;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
proxy_pass http://your_server_ip:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location ~ /\.ht {
deny all;
}
}
server {
listen 80;
server_name apache1.your_domain www.apache1.your_domain;
root /var/www/your_domain;
index index.php index.htm index.html;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
proxy_pass http://your_ip_address:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location ~ /\.ht {
deny all;
}
}
Nếu bạn muốn tiền tố HTTPS khả dụng, hãy thiết lập cấu hình như sau thay cho cấu hình phía trên:
server {
listen 80;
server_name apache2.your_domain www.apache2.your_domain;
root /var/www/your_domain;
index index.php index.htm index.html;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
proxy_pass http://your_server_ip:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location ~ /\.ht {
deny all;
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
server {
listen 80;
server_name apache1.your_domain www.apache1.your_domain;
root /var/www/your_domain;
index index.php index.htm index.html;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
proxy_pass http://your_ip_address:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location ~ /\.ht {
deny all;
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
Chỉ thị try_files
khiến Nginx tìm kiếm các tệp trong thư mục gốc và phục vụ chúng trực tiếp. Nếu file có phần mở rộng là .php
, yêu cầu sẽ được chuyển tiếp đến Apache. Ngay cả khi tệp không được tìm thấy trong thư mục root, yêu cầu cũng được chuyển tiếp đến Apache để các tính năng của ứng dụng như liên kết tĩnh (permalinks) có thể hoạt động trơn tru mà không gặp vấn đề.
Cảnh báo: Chỉ thị location ~ /\.ht
rất quan trọng; điều này ngăn Nginx phục vụ nội dung của các file cấu hình Apache như .htaccess
và .htpasswd
, chứa thông tin nhạy cảm. Lưu file và kiểm tra cấu hình:
sudo nginx -t
Nếu quá trình kiểm tra không có lỗi hãy reload lại Nginx:
sudo service nginx reload
Để xác minh rằng mọi thứ đang hoạt động, bạn có thể xem các tệp nhật ký của Apache trong /var/log/apache2
và xem các yêu cầu GET
cho các tệp info.php
của apache2.your_domain
và apache1.your_domain
. Sử dụng lệnh tail
để xem vài dòng cuối cùng của file và sử dụng công tắc -f
để theo dõi file cho các thay đổi.
sudo tail -f /var/log/apache2/other_vhosts_access.log
Truy cập apache1.your_domain/info.php
hoặc apache2.your_domain/info.php
trên trình duyệt và xem output từ nhật ký. Bạn sẽ thấy rằng Apache đang trả lời (cổng của bạn sẽ là 80
hoặc 443
tùy thuộc vào việc bạn đã bảo mật phiên bản đó hay không):
Output
apache2.your_domain:80 your_server_ip - - [27/Aug/2020:18:18:34 -0400] "GET /info.php HTTP/1.0" 200 20414 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
Sau đó, truy cập trang index.html
cho mỗi trang webs, bạn sẽ không thấy bất kỳ mục nhật ký nào từ Apache. Vì Nginx đang phục vụ chúng.
Khi bạn hoàn tất quan sát file nhật ký, nhấn CTRL + C
để ngừng theo dõi.
Với cài đặt này, Apache sẽ không thể hạn chế truy cập vào các static files. Kiểm soát truy cập cho các static files sẽ cần được cấu hình trong virtual host file của apache
trong Nginx, nhưng điều đó nằm ngoài phạm vi của bài viết này.
Lời kết
Trên đây là các bước hướng dẫn chi tiết cách cấu hình Nginx làm Web Server và Reverse Proxy cho Apache trên Ubuntu 20.04. Hy vọng những thông tin này sẽ hữu ích với bạn. Nếu còn vấn đề nào chưa rõ, bạn hãy để lại bình luận bên dưới nhé.