![nginx:具有多个服务器指令的上游?](https://linux22.com/image/606100/nginx%EF%BC%9A%E5%85%B7%E6%9C%89%E5%A4%9A%E4%B8%AA%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%8C%87%E4%BB%A4%E7%9A%84%E4%B8%8A%E6%B8%B8%EF%BC%9F.png)
我正在尝试打包 2 个使用 nginx 作为代理的应用程序并将每个配置文件传递到/etc/nginx/conf.d/
.
在一个文件中执行此操作(combined.conf
)效果很好:
upstream backend1 {
http://localhost:8989;
}
upstream backend2 {
http://localhost:8990;
}
server {
location /backend1/ {
proxy_pass http://backend1;
}
location /backend2/ {
proxy_pass http://backend2;
}
但是,当拆分成两个文件时,其中一个重定向系统地失败:
backend1.conf
:upstream backend1 { http://localhost:8989; } server { location /backend1/ { proxy_pass http://backend1; }
backend2.conf
:upstream backend2 { http://localhost:8990; } server { location /backend2/ { proxy_pass http://backend2; }
所以我的问题是:一个http
节点可以有两个不同的server
子节点吗?
Nginx文档对此只字未提。
其他人似乎成功但这种架构却
Nginx版本是1.1.19-1ubuntu0.1。
谢谢您的建议!
答案1
经过如此反复尝试和测试后,我找到了一种使其工作的方法,并能够为每个应用程序发送一个配置文件。
以下是每个应用程序分发的一个公共文件和一对上游/位置文件:
/etc/nginx/conf.d/common-proxies.conf
:include /upstreams/*.conf; server { include /locations/*.conf }
/etc/nginx/locations/backend1.conf
location /backend1/ { upstream http://backend1; }
/etc/nginx/locations/backend2.conf
location /backend2/ { upstream http://backend2; }
/etc/nginx/upstreams/backend1.conf
upstream backend1 { http://localhost:8989; }
/etc/nginx/upstreams/backend2.conf
upstream backend2 { http://localhost:8990; }
答案2
一个 http 块可以有多个服务器子块。但是,nginx 选择一个服务器块来处理请求。因此,请求永远不会“看到” backend2 位置,因为它与第一个服务器块匹配。
答案3
这是一个适用于我的基本身份验证的解决方案。
安装所需的软件包以使用 htpasswd 生成密码
sudo yum install httpd-tools [RHEL/CentOS]
sudo apt install apache2-utils [Debian/Ubuntu]
使用以下命令创建密码文件
htpasswd -c /home/osboxes/nginx1-auth.htpasswd admin
htpasswd -c /home/osboxes/nginx2-auth.htpasswd sysadmin
htpasswd -c /home/osboxes/glances-auth.htpasswd devopsadmin
nginx.conf 文件
###############Start-of-Nginx-Config-file #########
events {}
http {
upstream backend_nginx1 {
server nginx1;
}
upstream backend_nginx2 {
server nginx2;
}
upstream backend_glances {
server glances:61208;
}
server {
listen 7070;
server_name _;
location / {
#//turn on auth for this location
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/nginx1-auth.htpasswd;
proxy_pass http://backend_nginx1;
}
}
server {
listen 8080;
server_name _;
location / {
#//turn on auth for this location
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/nginx2-auth.htpasswd;
proxy_pass http://backend_nginx2;
}
}
server {
listen 9090;
server_name _;
location / {
#//turn on auth for this location
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/glances-auth.htpasswd;
proxy_pass http://backend_glances;
}
}
}
#Proxy on nginx tcp port
stream {
upstream postgres {
server pdb3:5432;
}
server {
listen 5432;
proxy_pass postgres;
}
}
现在部署后端 docker 容器,由前端 nginx 负载均衡器提供服务
sudo docker run -d --name nginx1 nginx
sudo docker run -d --name nginx2 nginx
Glances 容器是 top/htop 的组合,用于在控制台或 Web 浏览器上获取系统/docker 资源。
sudo docker run -d --restart="always" -e GLANCES_OPT="-w" -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --name glances docker.io/nicolargo/glances
部署前端 nginx 负载均衡器来为后端服务/容器提供服务
sudo docker run -d --name nginx-reverseProxy -p 7070:7070 -p 8080:8080 -p 9090:9090 --link nginx1:nginx1 --link nginx2:nginx2 --link glances:glances -v /home/osboxes/nginx.conf:/etc/nginx/nginx.conf -v /home/osboxes/nginx1-auth.htpasswd:/etc/nginx/nginx1-auth.htpasswd -v /home/osboxes/nginx2-auth.htpasswd:/etc/nginx/nginx2-auth.htpasswd -v /home/osboxes/glances-auth.htpasswd:/etc/nginx/glances-auth.htpasswd nginx