Cách cài đặt nginx làm Proxy ngược cho Apache trên Ubuntu 16.04

theanh

Administrator
Nhân viên
Hướng dẫn này chỉ cho bạn cách thiết lập nginx làm proxy ngược trước máy chủ web Apache2 trên Ubuntu 16.04.nginx (phát âm là "engine x") là máy chủ HTTP miễn phí, mã nguồn mở, hiệu suất cao. nginx được biết đến với tính ổn định, bộ tính năng phong phú, cấu hình đơn giản và mức tiêu thụ tài nguyên thấp.


1 Lưu ý sơ bộ​

Trong hướng dẫn này, tôi sử dụng tên máy chủ server1.example.com với địa chỉ IP 192.168.1.100. Các thiết lập này có thể khác nhau đối với bạn, vì vậy bạn phải thay thế chúng khi cần thiết.

Tôi cho rằng bạn có một vhost Apache hiện có (tôi sẽ sử dụng vhost mặc định của Apache trong hướng dẫn này) đang lắng nghe trên cổng 80 trên địa chỉ IP 192.168.1.100 mà bạn muốn proxy qua nginx. Tôi sẽ sử dụng hướng dẫn Ubuntu LAMP làm cơ sở. Xin lưu ý rằng hướng dẫn này chỉ đề cập đến http, không phải https (SSL).


2 Cấu hình Apache​

Điều đầu tiên chúng ta phải làm là cấu hình vhost Apache của mình để lắng nghe trên localhost (127.0.0.1) trên một cổng không sử dụng khác với 80 (ví dụ: 8000). Mở /etc/apache2/ports.conf...
Mã:
nano /etc/apache2/ports.conf
... và sửa đổi các dòng NameVirtualHost và Listen cho cổng 80 để sử dụng cổng 8000:
Mã:
# Nếu bạn chỉ thay đổi cổng hoặc thêm nhiều cổng hơn ở đây, bạn cũng có thể
# phải thay đổi câu lệnh VirtualHost trong
# /etc/apache2/sites-enabled/000-default.conf

Listen 8000


 Listen 443



 Nghe 443
Tiếp theo, hãy mở tệp cấu hình vhost (ví dụ: /etc/apache2/sites-available/000-default.conf)...
Mã:
nano /etc/apache2/sites-available/000-default.conf
... và thay đổi dòng <VirtualHost> để sử dụng địa chỉ IP 127.0.0.1 và cổng 8000:
Mã:
[...]
Chúng ta sẽ cấu hình nginx như một proxy trong suốt, tức là nó sẽ truyền địa chỉ IP của người dùng gốc trong một trường có tên là X-Forwarded-For đến Apache phụ trợ. Tất nhiên, Apache phụ trợ sẽ ghi lại địa chỉ IP của người dùng gốc trong nhật ký truy cập của họ thay vì địa chỉ IP của nginx (127.0.0.1). Có hai cách để thực hiện điều này:

1) Chúng ta có thể sửa đổi dòng LogFormat trong /etc/apache2/apache2.conf và thay thế %h bằng %{X-Forwarded-For}i:
Mã:
nano /etc/apache2/apache2.conf
Mã:
[...]#LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" kết hợpLogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" kết hợp[...]
2) Trên Debian/Ubuntu, chúng ta có thể cài đặt mô-đun Apache libapache2-mod-rpaf để ghi nhật ký địa chỉ IP chính xác:
Mã:
apt-get -y install libapache2-mod-rpaf
Sau tất cả những thay đổi này, hãy khởi động lại Apache:
Mã:
service apache2 restart

3 Cấu hình nginx​

Nếu nginx chưa được cài đặt, hãy cài đặt như sau:
Mã:
apt-get -y install nginx
Tạo liên kết khởi động hệ thống và đảm bảo rằng nó đã được khởi động:
Mã:
systemctl enable nginx.service
service nginx restart
Bây giờ nó sẽ lắng nghe trên cổng 80.

