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 查找按顺序完成。