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

nexsoft.vn 19/01/2024
Cách cấu hình Nginx như một Web Server và Reverse Proxy cho Apache trên máy chủ Ubuntu 20.04

Nginx là một web server chất lượng và hiệu quả, được sử dụng rộng rãi có thể hoạt động như một reverse proxy. Khi kết hợp với Apache, nó có thể cung cấp hiệu suất tốt hơn và tăng tính linh hoạt để phục vụ nội dung web. Trong bài viết này, Vietnix sẽ hướng dẫn bạn cách cấu hình Nginx làm web server và reverse proxy cho Apache trên Ubuntu 20.04.

Yêu cầu để cấu hình Nginx làm web server và reverse proxy cho Apache trên Ubuntu 20.04.

Để thực hiện hướng dẫn này, bạn cần có:

  • Một máy chủ Ubuntu 20.04 với một user non-root có quyền sudo và firewall.
  • 4 tên miền được cấu hình để trỏ đến địa chỉ IP cho server của bạn. Nếu bạn lưu trữ DNS của tên miền của mình ở nơi khác, bạn nên tạo các bản ghi A phù hợp ở đó.

Nếu bạn cần tên miền và máy chủ Ubuntu để cài đặt Nginx, hãy tham khảo đăng ký tên miền và VPS Server tại Vietnix. Vietnix hiện đang cung cấp dịch vụ đăng ký tên miền và cho thuê các gói VPS hỗ trợ hệ điều hành Ubuntu với nhiều cấu hình và chi phí hợp lý giúp bạn dễ dàng lựa chọn gói dịch vụ phù hợp với nhu cầu sử dụng.

Thuê VPS của Vietnix giúp bạn yên tâm cài đặt, triển khai các ứng dụng nhờ tốc độ cao, ổn định và bảo mật an toàn. Liên hệ ngay với Vietnix để được tư vấn chi tiết.

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

Đầu tiên, cập nhật danh sách gói:

Tiếp theo cài đặt gói Apache và PHP-FPM:

Module FastCGI Apache sẽ không có sẵn trong kho lưu trữ Ubuntu nên phải tải từ kernel.org và cài đặt bằng câu lệnh dpkg

Bước 2: Cấu hình Apache và PHP-FPM

Bạn đổi cổng Apache sang 8080 và cấu hình để làm việc với PHP-FPM bằng cách sửu dụng module mod_fastcgi. Đổi tên file cấu hình ports.conf của Apache bằng:

Tạo mới một file ports.conf với cổng 8080:

Tiếp theo tạo một file virtual server cho Apache, chỉ thị <VirtualHost> trong tệp này sẽ được đặt để chỉ phục vụ các trang web trên cổng 8080.

Vô hiệu hoá virtual server mặc định:

Tiếp theo, tạo một file virtual server mới:

Mở file cấu hình mới bằng cách:

Đổi listening port sang 8080:

Lưu và kích hoạt các cài đặt mới:

Reload Apache:

Cài đặt gói net-tools chứa lệnh netstat:

Xác nhận lại rằng Apache đang listening trên cổng 8080:

Kết quả sẽ hiển thị ra như sau, với apache2 đang listen trên cổng 8080:

Bước 3: Cấu hình Apache để sử dụng mod_fastcgi

Apache phục vụ các trang PHP bằng cách sử dụng mod_php theo mặc định, để hoạt động với PHP-FPM bạn cần cấu hình một số chi tiết.

Bạn sẽ thêm khối cấu hình cho mod_fastcgi, khối này phụ thuộc vào mod_action. Theo mặc định, mod_action sẽ bị vô hiệu hoá, vì vậy trước tiên bạn hãy bật nó lên bằng cách:

Đổi tên file cấu hình FastCGI có sẵn:

Tạo mới một file cấu hình:

Thêm các lệnh sau vào file để chuyển tiếp các yêu cầu cho file .php sang socket UNIX PHP-FPM.

