关于 Nginx 配置的一些疑惑

2015-03-04 09:53:44 +08:00
 nameldk

网站目录结构如下:
/public/en.html
/public/zh_cn.html
/public/index.php

之前所有的非静态资源请求都交给 index.php
现在要把首页的请求 不走PHP了,提高下网站性能。Nginx会根据cookie值 lang=en 直接返回en.html 根据 lang=zh_cn 直接返回 zh_cn.html。如果没有cookie的话,默认返回 zh_cn.html.
首页请求地址有3个,分别为:
/
/index
/index/index
求Nginx 配置。
现在的Ngxin配置如下:
location / {
index index.php;
if ($http_cookie ~* "lang=en"){
rewrite ^/$ /en.html;
rewrite /index /en.html;
rewrite /index/index /en.html;
}

if ($http_cookie ~* "lang=zh_cn"){
rewrite ^/$ /zh_cn.html;
rewrite /index /zh_cn.html;
rewrite /index/index /zh_cn.html;
}

root /www/wwwroot/public;
try_files $uri $uri/ /index.php?q=$uri&$args;
}

但是不好使啊,网上说 location里,if 和 try_files同时使用会有问题,http://wiki.nginx.org/IfIsEvil
搞了一天了,还是没整好,好郁闷。感觉到了瓶颈了。

6178 次点击
所在节点    NGINX
38 条回复
luw2007
2015-03-04 16:26:30 +08:00
nginx 模块limit_zone与limit_req_zone, 这个不知道效果如何, 楼主可以试试看(至少不用分析日志什么的)

@jarlyyn 上面那个模块应该适合你们那种. 资源限制.
jarlyyn
2015-03-04 16:38:08 +08:00
@luw2007
基本上很难判断出来哪个是垃圾攻击ip,哪个不是。日志我也分析过,频率都很低。我都怀疑是不是做了个隐藏iframe嵌在了某个访问量很大的网站里。
想想其实只有做js跳转+定期调整临时域名才相对靠谱点啊。
luw2007
2015-03-04 16:45:36 +08:00
@jarlyyn js跳转不解决你的问题, 毕竟图片路径在那里, nginx rewrite 替换掉图片路径中的父目录,让 之前的外链都死掉.
如果iframe , 看来源url就可以直到怎么过来的.
GuangXiN
2015-03-04 18:17:54 +08:00
不过PHP解释器是能提升不少性能的,我压过nginx,一个Hello world页面,如果后缀是.html不过PHP解器,能得到8000+ rps,如果改后缀名为.php过PHP解释器,就马上降到4900+rps
nameldk
2015-03-04 23:18:29 +08:00
@jarlyyn 之前也用过Yii,现在感觉有点重,启动个框架就加载好多文件。感觉文件缓存要比redis缓存强,之前项目里实践过。缓存 内存级xcache>文件>redis. redis的话还得来一次连接,当然也可以做长连接,但远没文件高效。
@luw2007 没有做过日志的IP分析,不过运维同学说IP很多,满世界都有,有段时间攻击较猛烈加速乐都扛不住了,直接不扛了,把请求直接丢给我们了,于是我们就挂了。
现在的做法还是拿程序生成静态页,到Nginx直接丢静态页面。
nameldk
2015-03-04 23:24:59 +08:00
@jarlyyn 我们受的攻击都是直接上G的。。
luw2007
2015-03-04 23:40:09 +08:00
@nameldk 求域名,帮看看。
nameldk
2015-03-05 09:32:08 +08:00
luw2007
2015-03-05 10:16:22 +08:00
@nameldk 看上去目前访问还行. 静态资源都分到二级域名了.

让运维同学看日志, 确认正常用户的访问阀值. 设置下 模块limit_zone与limit_req_zone,
测试机器上用压力测试工具跑下压力看看.
jarlyyn
2015-03-05 11:24:12 +08:00
@nameldk Yii本来就很重,我改的模块后就更重了,这个不提了……
redis需要链接那就是php本身的锅了,要不换nodejs?
感觉要优化自然是哪里不足优化哪里了。
相对而言,php本身应该只影响到内存和cpu占用。且不说个人认为这不是最大的瓶颈。这往往也是最好解决的方案,大不了内网多几个服务器,做一个负载均衡就可以了。
而之所以我觉得觉得cookie不美。
除了cookie需要更多的解析/处理步骤,逻辑更复杂外。
我最喜欢的多语言版本切换是通过域名来的。
哪怕是在同一个服务器。
这样在dns这一步就可以开始分流了。
都仅仅是个人意见,肯定没有受到攻击的你了解清楚。

