Cách cấu hình Nginx để xử lý các yêu cầu WebSocket và giao tiếp thời gian thực

WebSocket là một giao thức truyền tải hai chiều (full-duplex) cho phép giao tiếp thời gian thực giữa máy khách (client) và máy chủ (server) thông qua kết nối duy trì. Nginx cung cấp một số tùy chọn cấu hình để xử lý các yêu cầu WebSocket và hỗ trợ giao tiếp thời gian thực trong ứng dụng web của bạn. Trong bài viết này, chúng ta sẽ tìm hiểu cách cấu hình Nginx để xử lý các yêu cầu WebSocket.

Để cấu hình Nginx để hỗ trợ WebSocket, bạn cần thực hiện các bước sau:

Cấu hình proxy_pass

Đầu tiên, bạn cần cấu hình proxy_pass để chuyển tiếp yêu cầu WebSocket từ Nginx đến máy chủ ứng dụng thực tế (ví dụ: Node.js, Python, Ruby, vv.). Dưới đây là một ví dụ về cấu hình proxy_pass cho WebSocket:

http {
...
server {
...
location /websocket {
proxy_pass http://your_backend_server;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
}

 

Trong ví dụ trên:

  • /websocket là đường dẫn tới WebSocket endpoint.
  • http://your_backend_server là URL của máy chủ ứng dụng WebSocket thực tế.
  • proxy_http_version 1.1 khai báo phiên bản HTTP sử dụng là 1.1 để hỗ trợ WebSocket.
  • proxy_set_header Upgrade $http_upgradeproxy_set_header Connection "Upgrade" đảm bảo rằng Nginx chuyển tiếp yêu cầu WebSocket và thiết lập các header cần thiết.

Building a twin WordPress stack with Traefik, Nginx and Docker

Cấu hình keepalive

Với WebSocket, kết nối giữa máy khách và máy chủ được duy trì trong một khoảng thời gian dài. Để tối ưu hóa hiệu suất, bạn có thể cấu hình keepalive để tái sử dụng các kết nối đã thiết lập. Dưới đây là ví dụ cấu hình keepalive trong Nginx:

http {
...
upstream backend {
server your_backend_server;
}

server {
...
location /websocket {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Keep-Alive timeout=60;
proxy_set_header Proxy-Connection "Keep-Alive";
}
}
}

 

Trong ví dụ trên, upstream được sử dụng để định nghĩa máy chủ backend. proxy_set_header Keep-Alive timeout=60proxy_set_header Proxy-Connection "Keep-Alive" được sử dụng để thiết lập các header Keep-Alive trong yêu cầu chuyển tiếp.

How to Set Up a Reverse Proxy in Kubernetes - Earthly Blog

Cấu hình SSL (nếu cần)

Nếu bạn sử dụng kết nối an toàn SSL/TLS cho WebSocket, bạn cần cấu hình SSL trong Nginx. Dưới đây là một ví dụ về cấu hình SSL:

http {
...
server {
...
listen 443 ssl;
ssl_certificate /path/to/your/certificate.crt;
ssl_certificate_key /path/to/your/private_key.key;

location /websocket {
proxy_pass http://your_backend_server;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
}

 

Trong ví dụ trên, listen 443 ssl chỉ định cổng và SSL cho máy chủ. ssl_certificatessl_certificate_key chỉ định đường dẫn tới chứng chỉ SSL và khóa riêng tư tương ứng.

Sau khi đã cấu hình, bạn có thể khởi động lại Nginx để áp dụng các thay đổi.

How to Use PHP 8.2 with Nginx | Apache web Servers

Tóm lại, để cấu hình Nginx để xử lý các yêu cầu WebSocket và hỗ trợ giao tiếp thời gian thực, bạn cần cấu hình proxy_pass để chuyển tiếp yêu cầu WebSocket, cấu hình keepalive để tái sử dụng kết nối và cấu hình SSL (nếu cần).