Nginx

关于大型论坛系统环境搭建(20万日IP负载平衡实战)–Nginx+Apache2+PHP+MySQL

栏目:安装与配置 , 技巧与优化 , 负载平衡      1,049 views

测试环境:理想论坛(55188).
理想论坛为国内人气最旺的股票论坛,注册会员已超过100万,并以每月60000人的速度稳定递增,每日页面访问量超过200万,并保持稳定增长的趋势,60分钟在线平均约2万多人,最高记录3万3千多。 目前主题超过30万,帖子接近1千万,数据库大小5.8GB,附件总大小大约150GB
之前理想论坛有三台服务器,两台WEB服务器以及一台数据库服务器,访问已经渐渐出现瓶颈,在猪头的建议下,站长决定增加一台服务器放数据库,另外三台做WEB,并且对原有的服务器的操作系统进行升级。
硬件具体情况
MySQL服务器: DualXeon 5335/8GB内存/73G SAS硬盘(RAID0+1)/CentOS5.1-x86_64/MySQL5
三台WEB服务器如下:
N1. Dual Xeon 3.0 2GB 内存
N1. Dual Xeon 3.0 4GB 内存
N1. Dual Xeon 3.0(双核) 4G内存
另外有三块300G的SCSI硬盘准备做RAID5,用来存放附件,四台机器通过内网连接

猪头考虑过的解决方案如下:
1. ZEUS + PHP5 + eAccelerator
2. squid + Apache2 + PHP + eAccelerator
3. nginx + PHP(fastcgi) + eAccelerator
4. nginx + Apache2 + PHP + eAccelerator

标签:

栏目:安装与配置 , 技巧与优化      826 views

nginx的默认虚拟主机在用户通过IP访问,或者通过未设置的域名访问(比如有人把他自己的域名指向了你的ip)的时候生效

最关键的一点事,在server的设置里面添加这一行:
listen       80 default;
后面的default参数表示这个是默认虚拟主机。

这个设置非常有用。
比如别人通过ip或者未知域名访问你的网站的时候,你希望禁止显示任何有效内容,可以给他返回500.
目前国内很多机房都要求网站主关闭空主机头,防止未备案的域名指向过来造成麻烦。就可以这样设置:
server {
listen       80 default;
return 500;
}

也可以把这些流量收集起来,导入到自己的网站,只要做以下跳转设置就可以:
server {
listen       80 default;
rewrite ^(.*) http://www.myip.net permanent;
}

栏目:安装与配置      1,258 views

前言
1.    看了张宴的《linux版本的Nginx 0.5.33 + PHP 5.2.5》后,马上找了一台服务器测试了一下,然后加了一个线上的discuz的论坛跑了一下,性能非常的卓越,感叹搜遍整个互联网,就是nginx+php唯一的一篇文档。对于他的文档,我认为:写的非常专业,对于php extensions库也分析的非常透彻。但是一篇专业的文档,也存在一些专业带来的麻烦,就是起点有点高,假如要更新里面的软件包和定义自己的目录,势必需要一点波折。另外不知道为何,最近网站老是打不开。情急之下,小弟重新写了一篇freebsd下面的傻瓜式安装文档。
2.    又结合了平时的一些经验,顺便把如何防卸ddos,并通过对系统的优化,如何来进一步提高nginx的并发数做 一些详解。
3.    由于个人能力有限,错误的地方,还请读者谅解

一、安装软件前的准备
系统的安装:插入freebsd6.2以上的光盘,最小化安装系统,同时安装好ports
二、手动安装nginx+php
1)        进入系统后,准备cvs更新:
1.       cd /usr/ports/net/cvsup-without-gui
2.       cp /usr/share/examples/cvsup/ports-supfile /etc/ports-supfile
3.       # vi /etc/ports-supfile
将其中的#*default host=CHANGE_THIS.FreeBSD.org一行改为
*default host=cvsup4.FreeBSDchina.org
4.       更新ports
/usr/local/bin/cvsup -g -L 2 /etc/ports-supfile
2)        安装mysql

栏目:系统安全      414 views

漏洞描述:
nginx容易引起缓冲区溢出漏洞,因为该应用程序没有对用户提交的数据进行边界检查,攻击者可以利用这个安全漏洞使得受影响的程序执行任意代码,如果代码执行失败,将导致拒绝服务。

利用代码:
暂未提供

影响版本:

nginx 0.8.14
nginx 0.7.61
nginx 0.6.38
nginx 0.5.37
nginx 0

不受影响:

nginx 0.8.15
nginx 0.7.62
nginx 0.6.39
nginx 0.5.38

解决方案

栏目:系统安全 , 访问控制      384 views

在windows+iis下,可以设置上传目录,类似:upload,uploadfile,attachments,这样的目录下面无脚本执行权限,从而防止非法用户上传脚本得到webshell
nginx上也很简单,我们使用location。。如下:

location ~ ^/upload/.*/.(php|php5)$
{
deny all;
}

其中upload换为你要设置的目录名字

这条规则的含义是匹配请求连接中开头是/upload/,中间匹配任意字符,结尾匹配.php或者.php5的页面,最后利用deny all禁止访问,这样就防止了上传目录的脚本执行权限

