Server có cả địa chỉ IPv4 và IPv6 có thể được cấu hình để phục vụ các trang web Apache trên một giao thức và các trang web Nginx trên một giao thức khác, nhưng điều này hiện không thực tế, vì việc chấp nhận IPv6 của các ISP vẫn chưa phổ biến. Có một số cổng khác như 81
hoặc 8080
cho web server thứ hai là một giải pháp khác, nhưng chia sẻ URL với số cổng (chẳng hạn như http:// your_domain :81
) không phải lúc nào cũng hợp lý hoặc lý tưởng.
Trong hướng dẫn này, bạn sẽ cấu hình Nginx vừa là một web server vừa là một Reverse Proxy cho Apache - tất cả trên một server duy nhất.
Tùy thuộc vào ứng dụng web, các thay đổi mã có thể được yêu cầu để giữ cho Apache nhận biết Reverse Proxy , đặc biệt khi các trang web SSL được cấu hình . Để tránh điều này, bạn sẽ cài đặt một module Apache có tên là mod_rpaf
, module này sẽ viết lại các biến môi trường nhất định để có vẻ như Apache đang trực tiếp xử lý các yêu cầu từ client web.
Ta sẽ lưu trữ bốn domain trên một server . Hai sẽ được phục vụ bởi Nginx: nginx1. your_domain
( server ảo mặc định) và nginx2. your_domain
. Hai phần còn lại, apache1. your_domain
và apache2. your_domain
, sẽ được cung cấp bởi Apache. Ta cũng sẽ cấu hình Apache để phục vụ các ứng dụng PHP bằng PHP-FPM, mang lại hiệu suất tốt hơn mod_php
.
Để hoàn thành hướng dẫn này, bạn cần những thứ sau:
Hãy bắt đầu bằng cách cài đặt Apache và PHP-FPM.
Ngoài Apache và PHP-FPM, ta cũng sẽ cài đặt module PHP FastCGI Apache, libapache2-mod-fastcgi
, để hỗ trợ các ứng dụng web FastCGI.
Trước tiên, hãy cập nhật danh sách gói của bạn đảm bảo bạn có các gói mới nhất.
- sudo apt update
Tiếp theo, cài đặt các gói Apache và PHP-FPM:
- sudo apt install apache2 php-fpm
Mô-đun FastCGI Apache không có sẵn trong repository lưu trữ của Ubuntu, vì vậy hãy download từ kernel.org và cài đặt bằng 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
Tiếp theo, hãy thay đổi cấu hình mặc định của Apache để sử dụng PHP-FPM.
Trong bước này, ta sẽ thay đổi số cổng của Apache thành 8080
và cấu hình nó hoạt động với PHP-FPM bằng cách sử dụng module mod_fastcgi
. Đổi tên file cấu hình ports.conf
của Apache:
- sudo mv /etc/apache2/ports.conf /etc/apache2/ports.conf.default
Tạo một file ports.conf
mới với cổng được đặt thành 8080
:
- echo "Listen 8080" | sudo tee /etc/apache2/ports.conf
Lưu ý: Các web server thường được đặt để lắng nghe trên 127.0.0.1:8080
khi cấu hình Reverse Proxy nhưng làm như vậy sẽ đặt giá trị của biến môi trường của PHP là SERVER_ADDR thành địa chỉ IP lặp lại thay vì IP công khai của server . Mục đích của ta là cài đặt Apache theo cách mà các trang web của nó không nhìn thấy Reverse Proxy trước nó. Vì vậy, ta sẽ cấu hình nó để lắng nghe trên 8080
trên tất cả các địa chỉ IP.
Tiếp theo, ta sẽ tạo một file server ảo cho Apache. Chỉ thị <VirtualHost>
trong file này sẽ được đặt để chỉ phục vụ các trang web trên cổng 8080
.
Tắt server ảo mặc định:
- sudo a2dissite 000-default
Sau đó, tạo một file server ảo mới, sử dụng trang web mặc định hiện có:
- sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/001-default.conf
Bây giờ hãy mở file cấu hình mới:
- sudo nano /etc/apache2/sites-available/001-default.conf
Thay đổi cổng nghe thành 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 file và kích hoạt file cấu hình mới:
- sudo a2ensite 001-default
Sau đó reload Apache:
- sudo systemctl reload apache2
Cài đặt gói net-tools
có chứa netstat
:
- sudo apt install net-tools
Xác minh Apache hiện đang nghe trên 8080
:
- sudo netstat -tlpn
Đầu ra sẽ giống như ví dụ sau, với apache2
đang nghe trên 8080
:
OutputActive 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
Khi bạn xác minh Apache đang lắng nghe trên đúng cổng, bạn có thể cấu hình hỗ trợ cho PHP và FastCGI.
mod_fastcgi
Apache phục vụ các trang PHP sử dụng mod_php
theo mặc định, nhưng nó yêu cầu cấu hình bổ sung để hoạt động với PHP-FPM.
Lưu ý: Nếu bạn đang thử hướng dẫn này trên cài đặt hiện có của LAMP với mod_php
, hãy tắt nó trước với sudo a2dismod php7.4
.
Ta sẽ thêm một đoạn cấu hình cho mod_fastcgi
, khối này phụ thuộc vào mod_action
. mod_action
bị tắt theo mặc định, vì vậy trước tiên ta cần bật nó:
- sudo a2enmod actions
Đổi tên file cấu hình FastCGI hiện có:
- sudo mv /etc/apache2/mods-enabled/fastcgi.conf /etc/apache2/mods-enabled/fastcgi.conf.default
Tạo file cấu hình mới:
- sudo nano /etc/apache2/mods-enabled/fastcgi.conf
Thêm các lệnh sau vào file để chuyển yêu cầu file .php
đến socket PHP-FPM UNIX:
<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à thực hiện kiểm tra cấu hình:
- sudo apachectl -t
Lưu ý: Nếu bạn thấy cảnh báo Could not reliably determine the server's fully /
, bạn có thể yên tâm bỏ qua nó ngay bây giờ. Ta sẽ cấu hình tên server sau.
qualified domain name, using 127.0.1.1. Set the /'ServerName' directive globally/
to suppress this message.
Reload Apache miễn là Syntax OK
được hiển thị:
- sudo systemctl reload apache2
Bây giờ hãy đảm bảo ta có thể phục vụ PHP từ Apache.
Hãy đảm bảo PHP hoạt động bằng cách tạo file phpinfo()
và truy cập nó từ trình duyệt web.
Tạo file /var/www/html/info.php
, chứa lệnh gọi hàm phpinfo
:
- echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
Lưu ý nếu bạn đã làm theo cài đặt server ban đầu trong phần Yêu cầu , thì bạn có thể đã bật firewall Apache. Hãy tiếp tục và đảm bảo ta có thể truy cập IP của bạn trên cổng 8080
, hiện không thể truy cập được. Ta sẽ hạn chế quyền truy cập vào cổng này ở Bước 10 .
Đầu tiên cho phép cổng 8080
thông qua firewall :
- sudo ufw allow 8080
Vì ta sẽ bảo mật các domain Apache của bạn , hãy tiếp tục và đảm bảo lưu lượng truy cập TLS trên cổng 443
có thể vào được.
Cho phép Apache Full
cho phép lưu lượng truy cập trên các cổng 80
và 443
:
- sudo ufw allow "Apache Full"
Bây giờ hãy kiểm tra trạng thái firewall của bạn:
- sudo ufw status
Nếu bạn đã tuân theo các yêu cầu , thì kết quả sẽ giống như sau:
OutputTo 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 phép cùng với bất kỳ luật firewall nào khác. Bây giờ ta hãy xem trang info.php
của ta .
Để xem info.php
trong trình duyệt, hãy truy cập http:// your_server_ip :8080/info.php
. Thao tác này sẽ cung cấp cho bạn danh sách các cài đặt cấu hình mà PHP đang sử dụng. Bạn sẽ thấy kết quả tương tự như sau:
Ở đầu trang, hãy kiểm tra xem API server cho biết FPM / FastCGI . Khoảng 2/3 đường xuống trang, phần PHP Variables sẽ cho bạn biết SERVER_SOFTWARE là Apache trên Ubuntu. Những điều này xác nhận mod_fastcgi
đang hoạt động và Apache đang sử dụng PHP-FPM để xử lý các file PHP.
Hãy tạo các file server ảo Apache cho các domain apache1. your_domain
và apache2. your_domain
. Để làm điều đó, trước tiên ta sẽ tạo folder root tài liệu cho cả hai trang web và đặt một số file mặc định trong các folder đó để ta có thể dễ dàng kiểm tra cấu hình của bạn .
Đầu tiên, hãy tạo các folder root của tài liệu:
- sudo mkdir -v /var/www/apache1.your_domain /var/www/apache2.your_domain
Sau đó, tạo một file index
cho mỗi trang web:
- 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 một file phpinfo()
cho mỗi trang web để ta có thể kiểm tra xem PHP đã được cấu hình đúng chưa.
- echo "<?php phpinfo(); ?>" | sudo tee /var/www/apache1.your_domain/info.php
- echo "<?php phpinfo(); ?>" | sudo tee /var/www/apache2.your_domain/info.php
Bây giờ tạo file server ảo cho apache1. your_domain
:
- sudo nano /etc/apache2/sites-available/apache1.your_domain.conf
Thêm mã sau vào file để xác định 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 hỗ trợ .htaccess
.
Đây chỉ là những chỉ thị cơ bản nhất. Để có hướng dẫn đầy đủ về cách cài đặt server ảo trong Apache, hãy xem Cách cài đặt Server ảo Apache trên Ubuntu 18.04 .
Lưu và đóng file . Sau đó, tạo một cấu hình tương tự cho apache2. your_domain
. Đầu tiên hãy tạo file :
- sudo nano /etc/apache2/sites-available/apache2.your_domain.conf
Sau đó thêm cấu hình vào file :
<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 editor .
Bây giờ cả hai server ảo Apache đã được cài đặt , hãy kích hoạt các trang web bằng lệnh a2ensite
. Điều này tạo ra một softlink đến file server ảo trong folder sites-enabled
:
- sudo a2ensite apache1.your_domain
- sudo a2ensite apache2.your_domain
Kiểm tra lại Apache để tìm lỗi cấu hình:
- sudo apachectl -t
Bạn sẽ thấy Syntax OK
hiển thị nếu không có lỗi. Nếu bạn thấy bất kỳ điều gì khác, hãy xem lại cấu hình và thử lại.
Reload Apache để áp dụng các thay đổi 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 đang 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 minh mỗi trang web hiển thị index.html
của nó.
Bạn sẽ thấy các kết quả sau:
Ngoài ra, hãy đảm bảo PHP đang hoạt động bằng cách truy cập các file info.php
cho mỗi trang web. Truy cập http://apache1. your_domain :8080/info.php
và http://apache2. your_domain :8080/info.php
trong trình duyệt của bạn.
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 ở Bước 4 .
Bây giờ ta có hai trang web được lưu trữ trên Apache tại cổng 8080
. Hãy cấu hình Nginx tiếp theo.
Trong bước này, ta sẽ cài đặt Nginx và cấu hình các domain nginx1. your_domain
và nginx2. your_domain
làm server ảo của Nginx. Để có hướng dẫn đầy đủ về cách cài đặt server ảo trong Nginx, hãy xem Cách cài đặt khối server Nginx ( Server ảo) trên Ubuntu 20.04 .
Cài đặt Nginx bằng trình quản lý gói apt
:
- sudo apt install nginx
Sau đó, xóa softlink của server ảo mặc định vì ta sẽ không sử dụng nó nữa:
- sudo rm /etc/nginx/sites-enabled/default
Ta sẽ tạo ra trang web mặc định của ta sau này ( nginx1. your_domain
).
Bây giờ ta sẽ tạo server ảo cho Nginx bằng cách sử dụng cùng một quy trình mà ta đã sử dụng cho Apache. Đầu tiên hãy tạo folder root tài liệu cho cả hai trang web:
- sudo mkdir -v /usr/share/nginx/nginx1.your_domain /usr/share/nginx/nginx2.your_domain
Ta sẽ giữ các trang web của Nginx trong /usr/share/nginx
, đó là nơi Nginx muốn chúng theo mặc định. Bạn có thể đặt chúng dưới /var/www/html
với các trang Apache, nhưng sự tách biệt này có thể giúp bạn liên kết các trang web với Nginx.
Như bạn đã làm với server ảo của Apache, hãy tạo các file index
và phpinfo()
để kiểm tra sau khi cài đặt xong:
- 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ờ, hãy tạo một file server ảo cho domain nginx1. your_domain
:
- sudo nano /etc/nginx/sites-available/nginx1.your_domain
server {. . .}
cuộc gọi Nginx server {. . .}
khu vực của khối server file cấu hình. Tạo khối server cho server ảo chính, nginx1. your_domain
. Chỉ thị cấu hình default_server
làm cho server ảo mặc định này xử lý các yêu cầu HTTP không trùng với bất kỳ server ảo 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 . Bây giờ, hãy tạo một file server ảo cho domain thứ hai của Nginx, nginx2. your_domain
:
- sudo nano /etc/nginx/sites-available/nginx2.your_domain
Thêm phần sau 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; } }
Lưu và đóng file .
Kích hoạt cả hai trang web bằng cách tạo các softlink đến folder 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
Kiểm tra cấu hình Nginx đảm bảo không có vấn đề về cấu hình:
- sudo nginx -t
Sau đó reload Nginx nếu không có lỗi:
- sudo systemctl reload nginx
Bây giờ hãy truy cập file phpinfo()
cho cả server ảo Nginx trong trình duyệt web bằng cách truy cập http: // nginx1 . miền của bạn /info.php và http: // nginx2 . yourdomain /info.php. Xem lại phần Biến PHP.
[“SERVER_SOFTWARE”] phải nói là nginx
, cho biết rằng các file được cung cấp trực tiếp bởi Nginx. [“DOCUMENT_ROOT”] phải trỏ đến folder bạn đã tạo trước đó trong bước này cho mỗi trang web Nginx.
Đến đây, ta đã cài đặt Nginx và tạo hai server ảo. Tiếp theo, ta sẽ cấu hình Nginx cho các yêu cầu proxy dành cho các domain được lưu trữ trên Apache.
Hãy tạo thêm một server ảo Nginx với nhiều domain trong lệnh server_name
. Yêu cầu đối với các domain này sẽ được ủy quyền cho Apache.
Tạo một file server ảo Nginx mới để chuyển tiếp các yêu cầu tới Apache:
- sudo nano /etc/nginx/sites-available/apache
Thêm khối mã sau; nó chỉ định tên của cả domain server ảo Apache và proxy các yêu cầu của chúng tới Apache. Hãy nhớ sử dụng địa chỉ IP công cộng 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 server ảo mới này bằng cách tạo một softlink :
- sudo ln -s /etc/nginx/sites-available/apache /etc/nginx/sites-enabled/apache
Kiểm tra cấu hình đảm bảo không có lỗi:
- sudo nginx -t
Nếu không có lỗi, hãy reload Nginx:
- sudo systemctl reload nginx
Mở trình duyệt và truy cập URL http://apache1. your_domain /info.php
trong trình duyệt của bạn. Cuộn xuống phần Biến PHP và kiểm tra các giá trị được hiển thị.
Các biến SERVER_SOFTWARE và DOCUMENT_ROOT xác nhận yêu cầu này đã được Apache xử lý. Các biến HTTP X REAL_IP và HTTP X FORWARDED_FOR đã được thêm bởi Nginx và sẽ hiển thị địa chỉ IP công cộng 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
bạn sẽ không thấy các biến này).
Ta đã cài đặt thành công Nginx cho các yêu cầu proxy cho các domain cụ thể tới Apache. Tiếp theo, hãy cấu hình Apache để đặt biến REMOTE_ADDR
như thể nó đang xử lý các yêu cầu này trực tiếp.
mod_rpaf
Trong bước này, bạn sẽ cài đặt một module Apache có tên là mod_rpaf
, module này sẽ ghi 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 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ã để hoạt động liền mạch từ phía sau proxy. Mô-đun này hiện diện trong repository lưu trữ của Ubuntu dưới dạng libapache2-mod-rpaf
nhưng nó đã lỗi thời và không hỗ trợ một số chỉ thị cấu hình nhất định. Thay vào đó, ta sẽ cài đặt nó từ nguồn.
Di chuyển đến folder chính của bạn và cài đặt các gói cần thiết để xây dựng module :
- sudo apt install unzip build-essential apache2-dev
Download bản phát hành ổn định mới nhất từ GitHub:
- wget https://github.com/gnif/mod_rpaf/archive/stable.zip
Extract file đã download :
- unzip stable.zip
Thay đổi vào folder mới chứa các file :
- cd mod_rpaf-stable
Biên dịch và cài đặt module :
- make
- sudo make install
Tiếp theo, tạo một file trong folder mods-available
sẽ tải module rpaf
:
- sudo nano /etc/apache2/mods-available/rpaf.load
Thêm mã sau vào file để tải module :
LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf.so
Lưu file và thoát khỏi editor .
Tạo một file khác trong folder này có tên rpaf.conf
sẽ chứa các chỉ thị cấu hình cho mod_rpaf
:
- sudo nano /etc/apache2/mods-available/rpaf.conf
Thêm khối mã sau để cấu hình mod_rpaf
, đảm bảo chỉ định địa chỉ IP của 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 về từng chỉ thị. Xem file README mod_rpaf
để biết thêm thông tin.
ServerName
và ServerAlias
hoạt động.HTTPS
dựa trên giá trị có trong X-Forwarded-Proto
.SERVER_PORT
. Hữu ích khi Apache sử dụng proxy SSL. Lưu rpaf.conf
và kích hoạt module :
- sudo a2enmod rpaf
Điều này tạo ra các softlink của các file rpaf.load
và rpaf.conf
trong folder mods-enabled
. Bây giờ hãy thực hiện kiểm tra cấu hình:
- sudo apachectl -t
Reload Apache nếu không có lỗi:
- sudo systemctl reload apache2
Truy cập các 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 Biến PHP . Biến REMOTE_ADDR bây giờ cũng sẽ là biến địa chỉ IP công cộng của máy tính local của bạn.
Bây giờ hãy cài đặt mã hóa TLS / SSL cho mỗi trang web.
Trong bước này, ta sẽ cấu hình certificate TLS / SSL cho cả hai domain được lưu trữ trên Apache. Ta sẽ lấy certificate thông qua [Let's Encrypt] ( https://letsencrypt.org ]. Nginx hỗ trợ kết thúc SSL để ta có thể cài đặt SSL mà không cần sửa đổi file cấu hình của Apache. Mô-đun mod_rpaf
đảm bảo các biến môi trường bắt buộc được đặt trên Apache để làm cho các ứng dụng hoạt động liền mạch sau Reverse Proxy SSL.
Đầu tiên, ta sẽ tách các khối server {...}
của cả hai domain để mỗi domain có thể có certificate SSL riêng. Mở file /etc/nginx/sites-available/apache
trong editor :
- sudo nano /etc/nginx/sites-available/apache
Sửa đổi file để nó trông giống như thế này, với apache1. your_domain
và apache2. your_domain
trong các khối server
của riêng họ:
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; } }
Ta sẽ sử dụng Certbot để tạo certificate TLS / SSL của bạn . Plugin Nginx của nó sẽ chăm sóc cấu hình lại Nginx và reload cấu hình khi nào cần thiết.
Cài đặt certbot
bằng snapd
- sudo snap install --classic certbot
Sau khi nó được cài đặt, hãy sử dụng lệnh certbot
để tạo certificate 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 tên mà ta muốn certificate hợp lệ.
Bây giờ thực hiện lệnh cho domain thứ hai:
- sudo certbot --agree-tos --no-eff-email --email your-email --nginx -d your_domain -d www.apache2.your_domain
Truy cập một trong các domain của Apache trong trình duyệt của bạn bằng tiền tố https://
; truy cập https://apache1. your_domain /info.php
hoặc https://apache2. your_domain /info.php
.
Tìm trong phần Biến PHP . Biến SERVER_PORT đã được đặt thành 443 và HTTPS được đặt thành bật , như thể Apache được truy cập trực tiếp qua HTTPS. Với các biến này được đặt, các ứng dụng PHP không phải được cấu hình đặc biệt để hoạt động sau Reverse Proxy .
Bây giờ hãy vô hiệu hóa quyền truy cập trực tiếp vào Apache.
Vì Apache đang lắng nghe trên cổng 8080
trên địa chỉ IP công cộng nên mọi người đều có thể truy cập nó. Nó có thể bị chặn bằng cách đưa lệnh IPtables sau vào bộ luật firewall của bạn.
- sudo iptables -I INPUT -p tcp --dport 8080 ! -s your_server_ip -j REJECT --reject-with tcp-reset
Đảm bảo sử dụng địa chỉ IP của server thay cho ví dụ được đánh dấu. Khi cổng 8080
bị chặn trong firewall của bạn, hãy kiểm tra xem Apache có thể truy cập được trên đó không. Mở trình duyệt web và thử truy cập một trong các domain của Apache trên cổng 8080
. Ví dụ: http: // apache1 . your_domain : 8080
Trình duyệt sẽ hiển thị thông báo lỗi “Không thể kết nối” hoặc “Trang web không khả dụng”. Với tùy chọn IPtables tcp-reset
tại chỗ, người ngoài sẽ không thấy sự khác biệt giữa cổng 8080
và một cổng không có bất kỳ dịch vụ nào trên đó.
Lưu ý: Các luật IPtables không tồn tại khi hệ thống khởi động lại theo mặc định. Có nhiều cách để duy trì các luật IPtables, nhưng cách dễ nhất là sử dụng iptables-persistent
trong repository lưu trữ của Ubuntu. Khám phá bài viết này để tìm hiểu thêm về cách cấu hình IPTables.
Bây giờ, hãy cấu hình Nginx để phục vụ các file tĩnh cho các trang Apache.
Khi proxy Nginx yêu cầu các domain của Apache, nó sẽ gửi mọi yêu cầu file cho domain đó tới Apache. Nginx nhanh hơn Apache trong việc cung cấp các file tĩnh như hình ảnh, JavaScript và trang định kiểu. Vì vậy, hãy cấu hình file server ảo apache
của Nginx để phân phối trực tiếp các file tĩnh nhưng gửi yêu cầu PHP tới Apache.
Mở file /etc/nginx/sites-available/apache
trong editor :
- sudo nano /etc/nginx/sites-available/apache
Bạn cần 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 file tĩnh cho mỗi trang web.
Nếu bạn quyết định không sử dụng certificate SSL và TLS, hãy sửa đổi file của bạn để file của bạn trông giống 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 cũng muốn HTTPS khả dụng, hãy sử dụng cấu hì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; } 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; }
Lệnh try_files
làm cho Nginx tìm kiếm các file trong root tài liệu và trực tiếp phân phát chúng. Nếu file có phần mở rộng .php
, yêu cầu được chuyển đến Apache. Ngay cả khi file không được tìm thấy trong folder root , yêu cầu được chuyển tới Apache để các tính năng ứng dụng như liên kết cố định hoạt động mà không gặp sự cố.
Cảnh báo: Chỉ thị location ~ /\.ht
rất quan trọng; điều này ngăn Nginx phân phát 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à thực hiện kiểm tra cấu hình:
- sudo nginx -t
Reload Nginx nếu kiểm tra thành công:
- sudo service nginx reload
Để xác minh mọi thứ đang hoạt động, bạn có thể kiểm tra file log của Apache trong /var/log/apache2
và xem các yêu cầu GET
cho file 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 chuyển đổi -f
để xem file để biết các thay đổi:
- sudo tail -f /var/log/apache2/other_vhosts_access.log
Bây giờ hãy truy cập apache1. your_domain /info.php
hoặc apache2. your_domain /info.php
trong trình duyệt của bạn và sau đó xem kết quả từ log . Bạn sẽ thấy rằng Apache thực sự đ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 có bảo mật version 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 đó, hãy truy cập trang index.html
cho mỗi trang web và bạn sẽ không thấy bất kỳ mục log nào từ Apache. Nginx đang phục vụ họ.
Khi bạn hoàn tất việc quan sát file log , hãy nhấn CTRL+C
để ngừng gắn đuôi file đó.
Với cài đặt này, Apache sẽ không thể hạn chế quyền truy cập vào các file tĩnh. Kiểm soát truy cập cho các file tĩnh cần được cấu hình trong file server ảo apache
của Nginx, nhưng điều đó nằm ngoài phạm vi của hướng dẫn này.
Đến đây bạn có một server Ubuntu với Nginx phục vụ nginx1. your_domain
và nginx2. your_domain
, cùng với Apache phục vụ apache1. your_domain
và apache2. your_domain
. Mặc dù Nginx đang hoạt động như một Reverse Proxy cho Apache, dịch vụ proxy của Nginx là minh bạch và các kết nối đến các domain của Apache dường như được phục vụ trực tiếp từ chính Apache. Bạn có thể sử dụng phương pháp này để phục vụ các trang web an toàn và tĩnh.