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解析
在域名接入商的域名控制台,将www
和app
作为主机记录(域名前缀),记录类型选择A
,记录值填入202.100.101.178
,分别添加到解析记录。
A
将域名指向一个IPV4地址CNAME
将域名指向另外一个域名AAAA
将域名指向一个IPV6地址NS
将域名指定其他DNS服务器解析
添加完成后,ping www.test.url
和ping app.test.url
,查看是否有返回202.100.101.178
。如未成功返回,则需检查配置。
二、修改Nginx配置文件
在 Nginx 中,虚拟主机(Virtual Host)是一种可以让单个服务器上的多个网站共享同一个 IP 地址和端口号的技术。通过配置不同的虚拟主机,Nginx 可以将来自不同域名或者 IP 地址的请求转发到不同的后端服务器,从而实现在同一个物理服务器上托管多个网站的目的。
1、修改配置
在nginx.conf
的http
块添加两个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
,查看nginxerror.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;
删除,重启容器,果然可以访问了。以上两个问题,都是在测试环境下发现的,然而在正式环境却没有出现该情况,有了解的小伙伴可以交流下~
- --network=host