#【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`就可以了~ 分享出来希望对大家有所帮助,不要再总是像我这样调了一晚上的重定向循环……


发表评论

必填,公开,这样称呼起来方便~

必填,不会被公开,不必担心~

http://

非必填,公开,目的是方便增进友好访问~

必填,请输入下方图片中的字母或数字,以证明你是人类

看不清楚
必填,最好不要超过500个字符
     ↑返回顶端↑