Reserse proxy là gì?

Apache và Nginx là 2 hệ thống Web server phổ biến và được sử dụng rộng dãi trong nhiều hệ thống lớn với ưu điểm chung đều là các phần mềm OpenSource.

  • Apache nổi tiếng làm việc hiệu quả với những xử lý động như PHP,…
  • Nginx có điểm mạnh là xử lý rất nhanh các web tĩnh.

Với những ưu điểm đó, người ta đã kết hợp Nginx và Apache lại với nhau để bổ trợ cho nhau giúp hệ thống Webserver thêm phần hoàn thiện và đạt hiệu quả cao.

  • Apache:
    • Vai trò chung là web server
    • Xử lý các file kịch bản động PHP…
  • Nginx:
    • Đóng vai trò là 1 Reverse Proxy
    • Nginx đứng trước để tiếp nhận các kết nối và che chắn cho Webserver Apache.

Reverse proxy có vai trò là cầu nối của client và server. Nó sẽ thực hiện nhận yêu cầu từ client và chuyển lên server và nhận trả lời từ server chuyển ngược lại client.

Tại sao cần triển khai Nginx Reverse Proxy?

Dưới dây là một số lý do chúng ta cần triển khai Nginx Reverse Proxy cho hệ thống Web Server của mình:

    • Tăng tính bảo mật giúp ngăn chặn tấn công web server như DDoS và DoS.
    • Giúp cân bằng tải giữa nhiều server.
    • Nginx có thể làm Reverse proxy cho các giao thức đa dạng: HTTP, HTTPS, TCP, UDP, SMTP, IMAP, và POP3.
    • Giúp tối ưu nội dung và nén chúng để giảm thời gian tải trang web.
    • Caching toàn bộ file tĩnh để giảm tải cho Web Server.
    • Hạn chế quyền truy cập từ các vị trí có thể là mục tiêu của các cuộc tấn công web server.
    • Làm giảm hiệu quả của các cuộc tấn công DDOS bằng cách giới hạn số lượng kết nối và tốc độ tải xuống trên mỗi địa chỉ IP.

Các bước cấu hình Nginx làm Reverse proxy cho Apache Web Server

Mô hình Lab

Trong bài viết này, Zhost sẽ cài đặt Nginx Reverse proxy và Apache Web Server trên cùng một server CentOS 7 có IP: 10.10.10.11.

Lưu ý: Trong thực tế, ta hoàn toàn có thể cấu hình Nginx Reverse proxy và Apache trên 2 server hoàn toàn tách biệt.

Vô hiệu hoá SELinux theo bài viết: Cách vô hiệu hóa SELinux trên CentOS

Cài đặt Apache Web Server

Cài đặt Apache:

yum -y update && yum -y install httpd

Sau khi cài đặt xong các bạn chạy lệnh sau để khởi động Apache Service:

systemctl start httpd.service && systemctl enable httpd.service

Tiếp theo cấu hình firewall mở port http/https, mặc định trong centos 7 sử dụng FirewallD.

firewall-cmd --permanent --zone=public --add-service=http 
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