标签: 上传 , 权限 , 目录

栏目:系统安全 , 访问控制      583 views

nginx在80端口接受到访问请求后,会把请求转发给9000端口的php-cgi进行处理

而如果修改php.ini中open_basedir= ../../../../../ ,针对两个不同的网站,www.a.com , www.b.com都会把请求发送给9000处理,而如果先访问www.a.com那么../../../../../就会变成A网站的根目录地址,然后这时候如果你访问www.b.com,那么open_basedir仍然是A网站的根目录,但是对于B来说,又是不允许访问的,所以就造成了,第二个站点打开以后会出现no input files,那么有什么解决办法呢?

我们可以把不同的虚拟主机发送到不同的php-cgi端口进行处理,当然响应的php-fpm配置文件中的open_basedir也不同。。我们来看看怎么配置。。

栏目:系统安全 , 访问控制      512 views

Nginx的使用者最近越来越多,很多大型网站也都从Apache或其他平台迁移到了Nginx。但在我使用Nginx的过程中有个问题一直未得到解决,就是如何限制Nginx+PHP的目录权限。

我们知道,在Apache中可以很容易的对虚拟目录进行权限控制,如:
程序代码 程序代码

<VirtualHost www.xpb.cn>
ServerAdmin xiaopb@live.com
DocumentRoot /usr/www/xpb/
ServerName www.xpb.cn:80
ServerAlias www.xpb.cn
ErrorLog logs/default-error_log
php_admin_value open_basedir “/tmp/:/usr/www/xpb/”
</VirtualHost>

关键是后面的这句php_admin_value,这样就限制了php的操作目录仅限于/tmp/和/usr/www/xpb/这两个目录了。对于 Apache虚拟主机来说,这个设置十分有用,结合在php.ini中禁用一些php函数,几乎可以杜绝PHP木马对其他站点及系统的危害。我虽没专业做过Linux下的虚拟主机,但相信各大虚拟主机商也是这么做的。

看来对于Apache最好的办法还是使用“在php.ini中禁用一些危险的php函数和在Apache虚拟主机中配置php_admin_value”的方式来做虚拟主机的安全。

关于Nginx的配置文件,参考了很多资料,好像是不支持php_admin_value open_basedir,也就是Nginx暂时还没有 Apache的 php_myadmin_value这类的设置。如果用Nginx做虚拟主机,各用户之间的目录安全控制如何来做呢?网上很多人说,限制上传文件类型,做好程序安全不就行了么?对,对于自己的站点来说这样完全可以。但如果虚拟主机是给别人用的,又给予了FTP权限,总不能不让人上传php 文件吧。参考以上,如果用Nginx来做虚拟主机,目前看来安全的配置方法是

栏目:技巧与优化      344 views

出现的现象是这样:
本来请求 http://www.mydomain.com/admin/pages,在未登录时会执行 redirect_to “/login”,预期应该会跳转到 http://www.mydomain.com/login 这个URL
而在nginx服务器上却会跳转到 http://mydomain.com/login

原来是nginx的server_name设置主机名与别名的位置搞混了,原先的设置是:
server_name  mydomain.com www.mydomain.com;

正确的设置应该是主机名在前,别名在后:
server_name  www.mydomain.com mydomain.com;

根据观察是因为当nginx处理别名主机的请求时,遇到redirect请求时会附加上主机名,而不是像apache那样保持别名访问。

栏目:负载平衡      648 views

所以初步认为Nginx 比 Apache 负载高10倍是成立的。

然后反复在A B 上同时对C 进行ab -c 50000的压力测试,以模拟小规模的DDOS,结果C的负载能力不降反升,最高去到:
Requests per second:    4678.65 [#/sec] (mean)

最后连上在另一台不同网络的、装有Apache 的机器D上加入ab测试行列 ,却发现结果差很远:
Requests per second:    67.65 [#/sec] (mean)
Time per request:       1478.174 [ms] (mean)

看来ab的测试结果是非常依赖于网络速度,不是很靠谱。
在几台服务器的ab压力下,C系统的资源占用并无明显变化,在测试期间不断刷新测试页观察也没有排队等待的感觉,可见Nginx的确货美价廉。

用A上装了webbench来测试C的并发抗压能力,一边在C上tail -F access.log 来观察,从500到5000的30秒并发都没有问题,发现在测试50000并发时突然出现一片400记录,刷新C的测试页面发现正常,反而是A连不上了。。。一看终端的记录,A上的负载是:
load average: 16717.43, 13663.81, 6606.39
而C的负载不超过个位数

栏目:负载平衡      437 views

下午上班,把楼上的单子给做了,没多少事情,于是给昨天上的ESXi备机做个简单的测试。主要是想考量一下虚拟网卡的性能。

ESXi上跑三个系统两个centos4.6和一个2K3。2K3没参加测试,只是开着,一台linux做web,另一台用webbench发起测试。web环境为nginx+php-fpm。

第一次测试100个并发,请求一个phpinfo()调用的PHP文件。ESXi HOSTCPU基本满了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值