Nginx 服务器名称问题
Nginx server name issue
在我的 Nginx 配置中,我想保留一个服务可以通过 http 访问,而所有其他服务应该通过 https 访问,并在尝试连接 http 时强制使用 ssl。这是我的配置:
server{
server_name localhost;
listen 80;
proxy_http_version 1.1;
location /services/ {
proxy_pass http://localhost:47440/;
}
listen / {
rewrite ^ https://$server_name$request_uri? permanent;
}
server{
server_name localhost_ssl;
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/mycert.crt;
ssl_certificate_key /etc/nginx/ssl/mycert.key;
proxy_http_version 1.1;
location /db/ {
proxy_pass http://localhost_ssl:8084/;
}
}
我的问题是在尝试重新加载时出现此错误:
host not found in upstream "localhost_ssl" in /etc/nginx/nginx.conf:46
知道为什么会这样吗?
您收到此错误是因为 nginx 找不到主机 "localhost_ssl"。事实上它不存在,除非你用上游指令指定它(或者在我认为的主机文件中)。
你应该将它设置为 proxy_pass http://localhost:8084/;
假设你的服务真的在 127.0.0.1:8084 上监听。
此外,您可能希望将 listen / {
替换为 location / {
。
更新:如果您使用您的 IP 访问您的服务器(您没有域名),那么您可以删除 server_name
指令:
server {
listen 80;
proxy_http_version 1.1;
location /services {
proxy_pass http://localhost:47440/;
proxy_set_header Host $host;
}
location / {
return 301 https://$host$request_uri?; # Replace $server_name by $host
}
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/mycert.crt;
ssl_certificate_key /etc/nginx/ssl/mycert.key;
proxy_http_version 1.1;
location /db {
proxy_pass http://localhost:8084/;
proxy_set_header Host $host;
}
}
如果不匹配 location /services
,该配置会将端口 80 上收到的请求重定向到 443。如果在端口 443 上收到的请求与 location /db
匹配,则会被代理。
但这是您真正想要实现的目标吗?我的意思是在端口 443 上对 /test 的请求不会匹配任何位置,因为只有 /db
.
您的 DNS 解析器似乎由于某种原因出现故障。
尝试添加:
选项单一请求
到/etc/resolv.conf
这导致 IPv6/v4 查找按顺序完成。
在我的 Nginx 配置中,我想保留一个服务可以通过 http 访问,而所有其他服务应该通过 https 访问,并在尝试连接 http 时强制使用 ssl。这是我的配置:
server{
server_name localhost;
listen 80;
proxy_http_version 1.1;
location /services/ {
proxy_pass http://localhost:47440/;
}
listen / {
rewrite ^ https://$server_name$request_uri? permanent;
}
server{
server_name localhost_ssl;
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/mycert.crt;
ssl_certificate_key /etc/nginx/ssl/mycert.key;
proxy_http_version 1.1;
location /db/ {
proxy_pass http://localhost_ssl:8084/;
}
}
我的问题是在尝试重新加载时出现此错误:
host not found in upstream "localhost_ssl" in /etc/nginx/nginx.conf:46
知道为什么会这样吗?
您收到此错误是因为 nginx 找不到主机 "localhost_ssl"。事实上它不存在,除非你用上游指令指定它(或者在我认为的主机文件中)。
你应该将它设置为 proxy_pass http://localhost:8084/;
假设你的服务真的在 127.0.0.1:8084 上监听。
此外,您可能希望将 listen / {
替换为 location / {
。
更新:如果您使用您的 IP 访问您的服务器(您没有域名),那么您可以删除 server_name
指令:
server {
listen 80;
proxy_http_version 1.1;
location /services {
proxy_pass http://localhost:47440/;
proxy_set_header Host $host;
}
location / {
return 301 https://$host$request_uri?; # Replace $server_name by $host
}
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/mycert.crt;
ssl_certificate_key /etc/nginx/ssl/mycert.key;
proxy_http_version 1.1;
location /db {
proxy_pass http://localhost:8084/;
proxy_set_header Host $host;
}
}
如果不匹配 location /services
,该配置会将端口 80 上收到的请求重定向到 443。如果在端口 443 上收到的请求与 location /db
匹配,则会被代理。
但这是您真正想要实现的目标吗?我的意思是在端口 443 上对 /test 的请求不会匹配任何位置,因为只有 /db
.
您的 DNS 解析器似乎由于某种原因出现故障。 尝试添加: 选项单一请求
到/etc/resolv.conf 这导致 IPv6/v4 查找按顺序完成。