Cài đặt NGINX làm reverse proxy cho Apache trên Debian

Tận hưởng sự kết hợp sức mạnh của hai Web server engine nổi tiếng là Apache và Nginx.

Cài đặt NGINX làm reverse proxy cho Apache trên Debian
NGINX và Apache là hai máy chủ website phổ biến nhất thế giới hiện nay

Ưu điểm của NGINX là tốc độ nhanh trong xử lý trang tĩnh và hình ảnh nhờ khả năng xử lý cache cũng như khả năng xử lý hàng nghìn kết nối với bộ nhớ thấp nhờ kiến trúc Asynchronous và Event Driven.

Trong khi đó, Apache đã được phát triển lâu đời nên rất ổn định và có rất nhiều tính năng vô đối được phát triển dưới dạng các module.

Vậy thay vì so sánh cái nào hơn cái nào thì tại sao không kết hợp sức mạnh của hai máy chủ Website mạnh mẽ này?

Cài đặt và cấu hình Apache

Trước hết ta cài đặt LAMP như bình thường. Hệ thống Apache sẽ đứng phía sau để xử lý dữ liệu động.

Tuy nhiên để tránh xung đột với NGINX, thay vì lắng nghe ở cổng 80 như bình thường, ta cần cấu hình Apache nghe ở một cổng khác, ví dụ như cổng 8888 (hoặc bất kì cổng nào bạn muốn, miễn là lớn hơn 1024) như sau:

cp /etc/apache2/ports.conf /etc/apache2/ports.conf.bak
echo "Listen 8888" | sudo tee /etc/apache2/ports.conf
sudo systemctl restart apache2

Ngoài ra với các VirtualHost, ta cũng điều chỉnh để nghe ở cổng 8888. Ta cũng chỉ nên giới hạn VirtualHost chỉ lắng nghe ở 127.0.0.1.

<VirtualHost 127.0.0.1:8888>
    ServerName example.com
    ServerAdmin webmaster@hainh.me
    DocumentRoot /var/www/icreativ

    <Directory /var/www/icreativ>
        AllowOverride FileInfo AuthConfig Limit
        Options MultiViews SymLinksIfOwnerMatch IncludesNoExec
    </Directory>
</VirtualHost>

Cài đặt NGINX

Cài đặt NGINX như sau

sudo apt-get install nginx

Khởi động NGINX

sudo systemctl start nginx

Cấu hình NGINX làm reverse proxy cho Apache

Tạo một file có tên ví dụ như apache2 trong /etc/nginx/sites-available có nội dung như sau:

/etc/nginx/sites-available/apache2

server {
    server_name example1.com example2.com;

    location / {
        try_files $uri $uri/ @apache;
    }
    location ~ ^/\.user\.ini {
        deny all;
    }
    location ~*  \.(svg|svgz)$ {
        types {}
        default_type image/svg+xml;
    }
    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }
    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }
    location @apache {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8888;
        proxy_read_timeout 90;
        proxy_redirect off;
    }
    location ~[^?]*/$ {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8888;
        proxy_read_timeout 90;
        proxy_redirect off;
    }
    location ~ \.php$ {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8888;
        proxy_read_timeout 90;
        proxy_redirect off;
    }
    location ~/\. {
        deny all;
        access_log off;
        log_not_found off;
    }
}

Với server_name là danh sách các domain VirtualHost đã được cấu hình ở phía Apache2, ngăn cách bằng dấu cách (space).

Kích hoạt cấu hình reverse proxy (chỉ làm một lần).

sudo ln -s /etc/nginx/sites-available/apache2 /etc/nginx/sites-enabled/

Khởi động lại NGINX để áp dụng cấu hình mới:

sudo systemctl restart nginx

Cài đặt chứng chỉ SSL miễn phí với Let’s Encrypt

Thay vì cài đặt chứng chỉ SSL cho Apache thì chúng ta cài đặt cho NGINX.

Cài đặt plugin nginx cho certbot:

sudo apt install python-certbot-nginx

Tạo chứng chỉ SSL như sau. Lưu ý: với mỗi cấu hình trong /etc/nginx/sites-available chỉ tạo được một chứng chỉ SSL chung cho tất cả domain liệt kê trong server_name.

sudo certbot --nginx -d example1.com -d example2.com

Phản hồi về bài viết

Cùng thảo luận chút nhỉ!

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.