#【Nginx】双代理以及复杂条件的rewrite跳转
一开始,主机上只有一个`nginx`,监听`80`端口,几年过去了,一直相安无事……
后来,野生的`OpenResty`小三出现了……`OpenResty`小三使出了`“Lua大法好”`……效果拔群……
因为`nginx`上挂着别的东西,我不想停掉它换成`OpenResty`,因为容易导致`OpenResty`的Bug影响蔓延,其次是因为我需要反复的调试lua,会影响别人的东西……
所以
>还是要继续坚持80端口的nginx作为主代理方针不动摇,然后OpenResty另起炉灶高度自治……
首先给`OpenResty`分配个端口,比如说叫`8888`(吉利),然后,将指定域名的请求代理到`OpenResty`上……
假设我的`主机IP`是`123.123.123.123`(不要问我这是哪一类IP地址,这是我编的),我与此相关的有两个域名`domain.com`和`domain.cn`
于是首先要配域名,给`domain.com`和`domain.cn`的`*`做`A记录`,指向`123.123.123.123`
`nginx`的配置,给`nginx`多添加个`server节点`(部分):
```
server
{
listen 80;
server_name *.domain.com *.domain.cn;
server_name_in_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location /
{
proxy_pass http://123.123.123.123:8888/;
}
}
```
之后nginx reload一下,就不要再动了
```shell
nginx -s reload
```
之后是漫长的`OpenResty`的配置调试之旅……
首先,我想在域名下面挂两个项目,一个常用的`www项目`,还有一个不常用的`app项目`
在正常情况下,所有乱七八糟的二级域名都自动跳转到`www项目`,但是`app`除外,app要有自己的人生
另外,我希望`.cn域名`虽然也可以用,但是我希望`.com域名`是主域名,正常情况下都自动跳转到`.com域名`下
然后就是还要有我亲爱的`lua`做动态页面或者`ajax`返回……
我还是花费了一晚上时间调通了这种需求……
面临的困难:
1. nginx的条件格式极为严格,一个空格都不能少
2. nginx不支持and、or之类的逻辑关系运算,对于复杂的条件判断需要用变量来控制
3. 如果配置错误,会出现重定向循环之类的错误,而且很难通过日志定位是什么原因
4. 由于浏览器缓存的存在,有些重定向循环可能是,所以要时刻注意清空浏览器缓存,否则,验证结果很可能是错误的……
然后,上配置:
```
server {
listen 8888;
server_name *.domain.com *.domain.cn;
index index.html index.htm;
set $doRewrite 'www';
if ( $host = 'www.domain.com' ) {
set $doRewrite '0';
}
if ( $host ~ 'app\.domain\.(.+)' ) {
set $doRewrite 'app';
}
if ( $host = 'app.domain.com' ) {
set $doRewrite '1';
}
if ( $doRewrite = 'www' ) {
rewrite ^/(.*)$ http://www.domain.com/$1 last;
}
if ( $doRewrite = 'app' ) {
rewrite ^/(.*)$ http://app.domain.com/$1 last;
}
location / {
if ( $doRewrite = '0' ) {
root /home/me/www/;
}
if ( $doRewrite = '1' ) {
root /home/me/app/;
}
}
location ~ /([-_a-zA-Z0-9/]+).lualu {
default_type text/html;
set $path $1;
lua_need_request_body on;
content_by_lua_file /home/me/luaAction/$path.lua;
}
}
```
最后,说明一下:
- 访问`www.domain.com`的时候,可以访问到`www目录`下的`html文件`
- 访问`app.domain.com`的时候,可以访问到`app目录`下的`html文件`
- 对于`app.domain.cn`则会跳转到`app.domain.com`
- 剩余其他的域名都会默认跳转到`www.domain.com`
- 访问后缀为`lualu`时,为`luaAction`目录下的`lua文件`的运行结果
- 整个过程由`doRewrite`变量控制,通过对`doRewrite`变量的赋值来决定是否跳转以及跳转到哪个路径下
另外,我遇见一个情况,尽管修改了配置,但是浏览器访问的时候还是总是重定向循环,怎么清空浏览器缓存都没用,这个时候可以尝试清空一下`OpenResty`下的`nginx缓存`,具体的方法是,到`nginx`所在目录下执行`rm -r *_temp`全部按`Y`然后重启`OpenResty`就可以了~
分享出来希望对大家有所帮助,不要再总是像我这样调了一晚上的重定向循环……