Cách cấu hình Nginx làm web server và reverse-proxy (reverse proxy) cho Apache trên một server Ubuntu 18.04
Apache và Nginx là hai web server open-souce phổ biến thường được sử dụng với PHP. Có thể hữu ích khi chạy cả hai trên cùng một máy ảo khi lưu trữ nhiều trang web có các yêu cầu khác nhau. Giải pháp chung để chạy hai web server trên một hệ thống là sử dụng nhiều địa chỉ IP hoặc số cổng khác nhau.  Server  có cả địa chỉ IPv4 và IPv6 có thể được  cấu hình  để phục vụ các trang Apache trên một giao thức và các trang 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 sử dụng 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://example.com: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 cung cấp bởi Nginx: example.com ( server  ảo mặc định) và sample.org . Hai phần còn lại, foobar.net và test.io , sẽ được Apache phục vụ.  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 .
Yêu cầu
Để hoàn thành hướng dẫn này, bạn cần những thứ sau:
- Server Ubuntu 18.04 mới được cấu hình theo Cài đặt server ban đầu với Ubuntu 18.04 , với user không phải root có quyền sudo và firewall .
- Bốn domain đủ điều kiện được cấu hình để trỏ đến địa chỉ IP server của bạn. Xem Bước 3 của Cách cài đặt Tên Server với DigitalOcean để biết ví dụ về cách thực hiện việc này. Nếu bạn lưu trữ DNS của domain của bạn ở nơi khác, bạn nên tạo các bản ghi A thích hợp ở đó.
Bước 1 - Cài đặt Apache và PHP-FPM
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.
Bước 2 - Cấu hình Apache và 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 
 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.
Bước 3 - Cấu hình Apache để sử dụng 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.2 .
  Ta  sẽ thêm một  đoạn cấu hình  cho mod_fastcgi 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.2-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 
Reload Apache nếu Cú pháp OK được hiển thị:
- sudo systemctl reload apache2 
Nếu bạn thấy 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 có thể yên tâm bỏ qua nó ngay bây giờ.  Ta  sẽ  cấu hình  tên  server  sau.
Bây giờ hãy đảm bảo ta có thể phục vụ PHP từ Apache.
Bước 4 - Xác minh chức năng PHP
 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 file  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. 
 Ở đầ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.
Bước 5 - Tạo server ảo cho Apache
 Hãy tạo file   server  ảo Apache cho các domain  foobar.net và test.io Để 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/foobar.net /var/www/test.io 
Sau đó, tạo một file  index cho mỗi trang web:
- echo "<h1 style='color: green;'>Foo Bar</h1>" | sudo tee /var/www/foobar.net/index.html 
- echo "<h1 style='color: red;'>Test IO</h1>" | sudo tee /var/www/test.io/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/foobar.net/info.php 
- echo "<?php phpinfo(); ?>" | sudo tee /var/www/test.io/info.php 
Bây giờ tạo file   server  ảo cho domain  foobar.net :
- sudo nano /etc/apache2/sites-available/foobar.net.conf 
Thêm mã sau vào file để xác định server :
    <VirtualHost *:8080>         ServerName foobar.net         ServerAlias www.foobar.net         DocumentRoot /var/www/foobar.net         <Directory /var/www/foobar.net>             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 16.04 .
 Lưu và đóng  file . Sau đó, tạo một cấu hình tương tự cho test.io Đầu tiên hãy tạo file :
- sudo nano /etc/apache2/sites-available/test.io.conf 
Sau đó thêm cấu hình vào file :
    <VirtualHost *:8080>         ServerName test.io         ServerAlias www.test.io         DocumentRoot /var/www/test.io         <Directory /var/www/test.io>             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 foobar.net 
