【Nginx】双代理以及复杂条件的rewrite跳转
一开始,主机上只有一个nginx,监听80端口,几年过去了,一直相安无事……
后来,野生的OpenResty小三出现了……OpenResty小三使出了“Lua大法好”……效果拔群……
因为nginx上挂着别的东西,我不想停掉它换成OpenResty,因为容易导致OpenResty的Bug影响蔓延,其次是因为我需要反复的调试lua,会影响别人的东西……
所以还要继续坚持80端口的nginx作为主代理方针不动摇,然后OpenResty另起炉灶高度自治……
首先给OpenResty分配个端口,比如说叫8888(吉利),然后,将指定域名的请求代理到OpenResty上……
假设我的主机IP是123.123.123.123(不要问我这是哪一类IP地址,这是我编的),我与此相关的有两个域名和
于是首先要配域名,给和的*做A记录,指向123.123.123.123
nginx的配置,给nginx多添加个server节点(部分):
server
{
listen 80;
server_name *. *.;
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一下,就不要再动了
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 *. *.;
index ;
location / {
set $doRewrite 'www';
if ( $host = '' ) {
root /home/me/www/;
set $doRewrite '0';
}
if ( $host ~ 'app\.domain\.(.+)' ) {
set $doRewrite 'app';
}
if ( $host = '' ) {
root /home/me/app/;
set $doRewrite '0';
}
if ( $doRewrite = 'www' ) {
rewrite ^/(.*)$ /$1 permanent;
}
if ( $doRewrite = 'app' ) {
rewrite ^/(.*)$ /$1 permanent;
}
}
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/$;
}
}
最后,说明一下:
访问的时候,可以访问到www目录下的html
访问的时候,可以访问到app目录下的html
对于则会跳转到
剩余其他的域名都会默认跳转到
访问后缀为lualu时,为luaAction目录下的lua文件的运行结果
整个过程由doRewrite变量控制,通过对doRewrite变量的复制来决定是否跳转以及跳转到哪个路径下
分享出来希望对大家有所帮助,不要再总是像我这样调了一晚上的重定向循环……