Nếu bạn đang vận hành một trang web hoặc một API, có lẽ bạn sẽ cần phải xử lý các tên miền, tên miền phụ và vấn đề CORS khó chịu. Hãy cùng phân tích từng bước và thiết lập mọi thứ một cách suôn sẻ.
Cài Đặt Tên Miền và Tên Miền Phụ trong Nginx
Nginx giúp bạn cấu hình nhiều tên miền và tên miền phụ một cách cực kỳ dễ dàng. Bạn chỉ cần thiết lập các server block (hay còn gọi là virtual hosts) để chỉ định Nginx biết tên miền nào sẽ trỏ đến đâu.
Trong trường hợp này, chúng ta đang sử dụng Nginx như một reverse proxy. Điều này có nghĩa là Nginx sẽ nhận các yêu cầu đến và chuyển tiếp chúng đến các máy chủ backend phù hợp dựa trên tên miền phụ. Cấu hình này rất hữu ích cho việc cân bằng tải, bảo mật và tập trung xử lý yêu cầu.
Để đảm bảo tất cả lưu lượng được chuyển hướng một cách an toàn qua HTTPS, hãy thiết lập một chuyển hướng từ cổng 80 sang 443:
server {
listen 80;
server_name example.com *.example.com;
return 301 https://$host$request_uri;
}
Nếu bạn muốn xử lý cả tên miền chính (example.com
) và nhiều tên miền phụ (api.example.com
, blog.example.com
, v.v.) một cách động, bạn có thể trích xuất tên miền phụ và proxy các yêu cầu tương ứng:
server {
listen 443 ssl;
server_name *.example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
set $subdomain "default";
if ($host ~* ^(.+?)\.example\.com$) {
set $subdomain $1;
}
location / {
proxy_pass http://backend.$subdomain.example.com;
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_set_header X-Forwarded-Proto $scheme;
proxy_set_header Connection "upgrade";
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Authorization $http_authorization;
}
}
Cấu hình này sẽ trích xuất động tên miền phụ từ yêu cầu và proxy yêu cầu đến một máy chủ backend tương ứng (backend.<subdomain>.example.com
). Ngoài ra, nó đảm bảo rằng tất cả các tiêu đề cần thiết được chuyển tiếp một cách chính xác.
Bây giờ, chỉ cần kích hoạt cấu hình và khởi động lại Nginx:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Tuyệt vời! Tên miền của bạn và tất cả các tên miền phụ bây giờ nên hoạt động với HTTPS và proxy động.
Xử Lý CORS (Chia Sẻ Tài Nguyên Giữa Các Miền) Trong Nginx
CORS là thứ mà chặn frontend của bạn gọi một API được lưu trữ trên một miền khác. Nếu frontend của bạn nằm ở app.example.com
và API của bạn ở api.example.com
, bạn sẽ cần cho phép các yêu cầu cross-origin.
Để cho phép API của bạn chấp nhận các yêu cầu từ một miền khác, bạn cần thêm các tiêu đề phù hợp trong Nginx.
server {
listen 443 ssl;
server_name api.example.com;
ssl_certificate /etc/nginx/ssl/api.example.com.crt;
ssl_certificate_key /etc/nginx/ssl/api.example.com.key;
location / {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type';
if ($request_method = OPTIONS) {
return 204;
}
}
}
Điều này cho phép bất kỳ ai truy cập API của bạn, điều này thì ổn cho các API công khai nhưng có thể rủi ro cho các API riêng tư.
Bạn muốn giới hạn quyền truy cập vào app.example.com
? Hãy làm như sau:
add_header 'Access-Control-Allow-Origin' 'https://app.example.com';
Các trình duyệt đôi khi gửi một yêu cầu OPTIONS
trước khi thực hiện một cuộc gọi API thực tế. Nếu bạn không xử lý nó, mọi thứ sẽ bị hỏng. Đây là cách cho phép các yêu cầu preflight:
location / {
if ($request_method = OPTIONS) {
add_header 'Access-Control-Allow-Origin' 'https://app.example.com';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type';
return 204;
}
}
Kết Luận
Việc thiết lập tên miền, tên miền phụ và CORS đúng cách trong Nginx không quá khó khi bạn biết cần điều chỉnh gì. Với cấu hình đúng, bạn có thể tránh được những cơn đau đầu và giữ cho ứng dụng của mình hoạt động mượt mà. Chúc bạn lập trình vui vẻ!