Lưu các thay đổi và chạy thử để kiểm tra:

Tải lại Apache khi dòng chữ Syntax OK hiển thị:

Bước 4: Xác minh lại các chức năng PHP

Đảm bảo rằng PHP hoạt động bằng cách tạo tệp phpinfo() và truy cập file đó từ trình duyệt web.

Tạo một tệp /var/www/html/info.php, nó sẽ chứa lệnh gọi hàm phpinfo:

Cho phép cổng 8080 thông qua firewall:

Đảm bảo lưu lượng truy cập TLS trên cổng 443 có thể vào.

Chấp nhận Apache Full kiểm soát lưu lượng truy cập trên cổng 80 và 443:

Kiểm tra lại trạng thái firewall:

Kết quả sẽ hiển thị ra như sau:

Bạn sẽ thấy rằng cổng 8080 và Apache Full đã được cho phép thông qua firewall. Bây giờ hãy xem trang info.php

Để kiểm tra trang info.php trên trình duyệt, hãy đi đến http://your_server_ip:8080/info.php. Nó sẽ hiển thị list các hiệu chỉnh cài đặt PHP đang sử dụng:

Kiểm tra server API
Danh sách các hiệu chỉnh cài đặt
Danh sách các hiệu chỉnh cài đặt

Kiểm tra xem Server API có ghi FPM/FastCGI không, tiếp đến, phần PHP Variables sẽ cho bạn biết SERVER_SOFTWARE là Apache trên Ubuntu. Chúng xác nhận rằng mod_fastcgi đang hoạt động và Apache đang sử dụng PHP-FPM để xử lí các tệp PHP.

Bước 5: Tạo virtual server cho Apache

Hãy tạo virtual server Apache cho tên miền apache1.your_domain và apache2.your_domain. Để làm được điều này, đầu tiên bạn tạo một thư mục gốc cho cả hai trang web và đặt một số tệp mặc định vào các thư mục đó để bạn có thể dễ dàng hơn trong việc kiểm tra cấu hình.

Tạo file index cho từng site:

Sau đó, tạo file phpinfo() cho từng trang web để có thể kiểm tra xem PHP có được cấu hình đúng hay không:

Tạo file virtual server cho apache1.your_domain:

Thêm đoạn code sau vào file để định nghĩa virtual server:

Dòng AllowOverride All cho phép bật tính năng hỗ trợ .htaccess.

Lưu và đóng file. Sau đó, tạo một cấu hình tương tự cho apache2.your_domain. Trước tiên, tạo file:

Sau đó, thêm cấu hình sau vào file:

Lưu file và thoát khỏi trình soạn thảo.

Sau khi 2 virtual host Apache đã thiết lập, bạn kích hoạt các trang web bằng lệnh a2ensite. Lệnh này sẽ tạo một liên kết tượng trưng đến tệp virtual host trong thư mục sites-enabled:

Kiểm tra lại Apache để xem có lỗi cấu hình không bằng cách chạy lệnh sau:

Nếu không có lỗi, bạn sẽ thấy “Syntax OK” được hiển thị. Nếu bạn thấy bất kỳ thông báo nào khác, hãy xem lại cấu hình và thử lại.

Reload lại Apache để áp dụng các thay đổi sau khi cấu hình của bạn không có lỗi:

Để xác nhận các trang web hoạt động, hãy mở http://apache1.your_domain:8080 và http://apache2.your_domain:8080 trong trình duyệt của bạn và xác nhận rằng mỗi trang web hiển thị tệp index.html của riêng mình. Bạn sẽ thấy các kết quả sau đây:

Kiểm tra Apache 1
Kiểm tra Apache 1
Kiểm tra Apache 2
Kiểm tra Apache 2

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ước 6: Cài đặt và cấu hình Nginx

Ở bước này, bạn sẽ cài đặt Nginx và cấu hình các tên miền nginx1.your_domain và nginx2.your_domain như các server ảo của Nginx.

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

