关于 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
搞了一天了,还是没整好,好郁闷。感觉到了瓶颈了。

6198 次点击
所在节点    NGINX
38 条回复
invite
2015-03-04 10:31:43 +08:00
这种设计,完全就是渣。
mahone3297
2015-03-04 10:58:47 +08:00
单一入口不是很好?。。。性能能提高多少?你遇到性能问题了?
wingoo
2015-03-04 11:09:49 +08:00
这叫臆想中的性能问题
nameldk
2015-03-04 11:29:17 +08:00
这样做的目的是让首页不走PHP了,减少PHP请求,不啥不对呢?
nameldk
2015-03-04 11:34:02 +08:00
@invite 求不渣设计。
@mahone3297 单一入口是不错,现在就是单一入口。不过不是得经过PHP么,现在不想走了。只为遇到攻击,首页请求很频繁,所以才想让Nginx直接吐静态页了。
invite
2015-03-04 11:40:27 +08:00
@nameldk 你的cookie谁来生成?生成cookie的时间,顺带location已经够了。

而且遇到攻击,靠这点来减缓,基本跟没有一样。

先判断cookie,set变量,在try_files里用变量。
jarlyyn
2015-03-04 11:50:02 +08:00
@nameldk 个人觉得,减少php请求意义不大,因为一般瓶颈不在php上,网速/mysql的压力会更大。php的话开个apc预编译基本不会是瓶颈。
更靠谱的是在php里耗时/mysql的地方做缓存。

而且个人意见,觉得语言信息靠cookie有点不太符合我的审美。
invite
2015-03-04 12:28:09 +08:00
@jarlyyn

@nameldk 而且按这个配置,所有404页面都请求到了index.php,哪来什么攻击防范功能。
sophymax
2015-03-04 12:59:57 +08:00
这种场景你去搜下ngx_lua模块,需要重新编译nginx ,最近很多问题都是它解决的,好吧,我们只是不喜欢nginx配置的蛋疼语法而已,http://wiki.nginx.org/HttpLuaModule
qq286735628
2015-03-04 14:13:55 +08:00
index参数里面,你在index.php前面加一个index.html,这样就不默认先请求index.html,没有才会请求index.php
ryd994
2015-03-04 14:28:24 +08:00
If is evil,官方已经多次强调过了。能不用就不用。
另外我比较喜欢利用header判断,然后302。这样会更符合http规范,如果错了,用户依然可以手动改回去。网页里的链接全部指向相同语言的对应页面,也就是说不同语言不同入口,不知道这个对你来说会不会很难实现。
但是即使用cookie也是类似的。用cookie代替header,用try_files代替rewrite而已。Well, you know the pattern.

map ${http_accept_language} ${index_name} {
~^zh.* zh_cn.html;
~^en.* en.html;
default en.html;
}
location / {
rewrite ^(.*)$ /${1}/${index_name}.html redirect;
}

未测试,但是思路应该没大问题。
效果参考: http://www.crystalacg.com/help会根据使用的系统转向help-win或help-mac

其实我是因为本来网站全静态不想引入动态内容罢了。如果你已经是用PHP的话我建议你继续用,这点成本应该不是瓶颈。做个timing看看哪里消耗最多和最值得优化吧。
ryd994
2015-03-04 14:35:33 +08:00
首页请求频繁,你应当考虑的是如何缓存和如何限制不正常请求频率。遇到攻击应该研究安全设置。判断语言这点消耗,说白了是O(1)的,能有多少?哪怕你不判断语言,把这部分完全去掉,人家加一台肉鸡也就补上了。

@sophymax Nginx配置文件本来就是配置文件,而非脚本语言。是declarative而不是imperative。这一点搞错了当然会不顺手。
nameldk
2015-03-04 15:01:05 +08:00
@jarlyyn mysql 的查询有缓存的,首页如果直接抛静态页面,就是不想再连mysql redis。
语言信息不靠cookie就在url体现吧,差别不大吧,只是展现形式不同。
luw2007
2015-03-04 15:16:45 +08:00
@nameldk @jarlyyn

首先做的是分析日志, 直接iptables 禁止攻击ip访问.
1. 分析nginx的日志, 看看那些ip 短时间大量访问, 通过简单的linux命令行工具, awk, sort, uniq 就可以统计ip了. 阻止掉前十个ip基本就能保住了
iptables -A INPUT -s XX.XX.XX.XX -j DROP
2. 如果不会看日志怎么办, 发给我吧,免费分析.

解决不掉攻击源的情况下
1. 配置一个中文页, 等攻击过去. 英文页面纯粹是一般只是为了提升公司的颜值.
2. 如果一个静态页面还抗不住, 怎么折腾都没辙, 技术上搞不定就给黑客掏钱吧.
3. 黑客不要钱, 就找运营商看看能不能收费帮你们抗住流量.
4. 运营商要价高, 那就就把域名指向baidu, 让他攻击吧.


服务器调整优化:
如果是自己的vps, 调优tcp 相关的系统参数 ulimit , backlog 之类的, 网上很多.

至于优化nginx 等攻击完了再说吧. 临时改配置没多大作用.
毕竟你总有页面访问慢. 找到了,继续攻击之.

优化可以看看 @ryd994 写的.
nameldk
2015-03-04 15:37:45 +08:00
@luw2007 做这个的根源还是为了防DDOS,网站被打的很厉害,扛不住了就切加速乐了。ip的话很多,肉鸡太多,有次貌似在在加速乐上还是一直打不开。网站已受到了攻击者的敲诈。
xiaoyaoking
2015-03-04 15:42:43 +08:00
@nameldk ddos 打的不是ip么?
luw2007
2015-03-04 16:13:43 +08:00
肉鸡多不是关键. 分析日志照样可以挡住他的ip.
你先全站只放一个首页吧. 接下来的事情就是看idc了.
最大的问题:
@xiaoyaoking idc的网络带宽才是问题吧, ddos 占满带宽, idc会直接拔网线.
jarlyyn
2015-03-04 16:14:44 +08:00
@nameldk 缓存又不是只有mysql,redis.
直接存成文件也可以啊,和nginx跑比可能也就是多跑了遍php而已。
说实话,真的是文件还未必比从redis里取快吧?
我也被攻击过。被攻击的时候最怕的就是带宽跑满。
http://v2ex.com/t/145842#reply80
你的index.php总不可能比yii+我写的一堆到处套的模块重吧?
有缓存的话mysql根本没压力的。
哪怕是文件缓存,就算阿里云的烂IO也是妥妥的。
jarlyyn
2015-03-04 16:17:50 +08:00
@luw2007 我上次被人打是refnece为网站首页,行为为下载首页所有图片,一天9000多ip的攻击。
http://v2ex.com/t/145842
luw2007
2015-03-04 16:20:08 +08:00
nginx + 静态文件 抗攻击还是可以的.
前提是vps配置的当. 不然一个1024 can not open files 就让你崩溃.

@jarlyyn 能做的就是拼封ip的速度, 如果可以分钟级别封ip, 剩下的就是看idc了.
至于正常业务, 攻击了之下肯定用不了, 赶紧切换个备用域名/服务器 临时用着.

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

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

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

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

© 2021 V2EX