免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7200 | 回复: 11
打印 上一主题 下一主题

[FreeBSD] freebsd+nginx+php+mysql+zend系统优化防止ddos +傻瓜式ports安装 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-07 01:40 |只看该作者 |倒序浏览
http://blog.chinaunix.net/u2/68301/showart_1074584.html

原blog内容已经更新,请连接以上地址,查看最新内容。

[ 本帖最后由 terryfyp 于 2008-7-7 09:12 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-07-07 01:52 |只看该作者
前言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
#cd /usr/ports/databases/mysql51-server
#make WITH_CHARSET=gbk WITH_XCHARSET=all WITH_PROC_SCOPE_PTH=yes BUILD_OPTIMIZED=yes BUILD_STATIC=yes SKIP_DNS_CHECK=yes WITHOUT_INNODB=yes install clean
#cp /usr/local/share/mysql/my-large.cnf /etc/my.cnf
##mysql
的优化参数,也可以手动修改

#rehash
# mysql_install_db --user=mysql
##
初始化mysql

#/usr/local/bin/mysqld_safe &
##
启动mysql

#/usr/local/bin/mysqladmin -u root password 'newpass'
##
修改root密码,newpass是你需要改的密码

关闭mysql可以使用mysqladmin -uroot -p shutdown
3)
安装php
#cd /usr/ports/lang/php5
#make config
##
配置编译参数

[X] CLI        Build CLI version
[X] CGI        Build CGI version
[X] APACHE     Build Apache module
[ ] DEBUG      Enable debug
[X]] SUHOSIN Enable Suhosin protection system
[X] MULTIBYTE Enable zend multibyte support
[ ] IPV6       Enable ipv6 support
[ ] REDIRECT   Enable force-cgi-redirect support (CGI only)
[ ] DISCARD    Enable discard-path support (CGI only)
[X] FASTCGI    Enable fastcgi support (CGI only)
[X] PATHINFO   Enable path-info-check support (CGI only)
#make install clean
# cp /usr/local/etc/php.ini-dist /usr/local/etc/php.ini
##cp php.ini
配置文件

4)
安装php5-extensions
# cd /usr/ports/lang/php5-extensions/
#make config
Options for php5-extensions 1.1
-------------------------------------------------
[X] CURL
CURL support

[X] FTP        FTP support
[X] GD        
[X] GETTEXT
[X] MBSTRING multibyte string support

[X] MCRYPT
Encryption support

[X] MYSQL

[X] PCRE
Perl Compatible Regular Expression support
[ ] POSIX //
去掉.
[ ] SQLITE //去掉.

[X] ZIP
ZIP support
[X] ZLIB
# make install clean


5)
安装Zend Optimizer
#cd /usr/ports/devel/ZendOptimizer/
#make install clean
#vi /usr/local/etc/php.ini
#
插入zend的路径


[Zend]
zend_optimizer.optimization_level=15
zend_extension_manager.optimizer="/usr/local/lib/php/20060613-zts/Optimizer"
zend_extension_manager.optimizer_ts="/usr/local/lib/php/20060613-zts/Optimizer_TS"
zend_extension="/usr/local/lib/php/20060613-zts/ZendExtensionManager.so"
zend_extension_ts="/usr/local/lib/php/20060613-zts/ZendExtensionManager_TS.so"

小提示:安装zend,目前只有支持到php5.1.x,对于php5.2.x还不能支持,因为zend还没有为php5.2.x开发版本,在网上查了好多关于解决此类的问题,但得到的结果是,zend可以顺利安装,phpinfo也显示zend正常了,但程序无法调用,即zend没有工作,也就是目前无法解决,我想只有等到zend php5.2.x的版本后,才可以解决此问题,也希望哪位已经解决此类问题的兄弟,share一下你的经验。假如你非要使用zend,那就请你将php降到5.1.x,或者你不当心已经升级了ports,那建议你可以安装php4.x,毕竟目前php4.x还通用于大部分的环境
6)
安装nginx
#cd /usr/ports/www/nginx/
#make install
7)
安装lighttpd,为了得到fastcgi
# cd /usr/ports/www/lighttpd/
#make install
#rehash

配置nginx
#user   nobody
删除前面的注释#,改成 user   www


