Cách cấu hình Nginx như một Web Server và Reverse Proxy cho Apache trên một máy chủ Ubuntu 16.04

5 năm trước

 

Giới Thiệu 

Apache và Nginx là hai máy chủ web mã nguồn mở phổ biến thường được sử dụng với PHP. Nó hữu ích để chạy cả hai trên cùng một máy ảo khi lưu trữ nhiều trang web có những yêu cầu đa dạng. Giải pháp chung để chạy hai máy chủ web trên một hệ thống đơn lẻ là sử dụng nhiều địa chỉ IP hoặc các số cổng khác nhau.

VPS mà 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 không phổ biến. Có một số cổng khác như 81 hoặc 8080 cho máy chủ web thứ hai là một giải pháp khác, nhưng chia sẻ URL với số cổng (như là http://example.com:81) không phải lúc nào cũng hợp lý hoặc lý tưởng.

Hướng dẫn này sẽ chỉ cho bạn cách cấu hình Nginx như một máy chủ web và như một proxy ngược lại cho Apache - tất cả trên một VPS. Tùy thuộc vào ứng dụng web, thay đổi mã có thể được yêu cầu để giữ  Apache reverse-proxy-aware, đặc biệt là khi các trang web SSL được cấu hình. Để tránh điều này, chúng ta sẽ cài đặt một mô-đun Apache tên là mod_rpaf mà viết lại một số biến môi trường nhất định vì thế nó xuất hiện  Apache trực tiếp xử lý các yêu cầu từ các khách hàng web.

Chúng ta sẽ lưu trữ bốn tên miền trên một VPS. Hai miền sẽ được phục vụ bởi Nginx: example.com (  máy chủ ảo mặc định) và sample.org. Hai miền còn lại là foobar.net và test.io, sẽ được cung cấp bởi Apache.

 

Yêu Cầu 

  • Một  Ubuntu 16.04 VPS mới.
  • Một tài khoản người dùng tiêu chuẩn cùng với các đặc quyền sudo . Ybạn có thể thiết lập một tài khoản chuẩn bằng cách làm theo các Bước 2 và 3 của Thiết lập ban đầu cho server dùng Ubuntu 16.04
  • Các tên miền mong muốn nên trỏ đến địa chỉ IP của VPS . Nếu bạn lưu trữ DNS của tên miền ở nơi khác, bạn nên tạo các bản ghi A phù hợp ở đó.
 

Bước 1 — Cài đặt Apache và PHP-FPM

Ngoài Apache và PHP-FPM, chúng ta cũng phải cài đặt mô đun PHP FastCGI Apache có tên là libapache2-mod-fastcgi.

Trước tiên, hãy cập nhật kho apt  để đảm bảo bạn có các gói mới nhất.

sudo apt-get update

Tiếp theo, cài đặt các gói cần thiết

sudo apt-get install apache2 libapache2-mod-fastcgi php-fpm

Tiếp theo, hãy thay đổi cấu hình mặc định của Apache.

 

Bước 2 — Tạo Cấu hình  Apache và PHP-FPM

Trong bước này chúng ta sẽ thay đổi số cổng của Apache thành 8080 và cấu hình nó để làm việc với PHP-FPM sử dụng mô-đun mod_fastcgi. Chỉnh sửa tệp cấu hình Apache và thay đổi số cổng của Apache.

sudo nano /etc/apache2/ports.conf

Tìm dòng sau:

Listen 80

Thay đổi nó thành:

Listen 8080

Lưu và thoát  ports.conf.

Các máy chủ Web thường được thiết lập để lắng nghe trên 127.0.0.1:8080 khi cấu hình một proxy nghịch đảo nhưng làm như vậy sẽ đặt giá trị của biến môi trường PHP SERVER_ADDR đến địa chỉ IP loopback thay vì IP công khai của máy chủ. Mục đích của chúng ta là thiết lập Apache theo cách mà các trang web của nó không nhìn thấy một proxy nghịch đảo phía trước của nó. Vì vậy, chúng ta sẽ cấu hình nó để lắng nghe trên 8080 trên tất cả các địa chỉ IP.

Note: Các máy chủ Web thường được thiết lập đẻ lắng nghe trên 127.0.0.1:8080 khi cấu hình một proxy nghịch đảo nhưng làm như vậy sẽ đặt giá trị môi trường của  PHP SERVER_ADDR đến địa chỉ IP loopback thay vì IP công khai của chủ. Mục đích của chúng ta là thiết lập Apache theo cách mà các trang web của nó không nhìn thấy một proxy nghịch đảo phía trước nó . Vì vậy chúng 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 chúng ta sẽ chỉnh sửa tập tin lưu trữ máy chủ mặc định của Apache. Chỉ thị   trong tập tin này được thiết lập để phục vụ các trang web chỉ trên cổng 80, vì vậy chúng ta cũng phải thay đổi nó. Mở tệp lưu trữ máy chủ ảo mặc định.

sudo nano /etc/apache2/sites-available/000-default.conf

Dòng đầu tiên sẽ là:

Thay đổi nó thành:

8080>

Lưu file và tải lại Apache.

sudo systemctl reload apache2

Xác nhận rằng  Apache bây giờ đang lắng nghe trên 8080.

sudo netstat -tlpn

Đầu ra nên giống như ví dụ sau, với apache2 nghe trên :::8080.

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/sshdtcp6 0 0 :::8080 :::* LISTEN 4678/apache2tcp6 0 0 :::22 :::* LISTEN 1086/sshd

Một khi bạn xác minh rằng Apache đang lắng nghe trên cổng chính xác, 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ó đòi hỏi cấu hình bổ sung để làm việc với PHP-FPM.

Nếu bạn đang cố gắng hướng dẫn này trên một cài đặt hiện tại của LAMP với mod_php, vô hiệu hóa nó đầu tiên với:

Lưu ý: Nếu bạn đang thử hướng dẫn này trên một cài đặt hiện tại của LAMP với mod_php, vô hiệu hóa nó đầu tiên với:

sudo a2dismod php7.0

Chúng ta sẽ thêm một khối cấu hình cho mod_fastcgi mà phụ thuộc mod_actionmod_action bị vô hiệu theo mặc định, vì vậy trước tiên chúng ta cần kích hoạt nó.

sudo a2enmod actions

Những chỉ thị cấu hình này yêu cầu các tệp tin .php tới ổ cắm PHP-FPM UNIX.

sudo nano /etc/apache2/mods-enabled/fastcgi.conf

Thêm dòng dưới đây trong khối . . . , bên dưới các mục hiện có trong khối đó:

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.0-fpm.sock -pass-header Authorization
 Require all granted

Lưu các thay đổi bạn làm đến  fastcgi.conf và thực hiện một thử nghiệm cấu hình.

sudo apachectl -t

Tải lại Apache nếu Syntax OK được hiển thị. Nếu bạn thấy cảnh báoCould not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message., điều đó là ổn. Nó không ảnh hưởng đến chúng ta bây giờ.

sudo systemctl reload apache2

Bây giờ hãy chắc chắn rằng chúng ta có thể phục vụ PHP từ Apache.

Bước 4 - Xác minh tính năng PHP

Kiểm tra PHP hoạt động hay không bằng cách tạo ra một tệp phpinfo()  và truy cập nó từ trình duyệt web của bạn.

echo "" | sudo tee /var/www/html/info.php

Để xem tệp trong trình duyệt, hãy truy cập http://your_ip_address:8080/info.php. Điều này sẽ cung cấp cho bạn một danh sách các cài đặt cấu hình PHP đang sử dụng.

phpinfo Server API

phpinfo PHP Variables

Ở đầu trang, hãy kiểm tra xem  Server API có giao tiếp với  FPM/FastCGI . Với hai phần ba đường xuống trang, phần PHP Variables sẽ nói với bạn SERVER_SOFTWARE là Apache trên Ubuntu. Những điều này xác nhận rằng mod_fastcgi đang hoạt động và Apache đang sử dụng PHP-FPM để xử lý tệp PHP.

Bước 5 - Tạo máy chủ ảo cho Apache

Chúng ta hãy tạo tập tin lưu trữ ảo Apache cho các tên miền foobar.net và test.io. Để làm điều đó, trước tiên chúng ta sẽ tạo thư mục gốc tài liệu cho cả hai trang web và đặt một số tệp mặc định trong các thư mục đó để chúng ta có thể dễ dàng kiểm tra cấu hình.

Đầu tiên tạo các thư mục gốc:

sudo mkdir -v /var/www/{foobar.net,test.io}

Sau đó tạo một tệp index cho mỗi trang.

echo "

Foo Bar

" | sudo tee /var/www/foobar.net/index.html
echo "

Test IO

" | sudo tee /var/www/test.io/index.html

Sau đó tạo một tệp phpinfo() cho mỗi trang vì vậy chúng ta có thể kiểm tra PHP được cấu hình một cách phù hợp .

echo "" | sudo tee /var/www/foobar.net/info.php
echo "" | sudo tee /var/www/test.io/info.php

Bây giờ tạo một tệp máy chủ ảo cho miền foobar.net 

sudo nano /etc/apache2/sites-available/foobar.net.conf

Đặt chỉ thị sau đây vào tệp mới này:

 ServerName foobar.net ServerAlias www.foobar.net DocumentRoot /var/www/foobar.netfoobar.net>
AllowOverride All

Lưu ý: AllowOverride All cho phép hỗ trợ .htaccess 

Đây chỉ là các chỉ thị cơ bản nhất. 

Lưu và đóng file. Sau đó tạo một cấu hình tương tự cho test.io.

sudo nano /etc/apache2/sites-available/test.io.conf
 ServerName test.io ServerAlias www.test.io DocumentRoot /var/www/test.iotest.io>
AllowOverride All

Bây giờ, cả hai máy chủ ảo Apache được thiết lập, cho phép các trang web sử dụng câu lệnh  a2ensite . Điều này tạo ra một liên kết tượng trưng đến tệp máy chủ ảo trong thư mục sites-enabled 

sudo a2ensite foobar.net
sudo a2ensite test.io

Kiểm tra lại lỗi cấu hình của Apache.

sudo apachectl -t

Tải lại Apache nếu Syntax OK được hiển thị.

sudo systemctl reload apache2

Để xác nhận các trang web đang làm việc, mở http://foobar.net:8080 và http://test.io:8080 trong trình duyệt của bạn và xác minh rằng mỗi trang web sẽ hiển thị trong tệp index.html .

Bạn sẽ thấy kết quả sau:

foobar.net index page

test.io index page

Ngoài ra, kiểm tra rằng PHP đang làm việc bằng cách truy cập các tệp info.php cho mỗi trang.Ghé thăm 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 các cấu hình PHP trên mỗi trang như bạn đã thấy trong Bước 4. Giờ đây chúng ta có hai trang web được lưu trữ trên Apache tại cổng 8080

 

Bước 6 — Cài đặt và Cấu hình Nginx

Trong bước này chúng ta sẽ cài đặt Nginx và cấu hình các tên miền example.com và sample.org như máy chủ ảo của Nginx. 

Cài đặt Nginx bằng cách sử dụng trình quản lý gói.

sudo apt-get install nginx
  •  

Sau đó gỡ bỏ liên kết mềm mặc định của máy chủ ảo vì chúng ta sẽ không sử dụng nó nữa. Chúng ta sẽ tạo trang web mặc định riêng  sau(example.com).

sudo rm /etc/nginx/sites-enabled/default

Bây giờ chúng ta sẽ tạo các máy ảo cho Nginx bằng cách sử dụng cùng một thủ tục mà chúng ta đã sử dụng cho Apache. Đầu tiên tạo thư mục gốc của tài liệu cho cả hai trang web:

sudo mkdir -v /usr/share/nginx/{example.com,sample.org}

Như chúng ta đã làm với các máy chủ ảo của Apache, chúng ta sẽ tạo ra tệp index và phpinfo() để thử nghiệm sau khi thiết lập xong.

echo "

Example.com

" | sudo tee /usr/share/nginx/example.com/index.html
echo "

Sample.org

" | sudo tee /usr/share/nginx/sample.org/index.html
  •  
echo "" | sudo tee /usr/share/nginx/example.com/info.php
echo "" | sudo tee /usr/share/nginx/sample.org/info.php

Bây giờ tạo một tệp máy chủ ảo cho miền example.com.

udo nano /etc/nginx/sites-available/example.com

Nginx gọi server {. . .}  các vùng của một tệp cấu hình server blocks. Tạo khối máy chủ cho máy chủ ảo chính, example.com. Chỉ thị cấu hình default_server làm cho máy chủ ảo mặc định xử lý các yêu cầu HTTP không khớp với bất kỳ máy chủ ảo nào khác.

Dán các tệp sau vào tệp example.com:

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.0-fpm.sock;
include snippets/fastcgi-php.conf;
}}

Lưu và đóng file. Bây giờ tạo tệp lưu trữ ảo cho tên miền thứ hai của Nginx, sample.org.

sudo nano /etc/nginx/sites-available/sample.org

Khối máy chủ cho sample.org như thế này:

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.0-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 liên kết tượng trưng tới thư mục 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

Thực hiện kiểm tra cấu hình Nginx:

sudo nginx -t

Sau đó tải lại Nginx nếu OK được hiển thị

sudo systemctl reload nginx

Bây giờ truy cập vào tệp phpinfo() của các máy chủ ảo Nginx trong trình duyệt web bằng cách ghé thăm  http://example.com/info.php và http://sample.org/info.php. Xem lại các phần PHP Variables.

Nginx PHP Variables

["SERVER_SOFTWARE"] sẽ nói nginx, chỉ ra rằng các tập tin được phục vụ trực tiếp bởi Nginx. ["DOCUMENT_ROOT"] sẽ trỏ đến thư mục bạn đã tạo trước đó trong bước này cho mỗi trang Nginx.

Lúc này, chúng ta đã cài đặt Nginx và tạo ra hai máy ảo. Tiếp theo chúng ta sẽ cấu hình Nginx cho các yêu cầu proxy đối với các miền được lưu trữ trên Apache.

 

Bước 7 - Cấu hình Nginx cho máy chủ ảo của Apache

Hãy tạo một máy chủ ảo bổ sung Nginx với nhiều tên miền trong các chỉ thị server_name . Các yêu cầu cho những  tên miền này sẽ được chuyển tiếp đến Apache.

Tạo tệp lưu trữ máy chủ ảo Nginx mới:

sudo nano /etc/nginx/sites-available/apache

Thêm khối mã bên dưới. Điều này chỉ định tên của cả hai tên miền máy chủ ảo Apache và proxy yêu cầu của họ tới Apache. Hãy nhớ sử dụng địa chỉ IP công khai 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 tệp và kích hoạt máy chủ ảo mới này bằng cách tạo liên kết kí hiệu.

sudo ln -s /etc/nginx/sites-available/apache /etc/nginx/sites-enabled/apache

Thực hiện kiểm tra cấu hình:

sudo nginx -t

 

Tải lại Nginx nếu OK được hiển thị.

sudo systemctl reload nginx

Mở trình duyệt và truy cập vào URL http://foobar.net/info.php trên trình duyệt của bạn. Cuộn xuống tới phần PHP Variables và kiểm tra các giá trị được hiển thị.

phpinfo of Apache via Nginx

Các biến 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  HTTPXREAL_IP và HTTPXFORWARDED_FOR đã được Nginx thêm và nên 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.

Chúng ta đã thiết lập thành công Nginx cho các yêu cầu proxy cho các miền cụ thể đối với Apache. Tiếp theo, chúng ta hãy cấu hình Apache để thiết lập biến REMOTE_ADDR  như thể nó đã  xử lý các yêu cầu này 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, chúng ta sẽ cài đặt một mô-đun Apache có tên mod_rpaf mà viết lại các biến của  REMOTE_ADDRHTTPS và HTTP_PORT  dựa trên các biến được cung cấp bằng một reverse proxy. Nếu không có mô đun này, một số ứng dụng PHP sẽ yêu cầu thay đổi mã để làm việc liền mạch từ phía sau một proxy. Mô-đun này có trong kho của Ubuntu như là 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 đó, chúng ta sẽ cài đặt nó từ nguồn.

Cài đặt các gói cần thiết để xây dựng mô-đun:

sudo apt-get install unzip build-essential apache2-dev

Tải xuống bản phát hành ổn định mới nhất từ GitHub.

wget https://github.com/gnif/mod_rpaf/archive/stable.zip

Giải nén nó bằng:

unzip stable.zip

Thay đổi vào thư mục làm việc.

cd mod_rpaf-stable

Sau đó biên dịch và cài đặt module.

make
sudo make install

Tạo ra một tệp trong thư mục mods-available  mà tải mô đun rpaf .

sudo nano /etc/apache2/mods-available/rpaf.load

Thêm dòng dưới đây vào tệp.

LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf.so

Tạo một tệp khác trong thư mục này. Điều này sẽ chứa các chỉ thị cấu hình.

sudo nano /etc/apache2/mods-available/rpaf.conf

Thêm khối mã sau đây, đảm bảo thêm địa chỉ IP của VPS của bạn.

 RPAF_Enable On
RPAF_Header X-Real-Ip
RPAF_ProxyIPs your_server_ip  RPAF_SetHostName On
RPAF_SetHTTPS On
RPAF_SetPort On

Đây là một mô tả ngắn gọn về mỗi chỉ thị. 

  • 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 để ServerName và ServerAlias hoạt động.
  • RPAF_SetHTTPS - Cài đặt biến môi trường HTTPS  dựa trên giá trị chứa trong X-Forwarded-Proto.
  • RPAF_SetPort - Cài đặt biến môi trường SERVER_PORT . Hữu ích khi Apache đứng sau một proxy SSL.

Lưu rpaf.conf.và kích hoạt mô-đun

sudo a2enmod rpaf

Điều này tạo liên kết biểu tượng của các tệp tin rpaf.load và rpaf.conf trong thư mục mods-enabled . Bây giờ kiểm tra cấu hình.

sudo apachectl -t

Tải lại  Apache nếu Syntax OK lại hiển thị.

sudo systemctl reload apache2

Truy cập vào một trong các trang  Apache's websites' phpinfo() trên 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à địa chỉ IP công cộng trên máy tính cục bộ của bạn.

 

Bước 9 - Thiết lập trang web HTTPS (Tùy chọn)

Trong bước này, chúng ta sẽ cấu hình chứng chỉ SSL cho cả hai tên miền được lưu trữ trên Apache. Nginx hỗ trợ chấm dứt SSL để chúng tôi có thể thiết lập SSL mà không sửa đổi các tập tin cấu hình của Apache.Mô-đun mod_rpaf  đảm bảo các biến môi trường yêu cầu được đặt trên Apache để làm cho các ứng dụng hoạt động liền mạch đằng sau một SSL reverse proxy.

Tạo một thư mục cho các chứng chỉ SSL và các khóa cá nhân của họ.

sudo mkdir /etc/nginx/ssl

Đối với bài viết này, chúng ta sẽ sử dụng chứng chỉ SSL tự ký có giá trị là 10 năm. Tạo chứng chỉ tự ký cho cả hai foobar.net và test.io.

sudo openssl req -x509 -sha256 -newkey rsa:2048 -keyout /etc/nginx/ssl/foobar.net-key.pem -out /etc/nginx/ssl/foobar.net-cert.pem -days 3650 -nodes
sudo openssl req -x509 -sha256 -newkey rsa:2048 -keyout /etc/nginx/ssl/test.io-key.pem -out /etc/nginx/ssl/test.io-cert.pem -days 3650 -nodes

Mỗi lần, bạn sẽ được nhắc nhở chi tiết nhận dạng chứng chỉ. Nhập tên miền thích hợp choCommon Name .

Country Name (2 letter code) [AU]:USState or Province Name (full name) [Some-State]:New YorkLocality Name (eg, city) []:New York CityOrganization Name (eg, company) [Internet Widgits Pty Ltd]:DigitalOcean IncOrganizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:foobar.netEmail Address []:

Bây giờ mở tệp lưu trữ máy chủ ảo Apache yêu cầu từ Nginx đến Apache.

sudo nano /etc/nginx/sites-available/apache

Vì chúng ta có chứng chỉ và khóa riêng cho từng miền nên cần phải có riêng các khốiserver { . . . } từng miền. Bạn nên xóa nội dung hiện tại của tệp và thay thế bằng các nội dung sau:

server {
listen 80;
listen 443 ssl;
server_name test.io www.test.io;
ssl on;
ssl_certificate /etc/nginx/ssl/test.io-cert.pem;
ssl_certificate_key /etc/nginx/ssl/test.io-key.pem;
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;
listen 443 ssl;
server_name foobar.net www.foobar.net;
ssl on;
ssl_certificate /etc/nginx/ssl/foobar.net-cert.pem;
ssl_certificate_key /etc/nginx/ssl/foobar.net-key.pem;
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;
}}

Chúng ta chia tách khối máy chủ ban đầu thành hai khối riêng biệt, và chúng ta cũng đã nói với Nginx nghe cổng 443, cổng mặc định cho các trang web an toàn.

Lưu tệp và thực hiện kiểm tra cấu hình.

sudo nginx -t

Tải lại Nginx nếu thử nghiệm thành công

sudo systemctl reload nginx
  •  

Bây giờ, hãy truy cập một trong các tên miền của Apache trong trình duyệt của bạn bằng cách sử dụng tiền tố https:// . Trước tiên , ghé thăm https://foobar.net/info.php và bạn sẽ thấy điều này:

phpinfo ssl

Chúng ta đã sử dụng chứng chỉ tự kí cho hướng dẫn này và do đó trình duyệt có thể cảnh báo rằng kết nối có thể không đáng tin cậy .Bạn có thể tiến hành an toàn bằng cách tin tưởng trang web.

 

Nhìn vào phần PHP Variables. Biến  SERVER_PORT được cài đặt đến 443 và biến  HTTPS được cài đặt đến on,như thể Apache đã được truy cập trực tiếp qua HTTPS. Với các biến này, các ứng dụng PHP không phải được cấu hình đặc biệt để hoạt động đằng sau một proxy nghịch đảo.

Bước 10 - Chặn truy cập trực tiếp vào Apache (Tùy chọn)

Vì Apache đang nghe trên cổng 8080 trên địa chỉ IP công cộng , nên nó có thể được truy cập bởi mọi người.Nó có thể bị chặn bằng cách làm lệnh IPtables sau vào cài đặt quy tắc 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 VPS của bạn thay cho mẫu bằng màu đỏ. Một khi cổng8080 bị chặn trong firewall của bạn, hãy kiểm tra rằng Apache không thể truy cập vào nó. 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://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 , một người bên ngoài sẽ không thấy sự khác biệt giữa cổng 8080 và  một cổng mà không có bất kì dịch vụ nào ở đó .

Lưu ý: Các quy tắc IPtables không tồn tại khi khởi động lại hệ thống theo mặc định. Có nhiều cách để bảo vệ các quy tắc IPtables, nhưng cách dễ nhất là sử dụng iptables-persistent trong kho Ubuntu's.

 