Sau đó, xóa liên kết tượng trưng của server ảo mặc định vì bạn sẽ không sử dụng nó nữa:

Sau đó, bạn hãy tạo một trang web mặc định riêng của bạn (nginx1.your_domain).

Bây giờ bạn sẽ tạo các server ảo cho Nginx sử dụng chung phương thức mà bạn đã dùng cho Apache. Đầu tiên tạo thư mục root cho cả hai trang web:

Bạn sẽ lưu trữ các trang web Nginx trong thư mục /usr/share/nginx, đây là thư mục mặc định mà Nginx thường muốn được lưu trữ. Bạn có thể lưu trữ chúng dưới thư mục /var/www/html cùng với các trang web Apache, nhưng việc phân tách này có thể khiến bạn liên kết các trang web với Nginx.

Tương tự với cách bạn đã làm với các server ảo của Apache, hãy tạo các tệp index và phpinfo() để kiểm tra sau khi hoàn thành cài đặt:

Bây giờ bạn tạo một virtual server cho cho miền nginx1.your_domain:

Nginx xem server {. . .} như là các khu vực của tệp cấu hình các khối server. Tạo một server block cho virtual server chính là nginx1.your_domain. Chỉ thị cấu hình default_server làm cho đây là virtual host mặc định xử lý các yêu cầu HTTP không phù hợp với bất kỳ virtual host nào khác. Cấu hình chỉ thị default_server khiến cho đây trở thành virtual server mặc định xử lí các yêu cầu HTTP mà không phù hợp với bất kì với virtual server nào khác.

Lưu và đóng file. Tạo file virtual server cho miền thứ hai của Nginx, nginx2.your_domain :

Thêm những câu lệnh dưới đây vào file:

Sau đó lưu và đóng file. Kích hoạt cả hai trang thông qua các liên kết tượng trưng đến thư mục sites-enabled:

Chạy thử cấu hình Nginx:

Reload lại nếu không có lỗi:

Truy cập file phpinfo() cho cả 2 virtual servers trên trình duyệt web bằng cách truy cập vào trang web http://nginx1.your_domain/info.php và http://nginx2.your_domain/info.php, nhìn vào các phần biến số PHP một lần nữa.

Mục [“SERVER_SOFTWARE”] sẽ hiển thị là Nginx, biểu thị rằng các file được phục vụ trực tiếp bởi Nginx.

Mục [“DOCUMENT_ROOT”] sẽ chỉ bạn đến thẳng thư mục bạn đã tạo trước đó cho từng trang web Nginx. Hoàn thành bước này, bạn đã hoàn tất cài đặt Nginx và tạo 2 virtual server.

Bước 7: Cấu hình Nginx cho các virtual server của Apache

Tạo thêm một tệp virtual server Nginx với nhiều tên miền trong các chỉ thị server_name. Các yêu cầu cho các tên miền này sẽ được chuyển tiếp đến Apache. Tạo một tệp virtual server Nginx mới để chuyển tiếp các yêu cầu đến Apache:

Thêm đoạn code sau đây vào cấu hình, đoạn code này chỉ định tên miền của các virtual server trong Apache và chuyển tiếp yêu cầu của chúng đến Apache. Hãy nhớ sử dụng địa chỉ IP công khai trong proxy_pass:

Lưu file và kích hoạt virtual server mới này bằng cách tạo một liên kết tượng trưng:

Kiểm tra lại cấu hình:

Reload lại nếu không có lỗi:

Mở trình duyệt và truy cập URL http://apache1.your_domain/info.php thông qua trình duyệt của bạn. Kéo xuống phần biến số PHP và kiểm tra các giá trị được hiển thị. Các biến số SERVER_SOFTWAREDOCUMENT_ROOT xác nhận rằng yêu cầu này đã được xử lý bởi Apache. Các biến số HTTP_X_REAL_IPHTTP_X_FORWARDED_FOR đã được thêm bởi Nginx và sẽ hiển thị công khai địa chỉ IP của máy tính bạn đang sử dụng để truy cập URL (nếu bạn truy cập Apache trực tiếp trên cổng 8080 thì bạn sẽ không thấy các biến số trên).