#log_format
main
'$remote_addr - $remote_user [$time_local] '

#
'"$request" $status $body_bytes_sent '

#
'"$http_referer" "$http_user_agent"';

log_format
main
'$remote_addr - $remote_user [$time_local] '


'"$request" $status $body_bytes_sent '


'"$http_referer" "$http_user_agent"';

##以上步骤,为了能够正常分析log的pv,hits,访问量,才设定的,默认的log格式,是无法准确分析出所需要的结果

location / {
    root    /usr/local/www/nginx;
    index    index.html index.htm;
}
在index.html前面添加一个index.php
location / {
    root    /data/web/www.jk0086.com/htdocs;
    index    index.php index.html index.htm;
}


#location ~ \.php$ {
#    fastcgi_pass    127.0.0.1:9000;
#           fastcgi_index   index.php;
#           fastcgi_param     SCRIPT_FILENAME     /scripts$fastcgi_script.name;
#    include      fastcgi_params;
#}
将前面的#去掉,修改为
location ~ \.php$ {
    fastcgi_pass    127.0.0.1:9000;
           fastcgi_index   index.php;
           fastcgi_param     SCRIPT_FILENAME     /usr/local/etc/nginx$fastcgi_script.name;
    include      fastcgi_params;
}
##去掉注释,其实就是激活了nginx的fastcgi功能,也说明了nginx本身就已经准备用于fastcgi的环境中


9)
配置spawn-fcgi,就是一个启动fastcgi命令,使得nginx可以通过9000端口访问(纯粹个人理解-_-
参数说明:监听127.0.0.19000端口,进程数为64(如果服务器内存小于3GB,可以只开启25个进程),用户为www
/usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www -g www -C 64 -f /usr/local/bin/php-cgi
10)
这边请注意启动顺序,先启动fastcgi,再启动nginx
Nginx.conf由于经常需要修改,即经常需要重启nginx,因此这边写了一个启动脚本,请查看:

论坛徽章:
0
3 [报告]
发表于 2008-07-07 01:54 |只看该作者
#!/usr/local/bin/bash
case $1 in
start)

/usr/local/sbin/nginx

;;
stop)

killall -9 nginx

;;
test)

nginx -t -c /usr/local/etc/nginx/nginx.conf

;;
restart)

ps auxww | grep nginx | grep master | awk '{print $2}' | xargs kill -HUP

;;
show)

ps -aux|grep nginx

;;
esac
保存为nginx.sh使用方法为:
nginx.sh start
#
启动nginx

nginx.sh stop
#
停止nginx

nginx.sh restart #重启nginx
nginx.sh test
#
测试nginx.conf的准确性

11)
安装phpMyAdmin
#cd /usr/ports/databases/phpmyadmin
#make install
#mv /usr/local/www/phpmyadmin /data/web/ www.jk0086.com/htdocs/
#cd /data/web/www.jk0086.com/htdocs/phpmyadmin
#vi config.inc.php
##
这边要说明一下,freebsd默认安装的phpmyadmin,里面配置文件有问题,需要手动修改,请修改成如下内容:

<?php



/* $Id: config.sample.inc.php 9689 2006-11-10 20:05:49Z nijel $ */

// vim: expandtab sw=4 ts=4 sts=4:



/**


* phpMyAdmin sample configuration, you can use it as base for



* manual configuration. For easier setup you can use scripts/setup.php



*



* All directives are explained in Documentation.html and on phpMyAdmin



* wiki <http://wiki.cihar.com>.



*/




/*


* This is needed for cookie based authentication to encrypt password in



* cookie



*/


$cfg['blowfish_secret'] = 'asdf:LKJ'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */



/*


* Servers configuration



*/


$i = 0;



/*


* First server



*/


$i++;

/* Authentication type */

$cfg['Servers'][$i]['auth_type'] = 'cookie';

/* Server parameters */

$cfg['Servers'][$i]['host'] = 'localhost';

$cfg['Servers'][$i]['connect_type'] = 'tcp';

$cfg['Servers'][$i]['compress'] = false;

/* Select mysqli if your server has it */

$cfg['Servers'][$i]['extension'] = 'mysql';

/* User for advanced features */

