Моя конфигурация архитектуры - это служба SSO, работающая на CentOS на NodeJS, порты 10102 и 10142, мне нужно, чтобы все запросы на порт 80 перенаправлялись на 443 извне, а внутри я передаю все на указанные выше порты NodeJS, вот моя конфигурация:
upstream sso1 {
server localhost:10102;
server localhost:10142;
}
server {
listen [::]:80;
listen 443 ssl;
server_name www.site.business site.business;
ssl_certificate /etc/nginx/cert.crt;
ssl_certificate_key /etc/nginx/cert.key;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
location / {
proxy_pass http://sso1;
proxy_read_timeout 90;
proxy_redirect http://sso1 https://www.site.business;
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-Host $server_name;
}
}
Но что бы я ни делал, сайт по-прежнему доступен через HTTP и HTTPS.
Есть идеи, почему Nginx меня игнорирует? Я действительно пробовал разные конфигурации, одна из них перехватывала все запросы порта 80 и перенаправляла их 301:
upstream sso1 {
server localhost:10102;
server localhost:10142;
}
server {
listen [::]:80;
server_name www.site.business site.business;
return 301 https://$server_name$request_uri;
}
server {
listen 443;
server_name www.site.business site.business;
ssl_certificate /etc/nginx/cert.crt;
ssl_certificate_key /etc/nginx/cert.key;
ssl on;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://sso1;
proxy_read_timeout 90;
proxy_redirect http://sso1 https://www.site.business;
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-Host $server_name;
}
}
В вашей верхней конфигурации вы сказали ему прослушивать 80 и 443. Вот важные части конфигурации для вашей ситуации, если вы хотите, чтобы сайт отвечал только на https на субдомене www.
Другой ключ - вам, возможно, придется настроить прослушиватель для домена по умолчанию, который обслуживает любой запрос, который попадает на сервер.
// Listen for requests for the main website
server {
server_name www.example.com;
listen 443 ssl http2; // https optional, need to build Nginx with correct module
ssl_certificatefullchain;
ssl_certificate_key privkey;
// locations etc
}
// Forward http requests for domain and www subdomain to main
server {
listen 80;
server_name example.com www.example.com;
return 301 https://www.example.com$request_uri;
}
// Forward https requests for root domain to main
server {
listen 443 ssl;
server_name example.com;
ssl_certificatefullchain;
ssl_certificate_key privkey;
return 301 https://www.example.com$request_uri;
}
У меня есть эта конфигурация, чтобы иметь дело с дефолтным
# This just prevents Nginx picking a random default server if it doesn't know which server block to send a request to
server {
listen 80 default_server;
server_name _;
return 444; # This means "go away", effectively
}
У меня есть большой учебник и образцы файлов конфигурации. Вот.