Thứ tư, 06/07/2016 | 00:00 GMT+7

Cách cấu hình Nginx làm web server và reverse-proxy (reverse proxy) cho Apache trên một server Ubuntu 16.04

Apache và Nginx là hai web server nguồn mở 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.

Các 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 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://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 vừa là web server vừa là Reverse Proxy cho Apache - tất cả trên một Server. 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, ta sẽ cài đặt một module Apache có tên mod_rpaf , module này sẽ viết lại một số 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.nettest.io , sẽ được Apache phục vụ.

Yêu cầu

  • Ubuntu 16.04 Server mới.
  • Một account user tiêu chuẩn với các quyền sudo . Bạn có thể cài đặt một account tiêu chuẩn theo các Bước 2 và 3 của Cài đặt Server Ban đầu với Ubuntu 16.04 .
  • Các domain mong muốn phải trỏ đến địa chỉ IP của Server trong console DigitalOcean. 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 ở đó.

Tài liệu tham khảo tùy chọn

Hướng dẫn này yêu cầu kiến thức cơ bản về server ảo trong Apache và Nginx, cũng như cấu hình và tạo certificate SSL. Để biết thêm thông tin về các chủ đề này, hãy xem các bài viết sau.

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

Ngoài Apache và PHP-FPM, ta cũng phải cài đặt module PHP FastCGI Apache có tên libapache2-mod-fastcgi.

Đầu tiên, hãy cập nhật repository 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 - 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. Chỉnh sửa file 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 khỏi các 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ẽ chỉnh sửa file server ảo mặc định của Apache. Chỉ thị <VirtualHost> trong file này được đặt để chỉ phục vụ các trang web trên cổng 80 , vì vậy ta cũng sẽ phải thay đổi điều đó. Mở file server ảo mặc định.

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

Dòng đầu tiên phải là:

<VirtualHost *:80> 

Thay đổi nó thành:

<VirtualHost *:8080> 

Lưu file và 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 ::: 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/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 về cài đặt hiện có của LAMP với mod_php, hãy tắt nó trước bằng:

  • sudo a2dismod php7.0

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 kích hoạt nó.

  • sudo a2enmod actions

Các chỉ thị cấu hình này chuyển yêu cầu file .php tới socket UNIX PHP-FPM.

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

Thêm các dòng sau trong <IfModule mod_fastcgi.c> . . . </IfModule> Khối <IfModule mod_fastcgi.c> . . . </IfModule> , 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  <Directory /usr/lib/cgi-bin>     Require all granted  </Directory> 

Lưu các thay đổi bạn đã thực hiện vào fastcgi.conf 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ị. 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. , Tốt rồi. Nó không ảnh hưởng đến ta bây giờ.

  • sudo systemctl reload apache2

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

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

  • echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php

Để xem file trong trình duyệt, hãy truy cập http:// your_ip_address :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.

API  server  phpinfo

phpinfo Biến PHP

Ở đầ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.nettest.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, tạo các folder root :

  • sudo mkdir -v /var/www/{foobar.net,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 PHP được cấu hình đúng cách.

  • 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

Đặt lệnh sau vào file mới này:

<VirtualHost *:8080>     ServerName foobar.net     ServerAlias www.foobar.net     DocumentRoot /var/www/foobar.net     <Directory /var/www/foobar.net>         AllowOverride All     </Directory> </VirtualHost> 

Lưu ý: AllowOverride All 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

  • sudo nano /etc/apache2/sites-available/test.io.conf
<VirtualHost *:8080>     ServerName test.io     ServerAlias www.test.io     DocumentRoot /var/www/test.io     <Directory /var/www/test.io>         AllowOverride All     </Directory> </VirtualHost> 

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

Reload Apache nếu Cú pháp OK được hiển thị.

  • sudo systemctl reload apache2

Để xác nhận các trang web đang hoạt động, hãy mở http:// foobar.net :8080http:// 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:

trang index  foobar.net

trang index  test.io

Ngoài ra, hãy kiểm tra xem PHP có hoạt động hay khô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.phphttp:// 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 trong Bước 4. Bây giờ 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, ta sẽ cài đặt Nginx và cấu hình các domain example.comsample.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 16.04 .

Cài đặt Nginx bằng trình quản lý gói.

  • sudo apt-get install nginx

Sau đó, xóa softlink của server ảo mặc định vì ta sẽ không sử dụng nó nữa. Ta sẽ tạo trang web mặc định của riêng mình sau này ( example.com ).

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

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,sample.org}

Như ta đã làm với các server ảo của Apache, ta sẽ tạo lại các file indexphpinfo() để thử nghiệm sau khi cài đặt hoàn tất.

  • 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 này trở thành server ảo mặc định xử lý các yêu cầu HTTP không trùng với bất kỳ server ảo nào khác.

Dán phần sau vào file cho 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ờ, 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

Khối server cho sample.org sẽ giống như sau:

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 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

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

  • sudo nginx -t

Sau đó reload Nginx nếu OK được hiển thị.

  • 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.phphttp:// sample.org /info.php . Xem lại phần Biến PHP.

Các biến PHP Nginx

