nginx.conf和proxy.conf中服务器的设置有什么关系?

What is the relationship of server's setting in both nginx.conf and proxy.conf?

我是 NGINX 的新手。

在我的项目中,serveretc/nginx/nginx.confetc/nginx/conf.d/proxy.conf 中都有定义。并且 etc/nginx/conf.d/proxy.conf 包含在 nginx.conf

我不明白这两个文件中服务器设置的关系。前任。在 nginx.conf 中,服务器的设置是 listen 80 ; listen [::]:80 ;,在 proxy.conf 中,服务器的设置是 listen 80 proxy_protocol

  1. 在上面的例子中,实际通信中将使用哪个设置?
  2. 服务器 proxy.conf 的设置是否覆盖服务器 nginx.conf 的设置?
  3. 或者服务器的设置 proxy.conf 将合并到服务器的设置 nginx.conf?

请找到完整的 conf 文件如下:

etc/nginx/conf.d/proxy.conf

content: |
  client_max_body_size 500M;
  server_names_hash_bucket_size 128;

  upstream backend {
    server unix:///var/run/puma/my_app.sock;
  }

  server {
     listen 80 proxy_protocol;

     access_log /var/log/nginx/access.log;
     error_log /var/log/nginx/error.log;
  
     large_client_header_buffers 8 32k;

     set_real_ip_from 10.0.0.0/8;
     real_ip_header proxy_protocol;

    location / {
       proxy_http_version 1.1;
       proxy_set_header X-Real-IP $proxy_protocol_addr;
       proxy_set_header X-Forwarded-For $proxy_protocol_addr;
       proxy_set_header Host $http_host;
       proxy_set_header X-NginX-Proxy true;
       proxy_buffers 8 32k;
       proxy_buffer_size 64k;
       proxy_pass http://backend;
       proxy_redirect off;

       Enables WebSocket support
     location /v1/cable {
         proxy_pass http://backend;
         proxy_http_version 1.1;
         proxy_set_header Upgrade "websocket";
         proxy_set_header Connection "Upgrade";
         proxy_set_header X-Real-IP $proxy_protocol_addr;
         proxy_set_header X-Forwarded-For $proxy_protocol_addr;
      }
    }
  }

etc/nginx/nginx.conf

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    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  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

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

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

    server {
        listen       80 ;
        listen       [::]:80 ;
        server_name  localhost;
        root         /usr/share/nginx/html;

        location / {
        }      
    }   
}

Nginx 根据 listenserver_name 指令的值选择一个 server 块来处理请求。

如果找不到匹配的服务器名称,将使用该端口的默认服务器。

在你问题的配置中,proxy.conf 中的 server 块首先遇到,因此它成为端口 80 的实际默认服务器。

nginx.conf 中的 server 块将只匹配使用正确主机名的请求,即 http://localhost

详情见this document