// $cfg['Servers'][$i]['controluser'] = 'pam';

// $cfg['Servers'][$i]['controlpass'] = 'pampasswd';

/* Advanced phpMyAdmin features */

// $cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';

// $cfg['Servers'][$i]['bookmarktable'] = 'pma_bookmark';

// $cfg['Servers'][$i]['relation'] = 'pma_relation';

// $cfg['Servers'][$i]['table_info'] = 'pma_table_info';

// $cfg['Servers'][$i]['table_coords'] = 'pma_table_coords';

// $cfg['Servers'][$i]['pdf_pages'] = 'pma_pdf_pages';

// $cfg['Servers'][$i]['column_info'] = 'pma_column_info';

// $cfg['Servers'][$i]['history'] = 'pma_history';

// $cfg['Servers'][$i]['designer_coords'] = 'pma_designer_coords';



/*


* End of servers configuration



*/




/*


* Directories for saving/loading files from server



*/


$cfg['UploadDir'] = '';

$cfg['SaveDir'] = '';



?>


以上只是一个配置文件,当你打开Phpmyadmin的时候,会提示你输入用户名密码,然后登陆数据库,相对比较安全的


三、系统优化+防止ddos
1)
这个话题有点大,我相信我做的只是其中很小的一部分,同时很多人也会问我,是不是要编译内核,这边的回答是不需要编译任何内核,只需要copy文件,然后重启一下服务器就可以了。
2)
加载文件修改
# vi /boot/loader.conf
#
加入如下文本

kern.dfldsiz="2147483648"
# Set the initial data size limit

kern.maxdsiz="2147483648"
# Set the max data size

kern.ipc.nmbclusters="0"
# Set the number of mbuf clusters

kern.ipc.nsfbufs="66560"
# Set the number of sendfile(2) bufs

##解释:
a.
第一,第二行主要是为了突破1G内存设置的
b.
第三行其实是bsd的一个bug,但系统并发达到一个数量级的时候,系统会crash,这个是非常糟糕的事情,所幸更改了这个参数后,在高并发的时候,基本可以没有类似情况,当然非常bt的情况,还得进一步想办法
c.
第四行是读取的文件数,如果你下载的文件比较大,且比较多,加大这个参数,是非常爽的

3)
Sysctl
修改
#vi /etc/rc.local
sysctl kern.ipc.maxsockets=100000
##
增加并发的socket,对于ddos很有用

sysctl kern.ipc.somaxconn=65535

##
打开文件数

sysctl net.inet.tcp.msl=2500
##timeout
时间



4)
通过上述的简单优化,会给你带来意外的惊喜,如果有兴趣的兄弟,可以尝试一下看看,绝无副作用。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
4 [报告]
发表于 2008-07-07 08:10 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2008-07-07 08:29 |只看该作者
nice

论坛徽章:
0
6 [报告]
发表于 2008-07-07 16:08 |只看该作者
学习了。。。。很强大

论坛徽章:
0
7 [报告]
发表于 2008-07-07 16:28 |只看该作者
谢谢 找机会尝试一下 做了个PDF文档方便下载阅读

freebsd+nginx+php+mysql+zend系统优化防止ddos +傻瓜式ports安装.pdf

125.84 KB, 下载次数: 135

论坛徽章:
0
8 [报告]
发表于 2008-07-07 21:33 |只看该作者
抱歉,我平时不怎么回帖和发帖的

但实在是怕误导初学者,所以我觉得还是大体说一下比较好

我没有指责楼主的意思,能跟大家分享心得,是一件值得鼓励的事情

楼主千万不要灰心,学习的过程中,我们都有这个阶段,过了就好了

我是真心说的


1. cd /usr/ports/net/cvsup-without-gui


如果是为了更新系统源码和ports树,没必要装cvsup了
系统内带了csup,所以直接

  1. csup -L 2 -h cvsup.freebsd.org /usr/share/examples/cvsup/ports-supfile
复制代码


即可

#cp /usr/local/share/mysql/my-large.cnf /etc/my.cnf


如果我没记错,从2007年10月末开始,mysql用户自定义配置文件的位置已经改为
/usr/local/etc/my.cnf

之前是不是我还真没试验过