[“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 file server ả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 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

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

  • sudo nginx -t

Reload Nginx nếu OK được hiển thị.

  • 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ị.

phpinfo của Apache qua Nginx

Các biến SERVER_SOFTWAREDOCUMENT_ROOT xác nhận yêu cầu này đã được Apache xử lý. Các biến HTTP X REAL_IPHTTP 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, ta sẽ cài đặt một module Apache có tên mod_rpaf , module này sẽ viết lại các giá trị của REMOTE_ADDR , HTTPSHTTP_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-get 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 nó bằng:

  • unzip stable.zip

Thay đổi vào folder làm việc.

  • cd mod_rpaf-stable

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

  • make
  • sudo make install

Tạo một file trong folder mods-available để tải module rpaf.

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

Thêm dòng sau vào file :

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

Tạo một file khác trong folder 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, đảm bảo thêm địa chỉ IP của Server.

<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 để ServerName và ServerAlias hoạt động.
  • RPAF_SetHTTPS - Đặt biến môi trường HTTPS dựa trên giá trị có trong X-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.loadrpaf.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 Cú pháp OK được trả lại.

  • sudo systemctl reload apache2

Truy cập một trong các trang phpinfo() trên trang web của Apache 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ước 9 - Cài đặt trang web HTTPS (Tùy chọn)

Trong bước này, ta sẽ cấu hình certificate SSL cho cả hai domain được lưu trữ trên Apache. 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 để làm cho các ứng dụng hoạt động liền mạch sau Reverse Proxy SSL.

Tạo một folder cho certificate SSL và private key của chúng.

  • sudo mkdir /etc/nginx/ssl

Đối với bài viết này, ta sẽ sử dụng certificate SSL tự ký có hiệu lực 10 năm. Tạo certificate tự ký cho cả foobar.nettest.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 yêu cầu về các chi tiết nhận dạng certificate . Nhập domain thích hợp cho Common Name mỗi lần.

Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:New York Locality Name (eg, city) []:New York City Organization Name (eg, company) [Internet Widgits Pty Ltd]:DigitalOcean Inc Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:foobar.net Email Address []: 

Bây giờ mở file server ảo Apache mà proxy yêu cầu từ Nginx tới Apache.

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

Vì ta có các certificate và private key biệt cho từng domain nên ta cần có server { . . . } riêng server { . . . } khối cho mỗi domain . Bạn nên xóa nội dung hiện tại của file 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;     } } 

Ta đã tách khối server ban đầu thành hai khối riêng biệt và ta cũng yêu cầu Nginx lắng nghe trên Cổng 443, cổng mặc định cho các trang web an toàn.

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 systemctl reload nginx

Bây giờ, hãy truy cập vào một trong các domain của Apache trong trình duyệt của bạn bằng tiền tố https:// . Đầu tiên, hãy truy cập vào https:// foobar.net /info.php và bạn sẽ thấy:

phpinfo ssl

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

Tìm trong phần Biến PHP . Biến SERVER_PORT đã được đặt thành 443HTTPS đượ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ướ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ụ có 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ướ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.

Đầu tiên, mở file server ảo apache .

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

Bạn cần thêm hai khối vị trí bổ sung vào mỗi khối server và sửa đổi các khối vị trí hiện có. (Nếu bạn chỉ có một khối server từ bước trước đó, bạn có thể thay thế hoàn toàn nội dung của file để nó trùng với nội dung được hiển thị bên dưới.) Ngoài ra, bạn cần cho Nginx biết nơi tìm file tĩnh cho mỗi trang web . Những thay đổi này được hiển thị bằng màu đỏ trong đoạn 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 cũng muốn có sẵn HTTPS, hãy giữ nguyên bộ listen 443 ssl; và các cài đặt SSL khác từ Bước 9.

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: Vị location ~ /\. chỉ thị là rất quan trọng; điều này ngăn Nginx in nội dung của các file như .htaccess.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 này đ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 các yêu cầu GET cho info.php file của test.iofoobar.net . Sử dụng lệnh tail để xem vài dòng cuối cùng của file và sử dụng lựa chọn -f để xem file để biết các thay đổi.

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

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:

 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 đó.

Cảnh báo duy nhất cho cài đặt này là 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.

Kết luận

Đến đây bạn có một Ubuntu Server với Nginx phục vụ example.comsample.org , cùng với Apache phục vụ foobar.nettest.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.


Tags:

Các tin liên quan

Cách thiết lập server block Nginx (server ảo) trên Ubuntu 16.04
2016-05-19
Cách cung cấp các ứng dụng Flask với uWSGI và Nginx trên Ubuntu 16.04
2016-05-19
Cách cung cấp các ứng dụng Flask với Gunicorn và Nginx trên Ubuntu 16.04
2016-05-19
Cách thiết lập Django với Postgres, Nginx và Gunicorn trên Ubuntu 16.04
2016-05-18
Cách cung cấp các ứng dụng Django với uWSGI và Nginx trên Ubuntu 16.04
2016-05-16
Cách cài đặt Nginx trên Ubuntu 16.04
2016-04-21
Cách tạo chứng chỉ SSL tự ký cho Nginx trong Ubuntu 16.04
2016-04-21
Cách cài đặt Discourse Behind Nginx trên Ubuntu 14.04
2016-04-19
Cách thiết lập Nginx với Hỗ trợ HTTP / 2 trên Ubuntu 16.04
2016-04-12
Cách thêm module gzip vào Nginx trên CentOS 7
2016-03-15