Như vậy, bạn đã thành công trong việc thiết lập Nginx để chuyển tiếp các yêu cầu cho các tên miền cụ thể đến Apache. Ở bước tiếp theo, bạn sẽ cấu hình Apache để đặt biến REMOTE_ADDR như thể biến này đang xử lý các yêu cầu 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, bạn cài đặt một module của Apache được gọi là 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 một 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ã để có thể hoạt động ngầm mượt mà phía sau proxy.

Module này có sẵn trong kho lưu trữ của Ubuntu với tên là libapache2-mod-rpaf, tuy nhiên phiên bản hiện tại đã lỗi thời và không hỗ trợ một số chỉ thị cấu hình. Thay vào đó, bạn sẽ cài đặt nó từ mã nguồn.

Chuyển đến thư mục home và cài đặt các gói cần thiết để xây dựng module:

Giải nén file đã tải:

Chuyển vào thư mục mới chứa các file:

Biên dịch và cài đặt module:

Tạo một tệp trong thư mục mods-available để tải module rpaf:

Thêm đoạn code sau vào file để tải module:

Lưu và thoát khỏi trình soạn thảo.

Tạo một file khác trong thư mục này có tên rpaf.conf chứa các chỉ thị cấu hình cho mod_rpaf:

Thêm đoạn code sau để cấu hình mod_rpaf, đảm bảo ghi rõ địa chỉ IP server của bạn:

Dưới đây là mô tả ngắn gọn của mỗi chỉ thị. Xem tệp README của mod_rpaf để biết thêm thông tin.

  • RPAF_Header: Tiêu đề sử dụng cho địa chỉ IP thực của máy client.
  • RPAF_ProxyIPs: Địa chỉ IP của proxy để điều chỉnh yêu cầu HTTP.
  • RPAF_SetHostName: Cập nhật tên của virtual server để ServerName và ServerAlias hoạt động.
  • RPAF_SetHTTPS: Đặt biến môi trường HTTPS dựa trên giá trị chứa trong X-Forwarded-Proto.
  • RPAF_SetPort: Đặt biến môi trường SERVER_PORT. Điều này hữu ích khi Apache đứng sau một proxy SSL.

Lưu file rpaf.conf và kích hoạt module:

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

Reload lại Apache nếu không phát hiện lỗi nào:

Truy cập vào trang phpinfo() http://apache1.your_domain/info.php và http://apache2.your_domain/info.php trong trình duyệt của bạn và kiểm tra phần PHP Variables. Biến REMOTE_ADDR sẽ là địa chỉ IP công khai của máy tính của bạn.

Bây giờ bạn sẽ thiết lập mã hóa TLS/SSL cho mỗi trang web.

Bước 9: Thiết lập website HTTPS với Let’s Encrypt (Tùy chọn)

