Nginx được cấu hình làm Reverse Proxy cho Apache là một cách thông thường nhất để sử dụng Nginx, mặc dù bây giờ có thể thay thế hoàn toàn 100% Apache bằng Nginx, song một số người vẫn cần phải thiết lập Nginx làm Reverse Proxy cho Apache. Coi Apache là backend Webserver, nhiều hơn nữa có thể cấu hình Nginx làm Reverse Proxy cho Node.js

Cài đặt Nginx làm Reverse Proxy cho Apache

Trong bài này, tôi sẽ hướng dẫn bạn cấu hình để đạt được hiệu suất cao cho máy chủ bằng việc để các file, tài nguyên tĩnh được quản lý và cache bởi Nginx, và các file, request, hoặc tài nguyên động sẽ để Apache xử lý.

Cài đặt Apache

yum install httpd httpd-devel -y

Thiết lập cấu hình Reverse Proxy trên Apache

Thay đổi cổng nghe mặc định 80 của Apache sang cổng 8080, bằng các bước sau:

nano -w /etc/httpd/conf/httpd.conf

Tìm đến dòng sau (bằng phím Ctrl+W):

Listen 80

Và thay đổi nó thành:

Listen 8080

Sau đó, di chuyển xuống cuối file và thêm đoạn mã sau đây để tạo 1 Virtual Host. (Chú ý là bạn có thể tạo Apache Virtual Hosts trên CentOS bằng cách tạo trong thư mục: ../sites-enables và ../sites-availabes)

NameVirtualHost 127.0.0.1:8080
 
# Define Server document root
   DocumentRoot /var/www/html/
 
# Define the virtual host
<VirtualHost 127.0.0.1:8080>
   ServerName www.yourwebsite.com
   ServerAlias yourwebsite.com
   DocumentRoot /var/www/yourwebsite.com
       <Directory "/var/www/yourwebsite.com">
               Options FollowSymLinks -Includes
               AllowOverride All
               Order allow,deny
               Allow from all
       </Directory>
       RewriteEngine on
</VirtualHost>

Thay thế  yourwebsite.com  bằng tên domain thật của bạn, và được dẫn tới thư mục website  /var/www/yourwebsite.com 

Khởi động lại Apache(httpd) để áp đặt những thay đổi:

service httpd restart

Cài đặt Nginx

Ok, đến bước này ta cài đặt và cấu hình cho Nginx, trước hết chúng ta cần Add vào repos local bằng lệnh sau:

mkdir /tmp/nginx; cd /tmp/nginx
wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
rpm -i nginx-release-centos-6-0.el6.ngx.noarch.rpm
yum install nginx -y

Thiết lập cấu hình cho Nginx

nano -w /etc/nginx/nginx.conf

Thay toàn bộ bằng cấu hình sau đây:

user  nobody;
worker_processes  4;
error_log  logs/error.log crit;

worker_rlimit_nofile  8192;

events {
worker_connections  1024; # you might need to increase this setting for busy servers
use epoll; #  Linux kernels 2.6.x change to epoll
}

http {
server_names_hash_max_size 2048;
server_names_hash_bucket_size 512;

server_tokens off;

include    mime.types;
default_type  application/octet-stream;

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout  10;

# Gzip on
gzip on;
gzip_min_length  1100;
gzip_buffers  4 32k;
gzip_types    text/plain application/x-javascript text/xml text/css;

# Other configurations
ignore_invalid_headers on;
client_max_body_size    8m;
client_header_timeout  3m;
client_body_timeout 3m;
send_timeout     3m;
connection_pool_size  256;
client_header_buffer_size 4k;
large_client_header_buffers 4 32k;
request_pool_size  4k;
output_buffers   4 32k;
postpone_output  1460;

# Cache most accessed static files
open_file_cache          max=10000 inactive=10m;
open_file_cache_valid    2m;
open_file_cache_min_uses 1;
open_file_cache_errors   on;

# virtual hosts includes
include "/etc/nginx/conf.d/*.conf";

}

Bước trên ta đã thiết lập 1 vài cấu hình mặc định và load toàn bộ Virtual hosts của Nginx định nghĩa trong thư mục: /etc/nginx/conf.d

Thiết lập cấu hình Nginx Reverse Proxy

Giờ hãy tạo 1 file sau:

nano -w /etc/nginx/conf.d/yourwebsite.com.conf

Thêm mới toàn bộ bằng nội dung sau, hoặc điều chỉnh cho phù hợp với webapps của bạn.

server {
	listen    80;
	server_name  yourwebsite.com yourwebsite.com;
	access_log off;
	error_log  logs/yourwebsite.com-error_log crit;	

location ~* .(gif|jpg|jpeg|png|ico|wmv|3gp|avi|mpg|mpeg|mp4|flv|mp3|mid|js|css|html|htm|wml)$ {
	root /var/www/yourwebsite.com;
	expires 365d;
	}

location / {
	client_max_body_size    10m;
	client_body_buffer_size 128k;

	proxy_send_timeout   90;
	proxy_read_timeout   90;
	proxy_buffer_size    128k;
	proxy_buffers     4 256k;
	proxy_busy_buffers_size 256k;
	proxy_temp_file_write_size 256k;
	proxy_connect_timeout 30s;

	proxy_redirect  http://www.yourwebsite.com:8080   http://www.yourwebsite.com;
	proxy_redirect  http://yourwebsite.com:8080   http://yourwebsite.com;

	proxy_pass   http://127.0.0.1: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;
	}
}