- sudo a2ensite test.io 
Kiểm tra lại Apache để tìm lỗi cấu hình:
- sudo apachectl -t 
Bạn sẽ thấy Cú pháp 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:// foobar.net :8080 và http:// test.io :8080 trong trình duyệt của bạn và  xác minh  mỗi trang web hiển thị tệp 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:// foobar.net :8080/info.php và http:// test.io :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.
Bước 6 - Cài đặt và cấu hình Nginx
 Trong bước này,  ta  sẽ cài đặt Nginx và  cấu hình  các domain  example.com và sample.org 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 18.04 .
Cài đặt Nginx bằng trình quản lý gói:
- 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 trang web mặc định của riêng mình sau này ( example.com ).
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/example.com /usr/share/nginx/sample.org 
 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;'>Example.com</h1>" | sudo tee /usr/share/nginx/example.com/index.html 
- echo "<h1 style='color: red;'>Sample.org</h1>" | sudo tee /usr/share/nginx/sample.org/index.html 
- echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/example.com/info.php 
- echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/sample.org/info.php 
Bây giờ, hãy tạo một file   server  ảo cho domain  example.com :
- sudo nano /etc/nginx/sites-available/example.com 
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, example.com . 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/example.com;     index index.php index.html index.htm;      server_name example.com www.example.com;     location / {         try_files $uri $uri/ /index.php;     }      location ~ \.php$ {         fastcgi_pass unix:/run/php/php7.2-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, sample.org :
- sudo nano etc/nginx/sites-available/sample.org 
Thêm phần sau vào file :
server {     root /usr/share/nginx/sample.org;     index index.php index.html index.htm;      server_name sample.org www.sample.org;     location / {         try_files $uri $uri/ /index.php;     }      location ~ \.php$ {         fastcgi_pass unix:/run/php/php7.2-fpm.sock;         include snippets/fastcgi-php.conf;     } } Lưu và đóng file .
 Sau đó, 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/example.com /etc/nginx/sites-enabled/example.com 
- sudo ln -s /etc/nginx/sites-available/sample.org /etc/nginx/sites-enabled/sample.org 
Sau đó, 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() của  server  ảo Nginx của bạn trong trình duyệt web bằng cách truy cập http://example.com/info.php và http://sample.org/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.
Bước 7 - Cấu hình Nginx cho Server ảo của 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 đây chỉ định tên của cả hai 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 foobar.net www.foobar.net test.io www.test.io;      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:// foobar.net /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.
  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.
Bước 8 - Cài đặt và cấu hình mod_rpaf
 Trong bước này, bạn sẽ cài đặt một module  Apache có tên là mod\_rpaf 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 đã lỗi thời và không hỗ trợ các chỉ thị cấu hình nhất định. Thay vào đó,  ta  sẽ cài đặt nó từ nguồn.
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.
- RPAF_Header - Tiêu đề để sử dụng cho địa chỉ IP thực của khách hàng.
- RPAF_ProxyIPs - IP proxy để điều chỉnh các yêu cầu HTTP.
-  RPAF_SetHostName - Cập nhật tên vhost để ServerNamevàServerAliashoạt động.
-  RPAF_SetHTTPS - Đặt biến môi trường HTTPSdựa trên giá trị có trongX-Forwarded-Proto.
-  RPAF_SetPort - Đặt biến môi trường 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:// foobar.net /info.php và http:// test.io /info.php trong trình duyệt của bạn và kiểm tra phần PHP Variables . 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.
Bước 9 - Cài đặt trang web HTTPS với Let's Encrypt (Tùy chọn)
 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ẽ nhận được 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 các 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 thành 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  để file  trông giống như thế này, với foobar.net và test.io trong các khối server của riêng chúng:
    server {         listen 80;         server_name foobar.net www.foobar.net;          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 test.io www.test.io;          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.
Trước tiên, hãy thêm repository Certbot chính thức:
- sudo add-apt-repository ppa:certbot/certbot 
Nhấn ENTER khi  được yêu cầu  để xác nhận bạn muốn thêm repository  mới. Sau đó, cập nhật danh sách gói để nhận thông tin gói của repository  mới:
- sudo apt update 
Sau đó cài đặt gói Nginx của Certbot với apt :
- sudo apt install python-certbot-nginx 
Sau khi nó được cài đặt, hãy sử dụng lệnh certbot để tạo certificate  cho foobar.net và www.foobar.net :
- sudo certbot --nginx -d foobar.net -d www.foobar.net 
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ệ.
 Nếu đây là lần đầu tiên bạn chạy certbot , bạn sẽ  được yêu cầu  nhập địa chỉ email và đồng ý với các điều khoản dịch vụ. Sau khi làm như vậy, certbot sẽ giao tiếp với  server  Let's Encrypt, sau đó chạy thử thách để  xác minh  bạn kiểm soát domain  mà bạn đang certificate request .
Tiếp theo, Certbot sẽ hỏi bạn muốn cấu hình cài đặt HTTPS của bạn như thế nào:
OutputPlease choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. ------------------------------------------------------------------------------- 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. ------------------------------------------------------------------------------- Select the appropriate number [1-2] then [enter] (press 'c' to cancel): Chọn lựa chọn của bạn, sau đó nhấn ENTER . Cấu hình sẽ được cập nhật và Nginx sẽ  reload  để chọn cài đặt mới.
Bây giờ thực hiện lệnh cho domain thứ hai:
- sudo certbot --nginx -d test.io -d www.test.io 
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:// foobar.net /info.php và bạn sẽ thấy: 
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.
Bước 10 - Chặn quyền truy cập trực tiếp vào Apache (Tùy chọn)
 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ụ mà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: // example.com : 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.
Bước 11 - Cung cấp file tĩnh bằng Nginx (Tùy chọn)
 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 test.io www.test.io;     root /var/www/test.io;     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 foobar.net www.foobar.net;     root /var/www/foobar.net;     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 test.io www.test.io;     root /var/www/test.io;     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/test.io/fullchain.pem;     ssl_certificate_key /etc/letsencrypt/live/test.io/privkey.pem;     include /etc/letsencrypt/options-ssl-nginx.conf;     ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; }  server {     listen 80;     server_name foobar.net www.foobar.net;     root /var/www/foobar.net;     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/foobar.net/fullchain.pem;     ssl_certificate_key /etc/letsencrypt/live/foobar.net/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 điều đang làm việc, bạn có thể kiểm tra các file log của Apache trong /var/log/apache2 và xem GET yêu cầu cho các info.php file của test.io và foobar.net . 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 http://test.io/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:
Output    test.io:80 your_server_ip - - [01/Jul/2016: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/47.0.2526.111 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.
Kết luận
  Đến đây bạn  có một  server  Ubuntu với Nginx phục vụ example.com và sample.org , cùng với Apache phục vụ foobar.net và test.io 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.
Các tin liên quan
Cách cấu hình Nginx làm web server và reverse-proxy (reverse proxy) cho Apache trên một server Ubuntu 20.042020-10-27
Cách lưu trữ trang web bằng Cloudflare và Nginx trên Ubuntu 20.04
2020-08-17
Cách lưu trữ trang web bằng Cloudflare và Nginx trên Ubuntu 18.04
2020-08-16
Cách cấu hình Jenkins với SSL bằng Nginx Reverse Proxy trên Ubuntu 20.04
2020-07-01
Cách thiết lập Django với Postgres, Nginx và Gunicorn trên Ubuntu 20.04
2020-06-29
Cách thiết lập Nginx với Hỗ trợ HTTP / 2 trên Ubuntu 18.04
2020-06-09
Cách cung cấp các ứng dụng Flask với uWSGI và Nginx trên Ubuntu 20.04
2020-05-26
Cách cung cấp các ứng dụng Flask với uWSGI và Nginx trên Ubuntu 18.04
2020-05-21
Cách cung cấp các ứng dụng Flask với Gunicorn và Nginx trên Ubuntu 20.04
2020-05-20
Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 20.04
2020-05-20
 