Trong bước này, bạn sẽ cấu hình chứng chỉ TLS/SSL cho cả hai tên miền được lưu trữ trên Apache. Bạn có thể lấy chứng chỉ miễn phí của Let’s Encrypt (https://letsencrypt.org) hoặc sử dụng dịch vụ SSL trả phí của Vietnix. Vietnix cung cấp các gói SSL với mức giá chỉ từ 160.000 VND/Năm cho cả người dùng cá nhân lẫn các tổ chức, doanh nghiệp. Liên hệ với Vietnix để được tư vấn chi tiết hơn.

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

Nginx hỗ trợ việc hủy bỏ SSL, vì vậy bạn có thể thiết lập SSL mà không cần sửa đổi các tệp cấu hình của Apache. Module mod_rpaf đảm bảo rằng các biến môi trường cần thiết đều được thiết lập trên Apache để các ứng dụng hoạt động ngầm một cách mượt mà trong một server proxy SSL.

Đầu tiên, bạn sẽ tách các khối server {…} của cả hai tên miền để mỗi tên miền có thể có chứng chỉ SSL riêng của mình. Mở file /etc/nginx/sites-available/apache trong trình soạn thảo của bạn:

Chỉnh sửa lại file như bên dưới với mỗi tệp apache1.your_domain và apache2.your_domain trong các khối server của riêng chúng:

Sử dụng Certbot để tạo chứng chỉ TLS/SSL của riêng mình. Plugin Nginx sẽ đảm nhận trách nhiệm cấu hình lại Nginx và tải lại cấu hình bất cứ khi nào cần thiết.

Cài đặt Certbot bằng snapd.

Sau khi cài đặt xong Certbot, hãy sử dụng câu lệnh certbot để tạo các chứng chỉ SSL cho apache1.your_domain và www.apache1.your_domain

Lệnh này yêu cầu Certbot sử dụng plugin nginx, sử dụng -d để chỉ định các tên mà bạn muốn chứng chỉ có hiệu lực.

Sử dụng lệnh tương tự cho tên miền thứ hai:

Truy cập vào một trong các tên miền của Apache trên trình duyệt của bạn bằng cách sử dụng tiền tố https://; truy cập https://apache1.your_domain/info.php hoặc https://apache2.your_domain/info.php.

Hãy xem trong phần PHP Variables. Biến SERVER_PORT đã được chuyển thành 443 và biến HTTPS được đổi sang trạng thái on, dường như Apache đã được truy cập trực tiếp qua HTTPS. Với sự thay đổi của các biến trên, các ứng dụng PHP không cần phải được cấu hình đặc biệt để hoạt động ngầm phía trong một reverse proxy.

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

Apache lắng nghe trên cổng 8080 thông qua địa chỉ IP công khai, vì vậy Apache có thể truy cập được bởi nhiều người. Apache có thể bị chặn bằng cách thiết lập lệnh IPtables sau vào rule firewall.

Sử dụng địa chỉ IP server của bạn ở vị trí được đánh dấu. Sau khi cổng 8080 bị chặn bởi firewall, hãy thử kiểm tra xem Apache có không thể truy cập được nó hay không. 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://apache1.your_domain:8080

Trình duyệt của bạn sẽ hiển thị một thông báo lỗi “Unable to connect” hoặc “Webpage is not available”. Với tùy chọn tcp-reset của IPtables được áp dụng, người khác sẽ không thấy bất kì sự khác biệt giữa cổng 8080 và một cổng không hoạt động.

Bước 11: Thiết lập Nginx để phục vụ các static files (Tùy chọn)

Khi Nginx chuyển tiếp các yêu cầu cho các tên miền của Apache, Apache sẽ gửi mọi yêu cầu file cho tên miền đó đến Apache. Nginx hoạt động nhanh hơn Apache trong việc phục vụ các static files như hình ảnh, JavaScript và Stylesheets. Vì vậy, bạn hãy cấu hình file virtual server apache của Nginx để phục vụ các static files một cách trực tiếp, nhưng gửi các yêu cầu PHP cho Apache xử lý.

Mở file /etc/nginx/sites-available/apache trong trình soạn thảo của bạ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 static files cho mỗi trang web.

Nếu không sử dụng chứng chỉ SSL và TLS, hãy sửa file như sau:

Nếu bạn muốn tiền tố HTTPS khả dụng, hãy thiết lập cấu hình như sau thay cho cấu hình phía trên:

Chỉ thị try_files khiến Nginx tìm kiếm các tệp trong thư mục gốc và phục vụ chúng trực tiếp. Nếu file có phần mở rộng là .php, yêu cầu sẽ được chuyển tiếp đến Apache. Ngay cả khi tệp không được tìm thấy trong thư mục root, yêu cầu cũng được chuyển tiếp đến Apache để các tính năng của ứng dụng như liên kết tĩnh (permalinks) có thể hoạt động trơn tru mà không gặp vấn đề.

Cảnh báo: Chỉ thị location ~ /.ht rất quan trọng; điều này ngăn Nginx phục vụ 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à kiểm tra cấu hình:

Nếu quá trình kiểm tra không có lỗi hãy reload lại Nginx:

Để xác minh rằng mọi thứ đang hoạt động, bạn có thể xem các 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 apache2.your_domain và apache1.your_domain. Sử dụng lệnh tail để xem vài dòng cuối cùng của file và sử dụng công tắc -f để theo dõi file cho các thay đổi.

Truy cập apache1.your_domain/info.php hoặc apache2.your_domain/info.php trên trình duyệt và xem output từ nhật ký. Bạn sẽ thấy rằng Apache đang trả lời (cổng của bạn sẽ là 80 hoặc 443 tùy thuộc vào việc bạn đã bảo mật phiên bản đó hay không):

Sau đó, truy cập trang index.html cho mỗi trang webs, bạn sẽ không thấy bất kỳ mục nhật ký nào từ Apache. Vì Nginx đang phục vụ chúng.

Khi bạn hoàn tất quan sát file nhật ký, nhấn CTRL + C để ngừng theo dõi.

Với cài đặt này, Apache sẽ không thể hạn chế truy cập vào các static files. Kiểm soát truy cập cho các static files sẽ cần được cấu hình trong virtual host file của apache trong Nginx, nhưng điều đó nằm ngoài phạm vi của bài viết này.

Vietnix là nhà cung cấp hàng đầu tại Việt Nam chuyên cung cấp dịch vụ hosting và VPS tốc độ cao. Vietnix luôn chú trọng đến việc cải thiện và phát triển hạ tầng máy chủ của mình để đảm bảo tính ổn định và tốc độ cao nhất cho khách hàng. Đồng thời, Vietnix cũng tập trung vào việc cung cấp dịch vụ hỗ trợ tuyệt vời với đội ngũ kỹ thuật túc trực 24/7 để đảm bảo mọi vấn đề của khách hàng được giải quyết nhanh chóng nhất. Chính bởi vậy, Vietnix đã nhận được nhiều sự tin tưởng và lựa chọn sử dụng của đông đảo khách hàng trong suốt thời gian hoạt động:

  • 11 năm kinh nghiệm hoạt động trong lĩnh vực giải pháp lưu trữ số.
  • 50.000 khách hàng cá nhân, doanh nghiệp.
  • 100.000 dịch vụ được kích hoạt.
  • 97% khách hàng giới thiệu dịch vụ sau khi sử dụng.
  • Thương hiệu Việt Nam xuất sắc 2022.
cd branding 2
Cách cấu hình Nginx như một Web Server và Reverse Proxy cho Apache trên máy chủ Ubuntu 20.04 16

Với cam kết “lấy thành công của khách hàng làm mục tiêu phục vụ”, Vietnix luôn nỗ lực hết sức mình để đáp ứng nhu cầu của khách hàng và đem đến những giá trị tốt nhất cho họ. Hãy để Vietnix đồng hành cùng bạn trong quá trình kinh doanh trên internet. Mọi vấn đề thắc mắc cần tư vấn, quý khách vui lòng liên hệ:

  • Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, Thành Phố Hồ Chí Minh.
  • Hotline: 1800 1093.
  • Email: sales@vietnix.com.vn.

Lời kết

Trên đây là các bước hướng dẫn chi tiết cách cấu hình Nginx làm Web Server và Reverse Proxy cho Apache trên Ubuntu 20.04. Hy vọng những thông tin này sẽ hữu ích với bạn. Nếu còn vấn đề nào chưa rõ, bạn hãy để lại bình luận bên dưới nhé.