Như vậy, ta đã cài đặt Apache web server xong, để kiểm tra Apache hoạt động chưa các bạn mở trình duyệt web truy cập địa chỉ ip của server (http://your-ip-address ) sẽ ra default page của Apache.

Cấu hình Apache listen ở port 8080 thay vì 80 như mặc định:

sed -i '/Listen 80/c\Listen 8080' /etc/httpd/conf/httpd.conf

Thay đổi LogFormat, để Apache ghi nhận địa chỉ IP thực của Client từ Nginx Proxy, thay vì địa chỉ IP của nginx. Sửa nội dung directive LogFormat trong tệp tin cấu hình /etc/httpd/conf/httpd.conf với nội dung sau:

Đổi dòng:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

Thành:

LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

Khởi động lại apache:

systemctl restart httpd.service

 

Cài đặt Nginx Reverse proxy

Cài đặt các Repo cần thiết:

yum install epel-release -y 
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm 
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

Chạy lệnh sau để cài đặt Nginx:

yum install -y nginx

Chạy khối lệnh sau để tạo và dán nội dụng cho file proxy_params:

cat >/etc/nginx/proxy_config <<EOF
proxy_redirect      off;
proxy_set_header X-Forwarded-Proto \$scheme;
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_pass_header   Set-Cookie;
proxy_connect_timeout   90;
proxy_send_timeout  90;
proxy_read_timeout  90;
proxy_buffers       32 4k;
client_max_body_size 1024m;
client_body_buffer_size 128k;
EOF

Trong tệp tin /etc/nginx/proxy_params, chúng ta làm rõ một số tham số:

    • proxy_set_header Host $host: Dùng để định nghĩa lại trường Host request header mà truyền đến backend khi mà cached được enable trên nginx . $host bằng giá trị server_name trong trường Host request header.
    • proxy_set_header X-Real-IP: Truyền Real IP của client vào header khi gửi request đến Backend Apache.
    • proxy_set_header X-Forwarded-For: Mặc định client request thì thông tin sẽ chỉ giao tiếp với reverse proxy, vì vậy mà thông tin log của Backend server (Apache web server) sẽ chỉ nhận được là địa chỉ IP của Nginx proxy. Để ghi nhận địa chỉ IP thực của client vào backend web server, chúng ta sử dụng tham số: “proxy_set_header X-Forwarded-For”
    • proxy_set_header X-Forwarded-Proto: Xác định giao thức (http hoặc https) mà client gửi request tới proxy.
    • client_max_body_size: Thiết lập kích thước tối đa mà client sẽ gửi thông tin đến server.

Mở file Virtual host của nginx để cấu hình Proxy (ở đây sử dụng virtual host của trang default): /etc/nginx/conf.d/default.conf. Tại block location / {} chỉnh sửa nội dung để chuyển request từ Proxy về Apache:

location / {
        proxy_pass http://127.0.0.1:8080;
        include /etc/nginx/proxy_config;
    }

Tham số proxy_pass dùng để thiết lập giao thức và địa chỉ của máy chủ backend và một URI tùy chọn mà một location sẽ được ánh xạ. Địa chỉ ở đây có thể là domain hoặc địa chỉ IP (127.0.0.1) và một cổng tùy chọn mà Backend đang lắng nghe (8080).

Do Nginx phục vụ file tĩnh nhanh hơn Apache rất nhiều nên ta cấu hình như sau.

Tại block server {} thêm nội dung phía dưới để khi User có một request truy vẫn file tĩnh, Nginx sẽ trả về luôn thay vì phải chuyển request vào Apache xử lý:

location ~* ^.+\.(jpeg|io|map|jpg|png|gif|bmp|ico|svg|tif|tiff|css|js|htm|html|ttf|otf|webp|woff|txt|csv|rtf|doc|docx|xls|xlsx|ppt|pptx|odf|odp|ods|odt|pdf|psd|ai|eot|eps|ps|zip|tar|tgz|gz|rar|bz2|7z|aac|m4a|mp3|mp4|ogg|wav|wma|3gp|avi|flv|m4v|mkv|mov|mpeg|mpg|wmv|exe|iso|dmg|swf)$ {
            root           /var/www/html;
            expires        max;
        }

Lưu ý: đường dẫn root /var/www/html phải trùng với thư mục đặt Source code mà Apache đang xử lý (ở đây là /var/www/html).

Sau khi cấu hình xong, file virtual host sẽ giống như sau:

Khởi động lại Nginx:

systemctl restart nginx.service && systemctl enable nginx.service

Nếu Server CentOS 7 đang bật SELinux ta cần phải cho phép kết nối đến Apache Backend:

setsebool -P httpd_can_network_connect 1

Bây giờ từ trình duyệt web của client truy cập địa chỉ ip của server (http://your-ip-address ) sẽ ra default page của Apache.

Lưu ý: Trên đây là hướng dẫn cấu hình Reverse Proxy cho Website sử dụng http. Nếu các bạn muốn sử dụng https cho Website thì cần phải cấu hình SSL cho Virtual Host của Nginx Reverse Proxy và Virtual Host của Apache, Chỉ thị proxy_pass phải được Forward https vào backend (ví dụ: proxy_pass https://127.0.0.1:8443  trong đó 8443 là Port https mà Apache đang lắng nghe. Ta phải đổi vì Port https 443 Nginx đã lắng nghe bên ngoài)

Chúc các bạn thành công!

Leave a Reply

Your email address will not be published. Required fields are marked *