【已解决】Nodejs nginx 反向多站点以及二级域名设置

【已解决】Nodejs nginx 反向多站点以及二级域名设置

/etc/nginx/nginx.conf

内容:

user nginx  nginx;
worker_processes 3;
error_log  /var/log/nginx/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  /var/log/nginx/access.log  main;

sendfile        on;
#tcp_nopush     on;

keepalive_timeout  65;

#gzip  on;

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

}

###/etc/nginx/conf.d/bz.conf (第一个网站配置文件)

server {
        listen 80;
    server_name www.bz.com bz.com bbs.bz.com;   //这个地方二级域名应该怎么设置呢 bbs.bz.com 是不同的node项目
    location / {
    proxy_pass http://127.0.0.1:4000;    //第二个子域名 http://127.0.0.1:4001
    proxy_set_header X-Real-IP ~Dremote_addr;
    proxy_set_header X-Forwarded-For ~Dproxy_add_x_forwarded_for;
    proxy_set_header Host ~Dhttp_host;
    proxy_set_header X-NginX-Proxy true;
    }
}


###/etc/nginx/conf.d/bg.conf (第二个网站配置文件)

server {
    listen 80;
    server_name www.bg.com bg.com;
    location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header X-Real-IP ~Dremote_addr;
   proxy_set_header X-Forwarded-For ~Dproxy_add_x_forwarded_for;
    proxy_set_header Host ~Dhttp_host;
    proxy_set_header X-NginX-Proxy true;
    }
}


###systemctl status nginx.service -l 命令报错(错误搞定)

nginx.service - nginx - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled)
   Active: failed (Result: exit-code) since 二 2014-07-22 16:48:10 CST; 25min ago
     Docs: http://nginx.org/en/docs/
  Process: 2850 ExecStop=/bin/kill -s QUIT $MAINPID (code=exited, status=0/SUCCESS)
  Process: 2702 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
  Process: 2883 ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf (code=exited, status=1/FAILURE)
 Main PID: 2705 (code=exited, status=0/SUCCESS)

7月 22 16:48:10 localhost.localdomain systemd[1]: Starting nginx - high performance web server...
7月 22 16:48:10 localhost.localdomain nginx[2883]: nginx: [emerg] a duplicate default server for 0.0.0.0:80 in /etc/nginx/conf.d/bz.conf:5
7月 22 16:48:10 localhost.localdomain nginx[2883]: nginx: configuration file /etc/nginx/nginx.conf test failed
7月 22 16:48:10 localhost.localdomain systemd[1]: nginx.service: control process exited, code=exited status=1
7月 22 16:48:10 localhost.localdomain systemd[1]: Failed to start nginx - high performance web server.
7月 22 16:48:10 localhost.localdomain systemd[1]: Unit nginx.service entered failed state.

####这个错误重启,注意防火墙一定要把端口加进去

####最终排查是pm2的问题。有3个项目,pm2实际只成功启动2个,确显示3个。在最后发现问题的根源了。是express4 的配置问题,4分离了app端口,可进另一个帖子看解决方案【http://cnodejs.org/topic/53cffbcf691a430912542598】


7 回复

根据您的描述,您遇到了 Nginx 配置中的错误,并且希望了解如何正确配置 Nginx 以支持 Node.js 应用的反向代理以及二级域名设置。以下是修正后的配置示例和解释。

修正后的 Nginx 配置

首先,我们需要确保每个 server 块中的 listenserver_name 是唯一的。同时,为每个二级域名设置单独的 proxy_pass

/etc/nginx/nginx.conf

user nginx nginx;
worker_processes 3;
error_log /var/log/nginx/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 /var/log/nginx/access.log main;

    sendfile on;
    keepalive_timeout 65;

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

/etc/nginx/conf.d/bz.conf

server {
    listen 80;
    server_name www.bz.com bz.com;
    location / {
        proxy_pass http://127.0.0.1:4000;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
    }
}

server {
    listen 80;
    server_name bbs.bz.com;
    location / {
        proxy_pass http://127.0.0.1:4001;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
    }
}

/etc/nginx/conf.d/bg.conf

server {
    listen 80;
    server_name www.bg.com bg.com;
    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
    }
}

解释

  1. server_name: 每个 server 块都定义了一个或多个域名。对于 bbs.bz.com,我们创建了单独的 server 块来处理它。

  2. proxy_pass: 每个 location 块中指定了 Node.js 应用的监听地址。例如,bbs.bz.com 使用 http://127.0.0.1:4001,而其他站点使用 http://127.0.0.1:4000http://127.0.0.1:3000

  3. proxy_set_header: 这些指令用于将客户端信息传递给后端 Node.js 应用,以便它们可以正确地处理请求。

最终检查

确保所有配置文件没有语法错误:

sudo nginx -t

如果一切正常,重新加载 Nginx 配置:

sudo systemctl reload nginx

这样,Nginx 将能够正确地将请求路由到相应的 Node.js 应用。


两个文件里都是 listen 80, 果然报错

紧急啊

大神来看吧

去nginx问好不。

注意发贴格式 - -!

要实现Node.js应用的反向代理和二级域名设置,需要确保Nginx配置文件正确地指定了各个域名及其对应的Node.js应用端口。以下是修改后的配置示例:

修改 /etc/nginx/nginx.conf

保持原配置不变。

修改 /etc/nginx/conf.d/bz.conf

将原有的配置修改为:

server {
    listen 80;
    server_name www.bz.com bz.com;  # 主域名
    location / {
        proxy_pass http://127.0.0.1:4000;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
    }
}

server {
    listen 80;
    server_name bbs.bz.com;  # 二级域名
    location / {
        proxy_pass http://127.0.0.1:4001;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
    }
}

修改 /etc/nginx/conf.d/bg.conf

保持原配置不变,或者如果需要配置二级域名,可以参照上述bz.conf中的二级域名部分进行修改。

问题排查

错误提示nginx: [emerg] a duplicate default server for 0.0.0.0:80表明在同一监听端口上存在多个默认服务器。确保每个server块中只有一个listen 80;行,并且每个域名只被定义一次。

确保所有Node.js应用已经正确启动并监听指定的端口(如4000, 4001, 3000等),并且可以通过localhost访问这些端口。

以上配置应该能解决你的问题。如果有其他问题,请检查Node.js应用的错误日志。

回到顶部