这样很好,很规范:wink:

  1. # mysql_install_db --user=mysql
复制代码


这一步似乎没有必要


  1. #/usr/local/bin/mysqld_safe &
复制代码


欠妥吧?

在/etc/rc.conf中加入

mysql_enable="YES"

然后用

/usr/local/etc/rc.d/mysql-server start 来启动
/usr/local/etc/rc.d/mysql-server stop 来停止

是否会更好呢?

编译php5的时候

  1. [X] APACHE     Build Apache module
复制代码


可能会把apache也一块装上去了吧,没必要的,浪费时间



  1. [ ] REDIRECT   Enable force-cgi-redirect support (CGI only)
  2. [ ] DISCARD    Enable discard-path support (CGI only)

复制代码


这两个还是加上会比较好,尤其在fastcgi的时候,具体请参考官方php手册


  1. 10)
  2. 这边请注意启动顺序,先启动fastcgi,再启动nginx
  3. Nginx.conf由于经常需要修改,即经常需要重启nginx,因此这边写了一个启动脚本,请查看:
复制代码


如果你用ports安装了nginx服务
那为什么不用自带的更规范的启动脚本呢?


在/etc/rc.conf中加入

nginx_enable="YES"

用以下方式就可以控制三个动作了

/usr/local/etc/rc.d/nginx start | stop | restart



我个人认为,修改sysctl只能说是减缓被攻击的效果,并不能防止规模稍大的拒绝服务攻击

至于DDOS,只听说过,没有见过



其他得太乱,实在是看不动了Orz...

既然是一篇howto式的心得,我觉得还是尽量将每一个部分写的比较透彻和符合系统规范比较好

一来不会误导入门学者,二来也算是对FreeBSD贡献者的一份尊重(你可以想象自己设计的功能却被用户用错或根本不用是多么无奈阿)。



楼主的精神是值得鼓励的,希望下个版本能更周到全面

论坛徽章:
0
9 [报告]
发表于 2008-07-07 22:39 |只看该作者
非常感谢YouRDj 的指点
1.如果是为了更新系统源码和ports树,没必要装cvsup了
系统内带了csup,所以直接

这个纯粹个人习惯而已,因为
csup -L 2 -h cvsup.freebsd.org /usr/share/examples/cvsup/ports-supfile
以上命令,刚出来的时候,我用过,发现经常失败,才转而用我上面的方法,现在我相信已经改善了,但习惯已经养成了。

2.my.cnf的文件,应该是疏忽了,应该是放在/usr/local/etc/my.cnf
   依据在:mysqld_safe的脚本里面写到:
  MY_BASEDIR_VERSION=/usr/local

   $MY_BASEDIR_VERSION/etc/my.cnf

3.[X] APACHE     Build Apache module这个确实不应该
4.关于用bsd系统自带的脚本,这点我承认这个方式非常的好,但因为小弟一开始是搞redhat的,然后发现freebsd下面很多脚本,不是很好用,因此逐渐用自己的脚本的,另外自己的脚本,在批量管理服务器的时候,分发比较方便。
启动脚本也习惯放在rc.local下面,理由是,假如你既有redhat,又有freebsd的时候,这个就可以写成通用的启动脚本。
写在rc.conf里面,在批量分发脚本的时候,小弟胆小,怕把里面的ip地址给挤掉了,我就要奔机房了。而放在rc.local里面,个人感觉比较安全和踏实一点。
5.关于防止ddos的,这点我还是比较有信心的,首先确认好YouRDj兄弟是否测试过,如果没有,请测试一下后告诉我。而我这边可以告诉你,我测试过,效果非常的卓越,当然没有集群,这个优化也不见得有效果


6.错误的地方,已经在blog上更改好了。


最后非常感谢给我的宝贵意见,愿你工作愉快!!


[ 本帖最后由 terryfyp 于 2008-7-7 23:23 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2008-07-09 08:10 |只看该作者
很好,东西收了。不过在优化方面LZ似乎还有很长的路要走。

再有,优化这个词很敏感,如此简单的傻瓜式说明会让很多新手直接照搬,不幸的是如此照搬一般情况下会导致问题。
还是我那句话——应用需要决定生产环境,运行状态决定优化参数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP