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
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_action
. mod_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
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.
Ở đầ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.htmlecho "
Test IO
" | sudo tee /var/www/test.io/index.htmlSau đó 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.net foobar.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.io test.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:
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.htmlecho "
Sample.org
" | sudo tee /usr/share/nginx/sample.org/index.htmlecho "" | 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.
["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ị.
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_ADDR, HTTPS 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 trongX-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:
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/apache2
và 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