而且说实话,打首页我觉得毫无价值,首页是最容易缓存的地方。
真的要打,打搜索,登录,忘记密码之类,ip多的时候才真心蛋疼。
desperatecat
2015-03-05 11:24:40 +08:00
nameldk
2015-03-05 23:34:55 +08:00
@jarlyyn 不知道对方是怎么想的,一直打的首页,可能首页的链接地址不会变,可能是其他原因。因为首页打不开,其他的页面部分是可以访问的。多语言版本当初没想太多,只是觉得cookie简单,种个cookie方便记住用户的选择。域名的话感觉让不同的模块瞳子域名比较合适。
@luw2007 回头看下,个人对Nginx的各种模块不是太熟,这回可以好好看看。。
@desperatecat 这个是正则表达式不严谨的问题。。。

@ryd994 之前没用过map,这个指令不错,感觉可以代替if。但是为啥rewrite后 首页会404了
rewrite ^/$ $index_name; 还有rewrite和try_files同时用没问题吧?
我想 map 根据cookie确定首页lang,通过rewrite 首页 指向静态页。再通过 try_files 把其他请求丢给index.php
ryd994
2015-03-05 23:53:24 +08:00
@nameldk 是因为$index_name没有开头的/吧,看errorlog
没试过rewrite和try_files同时用,一般没必要
单独给首页开个location会好点
location = / 这样就会只精确匹配首页了
ryd994
2015-03-05 23:57:19 +08:00
@nameldk 还有,最重要的:缓存做了没有?频率限制作了没有?这两条没做,怎么优化都不会有用。
nameldk
2015-03-06 19:09:07 +08:00
@ryd994 确实是开头没写/,看errlog发现了。

同时发现了个Nginx比较好的教程: http://blog.sina.com.cn/s/articlelist_1834459124_0_1.html
ryd994
2015-03-06 19:26:29 +08:00
@nameldk 这个我以前看过,作为入门是不错,对于语法和变量。
agentzh就是rewrite模块的主要作者,lua模块也有很多贡献,是大牛。
不过现在再看,其实感觉这两个模块于Nginx哲学其实不太合拍(纯静态,纯声明)。
作为Nginx功能的补充很好,对于cdn之类的应用非常有用,但过度依赖就会出问题。

指令执行顺序什么的不必太纠结,不要钻这个牛角尖。如果你发现你需要纠结指令执行顺序的话,说明这个工作实际并不适合nginx(尽管可以写出来,而且性能很不错,但是有其他更方便的解)。熟悉执行阶段的关系的话,可以快速排除一些不切实际的想法,而不是写了半天配置就是不行。

如果你英文过得去的话,我最建议的还是官方文档:
http://nginx.org/en/docs/beginners_guide.html
http://nginx.com/resources/admin-guide/
看过之后就能写出不错的配置。要进一步调优就去啃reference里用到的模块的所有指令好了。
nameldk
2015-03-07 11:15:29 +08:00
@ryd994 感谢!
最终搞好了:
1. nginx.conf 中的http 块添加:
map $cookie_lang $page_lang {
zh_cn zh_cn.html;
zh_tw zh_tw.html;
en en.html;
default en.html;
}
2.
location / {
index index.php;
root /www/wwwroot/public;

rewrite ^/index/index$ /${page_lang};
rewrite ^/index$ /${page_lang};
rewrite ^/$ /${page_lang};

try_files $uri $uri/ /index.php?q=$uri&$args;
}
其实配置挺简单的
最关键的还是变量的处理,用map代替了if,之前一直不知道有map。
取cookie的值可以用 $cookie_变量名。
写rewrite时 正则要严谨。
尽量不用if 挺坑。
luw2007
2015-03-23 15:29:07 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/174324

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX