Nginx系列(二)

Nginx系列之 主域名和二级域名的映射配置

Nginx系列(二)

在云服务器公网ip 202.100.101.178上部署了两个应用,端口为8848和9000,通过主域名www.test.url和二级域名app.test.url访问以上两个应用。

环境:
操作系统:
测试:CentOS Linux release 7.6.1810 (Core)
正式:CentOS Linux release 7.9.2009 (Core)
Nginx:nginx:1.14.2(Docker)

一、配置DNS解析

在域名接入商的域名控制台,将wwwapp作为主机记录(域名前缀),记录类型选择A,记录值填入202.100.101.178,分别添加到解析记录。

  • A 将域名指向一个IPV4地址
  • CNAME 将域名指向另外一个域名
  • AAAA 将域名指向一个IPV6地址
  • NS 将域名指定其他DNS服务器解析

添加完成后,ping www.test.urlping app.test.url,查看是否有返回202.100.101.178。如未成功返回,则需检查配置。

二、修改Nginx配置文件

在 Nginx 中,虚拟主机(Virtual Host)是一种可以让单个服务器上的多个网站共享同一个 IP 地址和端口号的技术。通过配置不同的虚拟主机,Nginx 可以将来自不同域名或者 IP 地址的请求转发到不同的后端服务器,从而实现在同一个物理服务器上托管多个网站的目的。

1、修改配置

nginx.confhttp块添加两个server块,分别用于处理主域名和二级域名的请求。

http {
  upstream index {
    server 202.100.101.178:8848;
  }

  upstream app {
    server 202.100.101.178:9000;
  }

  server {
    listen 80;
    listen [::]:80;
    server_name test.url www.test.url;

    location / {
      proxy_pass http://index;
      proxy_read_timeout 300s;
      proxy_connect_timeout 75s;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
    }
  }

  server {
    listen 80;
    listen [::]:80;
    server_name app.test.url;

    location / {
      proxy_pass http://app;
      proxy_read_timeout 300s;
      proxy_connect_timeout 75s;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
    }
  }
}

第一个server块用于处理来自www.test.url的请求,并将其转发给8848端口,第二个server块处理来自app.test.url的请求,将其转发给9000端口。

  • listen 定义监听的端口号
    • [::]: 表示在IPv6和IPv4上都监听所有可用的网络接口。
  • server_name 定义域名或IP地址
  • location 定义URL路径
  • proxy_pass 将客户端请求转发到指定的地址
  • proxy_read_timeout 从upstream读取响应时等待的最大时间
  • proxy_connect_timeout 设置连接远程服务器的超时时间
  • upstream 指定代理服务器,将客户端请求传递给指定服务器,实现负载均衡和高可用性
  • $http_host 表示客户端请求头中的'Host'字段

2、重启容器

完成配置后,重启Nginx容器使配置生效。
安装在主机上:sudo systemctl restart nginx
使用Docker安装:sudo docker restart nginx

3、测试

在浏览器输入http://202.100.101.178:宿主机端口,查看是否能打开相应页面。

三、踩坑

  • 配置完成后无法访问

    • --network=host
      配置完成后,输入http://www.test.url,页面显示502 Bad Gateway,查看nginx error.log日志。
    2023/04/11 01:42:29 [error] 6#6: *7 connect() failed (111: Connection refused) while connecting to upstream, client: 172.31.1.50, server: test.url, request: "GET / HTTP/1.1", upstream: "http://202.100.101.178:8848/", host: "www.test.url"
    

    当时以为是8848的服务访问不了了,使用curl http://202.100.101.178:8848正常返回,感觉还是nginx配置出了问题。
    删掉nginx容器,在docker run命令中加入了--network=host使用主机网络重新创建容器。输入url访问,error.log中的输入有所差异,接着往下看。

    • Host
    [error] 6#6: *1 upstream prematurely closed connection while reading response header from upstream, client: 172.31.1.50, server: test.url, request: "GET / HTTP/1.1", upstream: "http://202.100.101.178:8848/", host: "www.test.url"
    

    这是啥原因?检查了一遍配置文件,好像没啥问题,然后尝试将每个server块的proxy_set_header Host $host;删除,重启容器,果然可以访问了。

    以上两个问题,都是在测试环境下发现的,然而在正式环境却没有出现该情况,有了解的小伙伴可以交流下~