Một số tham số proxy chuẩn nằm trong tệp /etc/nginx/proxy_params:
Mã:
nano /etc/nginx/proxy_params
Mã:
proxy_set_header Host $http_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;
Vì chúng tôi sẽ đưa tệp đó vào sau trong phần proxy của vhost nginx cho example.com, bạn có thể muốn thêm các chỉ thị proxy khác vào tệp đó nếu muốn, ví dụ như sau:
Mã:
proxy_set_header Máy chủ $http_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;client_max_body_size 100M;client_body_buffer_size 1m;proxy_intercept_errors bật;proxy_buffering bật;proxy_buffer_size 128k;proxy_buffers 256 16k;proxy_busy_buffers_size 256k;proxy_temp_file_write_size 256k;proxy_max_temp_file_size 0;proxy_read_timeout 300;
Bây giờ hãy sửa đổi defaultvhost cho nginx - đảm bảo rằng nó sử dụng cùng một gốc tài liệu như vhost Apache cho example.com (ví dụ: /var/www/html) để nginx có thể phân phối các tệp tĩnh trực tiếp mà không cần chuyển yêu cầu đến Apache:
Mã:
nano /etc/nginx/sites-available/default
Mã:
server {
 listen 80 default_server;
 listen [::]:80 default_server;

 root /var/www/html;

 # Thêm index.php vào danh sách nếu bạn đang sử dụng PHP
 index index.html index.htm index.nginx-debian.html;

 server_name _;

 location / {
 proxy_pass http://localhost:8000;
 include /etc/nginx/proxy_params;
 }
}
Đây là cấu hình rất đơn giản sẽ proxy tất cả các yêu cầu đến Apache.

Tải lại nginx để các thay đổi có hiệu lực:
Mã:
service nginx reload
Bây giờ bạn có thể nhập tên máy chủ hoặc IP192.168.1.100vào trình duyệt của mình và bạn sẽ thấy trang web mặc định của Apache, nhưng lần này được phân phối thông qua nginx.



Như tôi đã nói trước đây, đây là cấu hình rất đơn giản sẽ proxy tất cả các yêu cầu đến Apache. Nhưng vì nginx phân phối các tệp tĩnh (như JavaScript, CSS, hình ảnh, tệp PDF, tệp HTML tĩnh, v.v.) nhanh hơn nhiều so với Apache, nên tốt nhất là để nginx phục vụ trực tiếp các tệp này. Bạn có thể thực hiện việc này bằng cách thêm một vị trí mới cho các tệp này, ví dụ: như sau:
Mã:
server { listen 80 default_server;
 listen [::]:80 default_server;

 root /var/www/html;

 # Thêm index.php vào danh sách nếu bạn đang sử dụng PHP
 index index.html index.htm index.nginx-debian.html;

 server_name _;

 location / {
 proxy_pass http://localhost:8000;
 include /etc/nginx/proxy_params;
 } location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ { }}
Tải lại nginx:
Mã:
service nginx reload
Bạn thậm chí có thể đặt tiêu đề HTTP Expires cho các tệp này để trình duyệt sẽ lưu vào bộ nhớ đệm các tệp này (xem mục Đặt trình duyệt lưu trữ đệm các tệp tĩnh trên nginx để biết thêm chi tiết):
Mã:
server { listen 80 default_server;
 listen [::]:80 default_server;

 root /var/www/html;

 # Thêm index.php vào danh sách nếu bạn đang sử dụng PHP
 index index.html index.htm index.nginx-debian.html;

 server_name _;

 location / {
 proxy_pass http://localhost:8000;
 include /etc/nginx/proxy_params;
 } location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ { expires 30d; }}
Bây giờ chúng ta có thể đưa thiết lập này tiến thêm một bước nữa bằng cách để nginx phục vụ nhiều yêu cầu nhất có thể và chỉ chuyển các yêu cầu còn lại cùng với các tệp PHP tới Apache:
Mã:
server { listen 80 default_server;
 listen [::]:80 default_server;

 root /var/www/html;

 # Thêm index.php vào danh sách nếu bạn đang sử dụng PHP
 index index.html index.htm index.nginx-debian.html;

 server_name _;

 location / {
 proxy_pass http://localhost:8000;
 include /etc/nginx/proxy_params;
 } location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ { expires 30d; } vị trí @proxy { proxy_pass http://127.0.0.1:8000; bao gồm /etc/nginx/proxy_params; } vị trí ~* \.php$ { proxy_pass http://127.0.0.1:8000; bao gồm /etc/nginx/proxy_params; }}
Tải lại nginx:
Mã:
service nginx reload
Tất nhiên, bạn có thể tinh chỉnh thiết lập này hơn nữa, ví dụ bằng cách sử dụng nginx proxy_cache (nếu ứng dụng của bạn cho phép - ví dụ, bạn phải đảm bảo rằng captcha hoặc giỏ hàng không được lưu vào bộ nhớ đệm và người dùng đã đăng nhập luôn nhận được bản sao mới của trang) hoặc nếu ứng dụng của bạn có bộ nhớ đệm toàn trang - nginx có thể truy cập trực tiếp vào bộ nhớ đệm toàn trang trong trường hợp như vậy (bạn có thể tìm thấy ví dụ trong hướng dẫn này: Cách tăng tốc Drupal 7.7 bằng Boost và nginx (Debian Squeeze)).


4 liên kết​

 
Back
Bên trên