{ Cấu hình Nginx làm proxy cho Apache2

Cấu hình Nginx làm proxy cho Apache2

Cấu hình Nginx làm proxy cho Apache2

Nginx là một trong những máy chủ web hàng đầu trên thế giới. Nginx được tin dùng và sử dụng để phân phối dữ liệu web trên hàng triệu máy chủ trên thế giới. Nginx được đánh giá là hiệu suất cao hơn nhiều so với Apache2 trong hầu hết các trường hợp. Tuy nhiên, mặt hạn chế của Nginx là nó không hỗ trợ đọc file cấu hình .htaccess. Thông thường, để giải quyết trường hợp này các webmaster thường chuyển toàn bộ website sang dùng Nginx. Tuy nhiên cách tối ưu hơn cả là sử dụng Nginx đóng vai trò làm Proxy.

Hướng dẫn cách cài đặt Nginx

Bài viết này hướng dẫn bạn cách cấu hình Nginx với vai trò làm proxy cho apache2. Đa phần các tài liệu thường hay mô tả như sau:”Nginx là frontend cho backend apache2“.

Hướng dẫn này giả định là bạn đã biết những khái niệm và thao tác sau:

  • Cách sử dụng các lệnh cơ bản của Linux phiên bản Ubuntu.
  • Bạn biết cách cấu hình cơ bản virtual host cho Apache2 và Nginx.
  • Đã cài đặt và cấu hình SSL

Mô hình trong bài hướng dẫn:

Mô hình được trình bày trong hướng dẫn này bao gồm từ 2 máy chủ Ubuntu kết nối với nhau qua Private IP nội bộ.

  • Một máy chủ được cài đặt Nginx và Let’s Encrypt đóng vai trò máy chủ proxy.
  • Một hay nhiều máy chủ cài đặt Apache2 đóng vai trò máy chủ website.

Cấu hình Nginx làm Proxy

Kiếm tra phiên bản Nginx của máy chủ

nginx -v

Tạo 1 file cấu hình virtual host như sau trong thư mục /etc/nginx/sites-enabled/exe.conf

Với nội dung như sau:

server {
    listen 80;
    return 301 https://$host$request_uri;
}

Redirect 301 tất cả các link không có http thành https.

listen 443 ssl http2;
server_name ngayhoidulich.benthanhtourist.com www.ngayhoidulich.benthanhtourist.com;
ssl_certificate      /etc/nginx/ssl/benthanhtourist.pem;
ssl_certificate_key  /etc/nginx/ssl/private.key;

Cung cấp dữ liệu web qua ssl có hỗ trợ http2 với các tập tin cấu hình chứng chỉ ssl. Ngoài ra đặt lệnh phân giải domain thành nội dung cung cấp website.

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;

ssl_prefer_server_ciphers on;
ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";

ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;

Cải thiện tình trạng phân giải SSL cho các máy chủ xác thực.

location / {
      try_files $uri $uri/ @proxy;
}
location @proxy {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass http://192.168.0.12;
}
location ~ \.php$ {
       proxy_set_header X-Real-IP  $remote_addr;
       proxy_set_header X-Forwarded-For $remote_addr;
       proxy_set_header Host $host;
       proxy_pass http://192.168.0.12;
}

Chỉ định IP máy chủ cung cấp nội dung website. Ở đây đang sử dụng ip private trong cùng Lan 192.168.0.12.

Lưu ý cần ping giữa 2 máy để kiểm tra xem kết nối có thông suốt không. Test cấu hình nginx bạn mới cài đặt với lệnh nginx -t nếu ok mới làm tiếp.

Restart máy chủ Nginx và kiểm tra tình trạng hoạt động với lệnh sau:

nginx -t
service nginx restart
service nginx status

 nginx.service - nginx - high performance web server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled)
   Active: active (running) since Fri 2019-03-22 14:31:20 +07; 32min ago
     Docs: http://nginx.org/en/docs/
  Process: 15202 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS)
  Process: 12911 ExecReload=/bin/kill -s HUP $MAINPID (code=exited, status=0/SUCCESS)
  Process: 15206 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
 Main PID: 15207 (nginx)
   CGroup: /system.slice/nginx.service
           ├─15207 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
           ├─15208 nginx: worker process
           ├─15209 nginx: worker process
           ├─15210 nginx: worker process
           └─15211 nginx: worker process

Sau khi hoàn thành giai đoạn này bạn có thể test thử xem máy chủ Nginx đã có thể cung cấp nội dung website theo giao thức https chưa. Nếu mọi thứ vẫn ổn thì bạn đã hoàn thành xong việc cấu hình “Nginx làm proxy cho Apache2

Cấu hình Apache2 với mod_rpaf

Theo mặc định nếu bạn không cấu hình Apache2 với mod_rpaf thì tất cả các dữ liệu của người dùng đều xử dụng mặc định từ máy chủ Proxy. Do yêu cầu truy xuất tới máy chủ apache2 là từ Nginx nên các thông tin như cookies, session, các biến môi trường REMOTE_ADDRHTTPS và HTTP_PORT từ người dùng không được truyền tải qua. Sử dụng mod_rpaf sẽ giải quyết vấn đề này.

sudo apt install unzip build-essential apache2-dev
wget https://github.com/gnif/mod_rpaf/archive/stable.zip
unzip stable.zip
cd mod_rpaf-stable
make
make install

Thêm cấu hình module cho mod_rpaf cho Apache2

sudo nano /etc/apache2/mods-available/rpaf.load
LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf.sosudo nano /etc/apache2/mods-available/rpaf.conf
sudo nano /etc/apache2/mods-available/rpaf.conf

        RPAF_Enable             On
        RPAF_Header             X-Real-Ip
        RPAF_ProxyIPs           your_server_ip 
        RPAF_SetHostName        On
        RPAF_SetHTTPS           On
        RPAF_SetPort            On

Cấu hình trên có tác dụng:

  • RPAF_Header – truyền tải header từ máy client.
  • RPAF_ProxyIPs– ip máy client yêu cầu request từ proxy.
  • RPAF_SetHostName – đồng bộ với vhost của apache2 với giá trị ServerName và ServerAlias.
  • RPAF_SetHTTPS – truyền tải yêu cầu https từ client.
  • RPAF_SetPort – cấu hình giá trị cho biến SERVER_PORT.

Test lại cấu hình apache2 sau khi enmod rpaf với lệnh sau:

a2enmod rpaf
apachectl -t
systemctl reload apache2

 

Bài sau →