Bước 11 - Cung cấp các tệp ổn định bằng Nginx (Tùy chọn)

Khi Nginx yêu cầu các tên miền của Apache, nó sẽ gửi tất cả các yêu cầu về tên miền đó đến Apache. Nginx nhanh hơn Apache trong việc phục vụ các tệp tĩnh như hình ảnh, JavaScript và các trang tính. Vì vậy, hãy cấu hình tệp máy chủ ảo của Nginx apache  trực tiếp phục vụ các tập tin tĩnh nhưng gửi các yêu cầu PHP tới Apache.

Trước tiên , mở tệp máy chủ ảo  apache .

sudo nano /etc/nginx/sites-available/apache

Bạn sẽ cần thêm hai khối vị trí bổ sung cho mỗi khối máy chủ và sửa đổi các khối địa điểm hiện có. (Nếu bạn chỉ có một khối máy chủ từ bước trước, bạn có thể thay thế hoàn toàn các nội dung của tệp sao cho phù hợp với nội dung được hiển thị bên dưới). Ngoài ra, bạn cần phải cho Nginx tìm nơi để tìm các tệp tin tĩnh cho mỗi trang web . Những thay đổi này được hiển thị bằng màu đỏ trong mã 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_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 ~ /\. {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 ~ /\. {deny all;}}

Nếu bạn muốn HTTPS có sẵn, hãy bảo toàn  listen 443 ssl; dòng và các cài đặt SSL từ Bước 9.

Chỉ thị try_files  làm cho Nginx tìm kiếm các tệp trong thư mục gốc của tài liệu và phục vụ trực tiếp chúng. Nếu tệp có phần mở rộng .php, yêu cầu được chuyển tới Apache. Ngay cả khi tập tin không được tìm thấy trong tài liệu gốc, yêu cầu được chuyển đến Apache để ứng dụng các tính năng như permalinks làm việc mà không có vấn đề.

Warning: Chỉ thị location ~ /\. rất là quan trọng; điều này ngăn Nginx từ việc in các nội dung trong tệp như .htaccess and .htpasswd chứa thông tin nhạy cảm.

Lưu tệp và thực hiện kiểm tra cấu hình.

sudo nginx -t

Tải lại Nginx nếu thử nghiệm thành công.

sudo service nginx reload

Để xác minh điều này đang làm việc, bạn có thể kiểm tra tệp nhật ký của Apache trong /var/log/apache2và xem các yêu cầu GET cho các tệp info.php của test.io và foobar.net. Sử dụng lệnh tail  để xem vài dòng cuối cùng của tệp, và sử dụng chuyển đổi -f  để xem các tệp thay đổi.

sudo tail -f /var/log/apache2/other_vhosts_access.log

Truy cập http://test.io/info.php trên trình duyệt của bạn và sau đó nhìn vào đầu ra từ đăng nhập. Bạn sẽ thấy rằng Apache  trả lời:

 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 đó thăm trang index.html và bạn sẽ không thấy bất kỳ mục nhật ký đăng nhập nào từ Apache. Nginx đang phục vụ chúng.

Khi bạn hoàn thành việc quan sát tệp nhật ký , nhấnCTRL+C  để ngừng điều chỉnh nó.

Sự báo trước duy nhất cho cho thiết lập này là Apache sẽ không thể để hạn chế truy cập vào các tập tin tĩnh. Kiểm soát truy cập cho các tệp tĩnh sẽ cần phải được định cấu hình trong tệp máy chủ ảo của Nginx's apache

 

Kết luận

Bây giờ bạn có một Ubuntu VPS 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 hoạt động như là một proxy ngược lại cho Apache, dịch vụ proxy của Nginx là minh bạch và các kết nối đến các miền của Apache xuất hiện đượ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à ổn định.

Tìm hiểu thêm những điều thú vị  tại ViCloud Community