Chú ý thay thể yourwebsite.com bằng tên thật website của bạn, và đường dẫn /var/www/yourwebsite.com

Kiểm tra và khởi động nginx

nginx -t
service nginx start

Ok, những gì chúng ta đã làm ở trên là:

1. Định nghĩa location chứa file resource tĩnh là các file ảnh, css, html, js, … và
cho phép Nginx cache những file này trong 1 năm.
2. Thêm cấu hình Reverse Proxy mà Nginx có được thông tin từ server web mà Apache đang nghe 127.0.0.1:8080

Cài đặt mod_rpaf

mod_rpafKiểm tra Nginx Reverse Proxy

curl -I http://www.yoursite.com

Và bạn sẽ thấy thông tin giống nhưa thế này:

HTTP/1.1 200 OK
Server: nginx

Nếu bạn thấy thông tin Nginx ở kết quả trả về nghĩa là website của bạn đã được Nginx phục vụ, và những file động (php) sẽ được forward và phục vụ bởi Apache.

Hãy thử tắt Apache đi bằng lệnh:

service httpd stop

Xong bây giờ thử load website sử dụng curl, bạn có thể thấy 1 lỗi 502 bad gateway error, và điều này có nghĩa nginx proxy đã thực sự hoạt động. Ok, hãy đưa httpd hoạt động trở lại bằng lệnh sau:

service httpd start

Một các test kiểm tra khác là tạo 1 file phpinfo:

nano -w /var/www/yourwebsite.com/info.php

File info.php có nội dung là ghi thông tin của server như sau:

<? phpinfo(); ?>

Lưu lại và thoát ra.

Tất cả dường như hoàn tất, hãy thử gõ địa chỉ www.yourwebsite.com/info.php vào trình duyệt và chúng ta sẽ thấy được thông tin máy chủ php trên giao diện. Nếu chúng ta thấy thông tin Apache thì cấu hình Proxy đã hoạt động tốt.

Chúc ae thành công !

About The Author

  • Thanh Nguyen Duc

    Cảm ơn bạn đã đăng một bài hữu ích và dễ đọc.

    • Kudy Itc

      hiện mình đang làm đề tài này, nhưng mà mình còn khù khờ quá, bạn có thể hướng dẫn mình không

      • Bạn còn mắc gì ? Cứ trao đổi, ae biết thì sẽ support 😀

        • Kudy Itc

          mình đang làm đề tài cấu hình nginx làm reverse proxy trên centos, mà không biết cài bao nhiêu máy, cài nginx thì lại không được.
          Hiện đang bối rối, mong ace giúp đỡ.
          Mình cảm ơn nhiều nhé

          • Nếu là chưa cài đặt được nginx trên CentOS. thì bạn thử làm theo hướng dẫn này xem có ok không nhé.

            http://how.vndemy.com/software/662-cai-dat-nginx-tu-ma-nguon-tren-centos-6-4-x64-vps/

          • Kudy Itc

            mình cũng đã từng đọc qua, nhưng thật sự là không thể hiểu được, lần đầu làm quen với linux mà cảm giác khó thật. Vũ có số điện thoại không, hoặc mail, cho mình trao đổi với

          • bạn trao đổi luôn tại đây cũng được. nếu ko thì gửi vào hòm mail cá nhân của mình nhubaovu@gmail.com

          • Kudy Itc

            mình gõ địa chỉ http://www.t36.com/info.php vào trình duyệt, và kết quả là như vậy thì có đúng chưa vậy ạ

          • bạn cài đặt domain t36.com trỏ về máy chủ cài nginx trước đã (hoặc thiết lập trong file hosts)

          • Kudy Itc

            Cái đó thật sự không biết làm bạn ạ, tuần sau nộp mất rồi….
            Help me, please!!!! T”T

  • hai991dk

    Cảm ơn a vì bài viết rất chi tiết, nhân tiện cho e hỏi,
    E đang setup hệ thống như TUT trên của a (nginx làm reverse proxy cho apache).
    Nhưng khi e chạy một số module trên web của e tương ứng với mỗi url riêng thì ko thể load đc, nhưng trên cổng apache lại chạy đc bình thường.
    Ví dụ http://domain.com/admin/update-product.php KO load đc,
    nhưng http://domain.com:8080/admin/update-product.php thì lại load đc.
    Có cách nào cho bỏ qua nginx (xử lý trực tiếp = apache đối với riêng url đó) mà ko cần phải thêm port 8080 vào phía sau domain ko a?
    Hoặc a có thể cho e 1 giải pháp ko? Cảm ơn a nhiều!

    • Mục đích khi cài đặt Nginx làm Proxy là để đứng chặn cho các dịch vụ phía sau không chỉ là Apache mà có thể là Node.js hay Servlet …

      Nếu e muốn truy cập web không qua Nginx nữa thì off nó đi bằng 4 bước sau:

      1. Stop nginx: service nginx stop
      2. Tìm và sửa dòng: Listen 8080 thành Listen 80 trong file /etc/httpd/conf/httpd.conf
      3. Kiểm tra cấu hình apache đã đúng: apachectl -t
      4. Restart lại apache: service httpd restart

      E thử xem

      • hai991dk

        ok, cảm ơn a nhiều, chúc a năm mới dồi dào sức khỏe 🙂

  • Hau Huynh

    Nếu em cấu con apache và con reverse proxy ở 2 máy khác nhau thì em cần làm sao ạ?
    Thanks anh.