Siroh 发表于 2016-03-03 00:01

Web 服务器实战笔记:Nginx + PHP-FPM + MariaDB in Jail

本帖最后由 fender0107401 于 2016-03-03 09:57 编辑

根据本人实际安装服务器过程,新增一篇 Wiki,欢迎指正交流。

运行某基于 php + mysql 的 CMS 系统提供新闻等内容服务,无论坛等互动功能。

主要思路:


FreeBSD:笔者熟悉,zfs 提供数据容错和读取并发性能,jial 提供隔离环境

ZFS-Mirror:获得数据的容错性,并利用快照功能进行备份、恢复和回滚

Jail:隔离Web服务软件环境

sshd:只允许密钥登录

sftp:取代ftp,提供安全上传环境

ipfw:防火墙提供网络安全

nginx + php-fpm + mariadb:提供web服务,独立 php 池

awstats:定时运行生成静态页面提供访问分析

全部采用 pkg 安装官方包,方便日后维护

详细内容见请前往:FreeBSD China Wiki

lsstarboy 发表于 2016-03-03 16:52

支持一下楼主,写的很不错!

里面有几个小问题,我仔细斟酌一下再说。

shang2010 发表于 2016-03-03 20:51

sftp:取代ftp,提供安全上传环境


这个可以取消了,教你一个大招
http://blog.chinaunix.net/uid-20685819-id-5195708.html

lsstarboy 发表于 2016-03-04 11:19

以下内容仅代表个人意见,仅供参考:

1、ipfw部分有几个地方最好稍微改一下:
   (1)服务器尽量不要用keep-state,稍微繁忙一点就会受不了,如果真想用状态规则,必须调整最大上限net.inet.ip.fw.dyn_max,默认的实在是太小了。
   (2)icmp部分,只允许type 0,8即可,基于icmp攻击的是很常见的。
   (3)log部分可以加大一些,5条太少了,如果想做分析用,至少要十万级别,并且要定时重置,不重置的话,后几天的日志里可能会没有数据。

2、php-fpm配置部分感觉有点多余,示例就不错了,php一般不做虚拟机,新建一个目录应该没多大必要,反倒nginx使用虚拟机的机率大一些,像某些Linux发行版那样新建一个vhost目录是一个不错的主意。另外FreeBSD的日志一般放在/var/log下面,一些Linux一般习惯放在/opt里。网站的根目录,我本人的习惯,更喜欢在根新建一个www目录

Siroh 发表于 2016-03-04 12:42

回复 3# shang2010


sftp 是给网站内容管理员使用的。使用 sftp 可以用 filezilla 等支持 sftp 的 FTP 图形客户端,对于计算机知识可怜的内容管理员来说方便操作,而且没有 FTP 明文传输的风险。

   

Siroh 发表于 2016-03-04 15:21

本帖最后由 Siroh 于 2016-03-04 15:24 编辑

lsstarboy 发表于 2016-03-04 11:19 static/image/common/back.gif
以下内容仅代表个人意见,仅供参考:

1、ipfw部分有几个地方最好稍微改一下:


谢谢您的指正。
1、关于 ipfw 的部分,的确如您所言,动态规则在大量访问的时候会产生性能问题。现已经修改为静态规则,敬请再次指教。log 只针对外连接,用于监控应用访问外部主机,只要是正常情况,记录量不会太大,而且通过 newsyslog.conf 来限制 log 文件的大小。
2、php-fpm 连接池隔离,主要考虑以后,在该台服务上可能另外存在两三个虚拟主机,防止这些虚拟主机 php 互相干扰。
3、我一般不同虚拟主机产生各自的 log,放在网站根目录的同级目录中。
4、我的原则是,不相信应用所声称的道德,能预防的,只要性能损失在可接受的范围内,一定加以预防。

lsstarboy 发表于 2016-03-04 18:08

看得出来你是非常认真严谨的,非常值得学习。

ipfw的规则中,logamount 0用起来很不错,还可以再进一步,把一些规则合并起来,这样可以减少规则数量,相对来说能提高点性能,比如对内的可以直接写:
ipfw add allow tcp from me to any 80,123,22,9922,443 in via $out-if

php-fpm隔离你考虑的很周道了,隔离也可以用chroot来做。

网站log放在根目录下才不安全,一不小心就会被下载到,日志类的东东,最好放在除了root都访问不到的地方。你的配置中,php的opendir是:php_admin_value['open_basedir'] = /opt/www/$pool ,虽然nginx指定的是root /opt/www/$server_name/html,但是用php的话,还是可以跑到/opt/www/domain_name.com里面的。
另外nginx配置中,还有几处都可以改为$server_name,配置会更通用。

lsstarboy 发表于 2016-03-04 18:14

另外关于log的问题,由于nginx原生不支持syslog(不知道现在是不是支持了,以前版本需要用第三方模块),日志属主也应该是www,也不是很安全。我的做法是在宿主机上用nginx做反向代理,分发到各虚拟机,这样访问信息就记录到宿主机中,虚拟机中只记录error就可以了。而且宿主机上可以做一定的日志检查规则,同时触发防火墙,来过滤掉一些明显的攻击行为,同时还可以加上一级小缓存。

Siroh 发表于 2016-03-04 22:16

回复 7# lsstarboy

感谢指正。

1、也考虑过 ipfw 合并端口写规则,后来还是决定分开写,用 ipfw -a list 显示个符合各规则的包数量,可以为异常流量排查提供一些线索。性能上损失应该不大。
2、log 是与 html 同级的,不可能被下载的。
3、open_basedir 设置为 html 上级目录,是因为 hack 了 CMS 程序,把一些重要数据放到 html 目录之外,以防止被客户端下载。
4、nginx 配置可以用 $server_name 的地方都用了,是实际验证过的。ssl_certificate、ssl_certificate_key、access_log、error_log 这几个地方是不能使用 $server_name 这种变量格式的。猜测 nginx 启动时就要这几个参数启用 ssl,打开日志,而这时候 server 还没有开始初始化,$server_name 不可用。
5、nginx 使用 syslogd 的问题,已经得到一些提示,在进一步学习研究之后再看。目前想到临时一个办法,在虚拟主机目录之外保存日志文件,这样 php 进程和 sftp 上传用户都不能读取和修改。

lsstarboy 发表于 2016-03-04 22:30

log和html是同级的没错,但是open_dir却是他俩共同的上一级,被PHP抓到的可能性很大。
$server_name 那几个我还真没验证过
6楼给的方法就是保存到虚拟机之,宿主机只有一个nginx,并且不需要多余的模块,被攻的可能性就很小了,相对来说还是比较安全的。
页: [1]
查看完整版本: Web 服务器实战笔记:Nginx + PHP-FPM + MariaDB in Jail