linux - nginx default_site 似乎没有工作

标签 linux nginx docker proxy reverse-proxy

我已经让 nginx 在 docker 中作为反向代理运行并且已经运行了一段时间 - 它工作得非常好,除了我最近看到的一个小问题。

我想要什么:当用户访问我的 nginx 服务器并且没有为 URL 指定的 .conf 文件时,无论是 404/444 还是其他一些 HTTP 响应都会丢弃联系。

我所看到的:当用户导航到 sudomain.url.com 并且我的任何 *.conf 文件中都没有指定该子域时,nginx 使用它找到的第一个 conf 文件- 忽略 default.conf。在下面找到我的详细信息。

您可以提供的任何其他提示/技巧也很棒!

nginx.conf:

user  nginx;
worker_processes  1;

error_log  /etc/nginx/log/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
} 


http {

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /etc/nginx/log/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  70;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

默认配置文件:

server {
  server_name _;
  listen 80 default_server;
  return 444;
}

server {
  server_name _;
  listen 443 default_server;
  return 444;
}

conf 文件示例(可能有十几个):

server {
  listen sub.domain.com:80;
  server_name sub.domain.com;
  return 302 https://sub.domain.com$request_uri;
}

server {
  listen sub.domain.com:443;
  server_name sub.domain.com;

    ssl_certificate /etc/nginx/keys/ssl.pem;
    ssl_certificate_key /etc/nginx/keys/ssl.key;

  ssl on;
  ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC4-SHA';
  ssl_prefer_server_ciphers on;
  ssl_dhparam /etc/nginx/keys/dhparams.pem;

  add_header X-Frame-Options SAMEORIGIN;
  add_header X-XSS-Protection "1; mode=block";
  add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";

  location / {
        proxy_pass http://10.0.1.4:81;
        proxy_buffering off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

最佳答案

我还没有实际测试过这个,但我的直觉是你的 listen 指令不应该包含主机名。它们应该包含您想要监听的接口(interface)的 IP 地址和您想要监听的端口。然后,对于每个不同的端口/IP 组合,您可以将其中之一指定为默认值。

只有在解析了请求发送到哪个IP地址以及它在哪个端口上之后,nginx才开始实际处理请求。这里的第一步是检查主机 header ,如果它找到主机 header 值的匹配服务器 block ,那么它应该路由到那里。如果找不到,则应路由到默认值。

如果没有收到主机 header ,那么我认为,在较新版本的 nginx 中,它将丢弃请求,但它以前只是通过将 IP/端口组合发送到默认服务器来处理此请求。

下面是一个 nginx.conf,它为我提供了命名服务器的工作端点,并为其他所有内容返回 404。由于 HSTS header ,您需要点击 test.se{1,2,3,4}.home-v.ind.in 才能看到它正常工作,否则您只会收到浏览器错误。

user nginx;
worker_processes      auto;

error_log             stderr notice;
pid                   /var/run/nginx.pid;

events {
  worker_connections  1024;
}

http {
  include                   /etc/nginx/mime.types;
  default_type              application/octet-stream;
  sendfile                  on; 
  tcp_nopush                on;
  keepalive_timeout         300s;
  ssl_certificate           /etc/pki/nginx/fullchain.pem;
  ssl_certificate_key       /etc/pki/nginx/privkey.pem;
  ssl_dhparam               /etc/pki/nginx/dhparams.pem;
  ssl_protocols             TLSv1.2;
  ssl_ciphers               EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
  ssl_prefer_server_ciphers on;
  ssl_buffer_size           1400;
  ssl_session_timeout       1d;
  ssl_session_cache         shared:SSL:50m;  
  ssl_stapling              on;
  ssl_stapling_verify       on;
  ssl_trusted_certificate   /etc/pki/nginx/fullchain.pem;
  add_header                "Cache-Control" "no-transform";
  add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
  resolver                  8.8.8.8 8.8.4.4 216.146.35.35 216.146.36.36 valid=60s;
  resolver_timeout          2s;

  server {
    listen 80 default_server;
    server_name _;
    return 301 https://$host$request_uri;
  }

  server {
    listen 443 ssl http2;
    server_name test.se1.home-v.ind.in;
    root /usr/share/nginx/html;
    location /.well-known { satisfy any; allow all; try_files $uri $uri/ =404; }
    location /robots.txt { satisfy any; allow all; add_header Content-Type text/plain; return 200 "User-agent: *\nDisallow: /\n"; }
    location / { satisfy any; allow all; add_header Content-Type text/plain; return 200 "Test Site 1"; }
  }

  server {
    listen 443 ssl http2;
    server_name test.se2.home-v.ind.in;
    root /usr/share/nginx/html;
    location /.well-known { satisfy any; allow all; try_files $uri $uri/ =404; }
    location /robots.txt { satisfy any; allow all; add_header Content-Type text/plain; return 200 "User-agent: *\nDisallow: /\n"; }
    location / { satisfy any; allow all; add_header Content-Type text/plain; return 200 "Test Site 2"; }
  }

  server {
    listen 443 ssl http2 default_server;
    server_name _;
    root /usr/share/nginx/html;
    location /.well-known { satisfy any; allow all; try_files $uri $uri/ =404; }
    location / { return 404; }
  }

}

关于linux - nginx default_site 似乎没有工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44165305/

相关文章:

linux - 循环遍历 num_machines 在下面的脚本中,表达式 num_machines=X 中的值每次都会改变

linux - 针对 Linux 服务器(Web 服务器)集成 Windows/OSX/Linux 身份验证

nginx - Nginx 正则表达式上的这个 '(?U)' 是什么意思

nginx 不遵循 www-data 用户的符号链接(symbolic link)

java - 使用 docker-compose 时无法访问 docker 容器内的 spring-boot Rest-endpoint

docker - "Docker: command not found"来自 MacOS 上的 Jenkins

mysql - 如何更改MySQL错误日志文件格式

linux - Linux 中的当前用户路径?

php - 为什么在 Ubuntu 上上传 Wordpress 插件或主题时连接会重置

docker - 如何在 openjdk :11 docker base image without "no installation candidate" error? 上安装 firefox