我在10.0.0.1上的nginx上有简单的配置文件:
default.conf
server {
listen 80;
server_name server.com;
location / {
root /www;
index index.html;
}
此外,我想将请求重定向到http://10.0.0.1/app1到端口8888上具有相同应用的3台服务器,例如:
http://10.0.0.1/app1 - > http://10.0.0.(2,3,4):8888/app1
所以我必须添加到我的default.conf这样的配置以进行平衡:
upstream app1 {
server 10.0.0.2:8888;
server 10.0.0.3:8888;
server 10.0.0.4:8888;
}
server {
listen 80;
location /app1/ {
rewrite ^/app1^/ /$1 break;
proxy_pass http://app1;
}
}
但是我希望将这个平衡配置保存在一个单独的文件中 - app1.conf。
如果我在/etc/nginx/conf.d/文件夹中有这两个配置文件,我只能打开网址http://10.0.0.1/
但是当我打开http://10.0.0.1/app1时,我得到错误404,因为default.conf它试图在/ www中找到app1,甚至没有尝试检查app1.conf以平衡规则。 所以似乎只能运行default.conf配置文件。 怎么解决它?
答案 0 :(得分:1)
upsteam
部分无论如何都需要在http
块中,它位于你的nginx.conf / default.conf中。
对于您可能使用的位置块:
default.conf
http {
...
upstream app1 {
server 10.0.0.2:8888;
server 10.0.0.3:8888;
server 10.0.0.4:8888;
}
...
server {
listen 80;
server_name server.com;
include /path/to/app1.conf;
location / {
root /www;
index index.html;
}
...
include /etc/nginx/conf.d/*;
...
}
app1.conf
location /app1/ {
rewrite ^/app1^/ /$1 break;
proxy_pass http://app1;
}
在default.conf中编辑include
的路径。
修改强>
其实我在这里弄错了。 nginx的指令是分层的。在文档中,您可以找到可以使用哪个块的位置。 server
块必须位于http
块中。 location
块可以位于server
和location
块中
根据您所在的块,可以使用include
导入该特定上下文中的块
因此,使用include
块中的server
,您可以包含应用特定的location
块,但不包括server
块。这是因为server
块只能驻留在http
块中
我希望这有助于澄清你的情绪。
<强> EDIT2:强>
从你的评论我刚看到重写的正则表达式可能是错误的。
app1.conf
location /app1/ {
rewrite ^/[^\/]+)(/.*) $1 break;
proxy_pass http://app1;
}
答案 1 :(得分:0)
尝试以下方法:
创建文件/etc/nginx/upstream.conf
server 10.0.0.2:8888;
server 10.0.0.3:8888;
server 10.0.0.4:8888;
将您的配置更改为:
upstream app1 {
include /etc/nginx/upstream.conf;
}
server {
listen 80;
location /app1/ {
rewrite ^/app1^/ /$1 break;
proxy_pass http://app1;
}
}