免费注册 查看新帖 |

Chinaunix

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

[OpenBSD] [原创]OpenBSD.Nginx.MySQL.PHP环境搭建手册[第二版] [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-12 14:13 |只看该作者 |正序浏览


前言

=====================================================

感谢ChinaUnix以及ChinaUnix论坛中的众多高手,在这里学到了很多!

本手册是O.N.M.P.系列的第二版,在第一版手册中,只是简单的说明了O.N.M.P.环境的基本搭建方法,并没有过多的考虑到生产系统适用的情况。第二版将作较大的修正,以使得本手册可以对生产环境的搭建起到有益的参考作用。

本人水平有限,手册中出现纰漏在所难免,您若在生产实际中应用时发现有什么问题,或者有什么更好的建议,请移步至ChinaUnix论坛的BSD版,或至偶的个人博客(http://onmp.cublog.cn),跟帖进行指正。希望在大家的共同努力下,能够把本手册尽量做到完美!

本手册以在OpenBSD 4.4环境下搭建Nginx、MySQL、PHP环境为例进行讲解。按照惯例,root权限。

=====================================================

目录

一、OpenBSD的安装及注意事项
二、系统性能调优

Ⅰ、/etc/fstab调优
Ⅱ、/etc/sysctl.conf调优

三、O.N.M.P.软件环境的安装
四、Nginx配置

Ⅰ、Nginx配置文件的修改
Ⅱ、Nginx日志截断

五、MySQL与phpMyAdmin的配置
Ⅰ、MySQL的配置
Ⅱ、phpMyAdmin的配置

六、强化PHP的安全
七、强化SSH的安全

Ⅰ、SSH配置文件的修改
Ⅱ、使用KEY进行验证
Ⅲ、按需启动SSH
Ⅳ、一点安全小常识

八、启用Packet Filter防火墙
九、系统启动脚本的修改


=====================================================

一、OpenBSD的安装及注意事项

OpenBSD的安装这里就不多说了,主要是安装时系统组件的选择、分区和系统服务的部分。对于系统组件部分,作为生产系统来说,偶并不推荐安装comp44.tgz这个组件。因为comp44.tgz实际就是编译器,不装这个,可以在很大程度上避免安装一些非授权的软件,从而提高远程主机的安全性。如果真的需要安装什么软件,也可以在非重要的机器上进行编译,然后使用PSFTP等软件上传到远程主机上使用。关于PSFTP软件的使用,二楼有详细的介绍。

系统分区时,推荐将/usr、/usr/local、/var、/var/mysql、/var/mail、/var/log、/var/nginx等分区单独分出来,也就是说,进行比较细致的分区,防止某个目录中的文件膨胀占满整个分区导致的死锁等问题。假定你有一个80G的硬盘,一个分区示例在下面:

/200M
(swap)1G
/tmp200M
/usr500M
/usr/local200M
/var100M
/var/mysql10G
/var/mail100M
/var/log5G~10G
/home200M
/var/nginx剩余空间


至于系统服务部分,建议所有的服务都选择“n”,亦即不随系统启动。

二、系统性能调优

对于多核的机器,使用bsd.mp这个核心。
  1. mv /bsd /obsd
  2. mv /bsd.mp /bsd
复制代码
Ⅰ、/etc/fstab调优
  1. vi /etc/fstab
复制代码
在文件系统描述符部分,加入"noatime"和"softdep"。示例如下:

/dev/wd0a / ffs rw,noatime,softdep 1 1
/dev/wd0l /home ffs rw,nodev,nosuid,noatime,softdep 1 2
/dev/wd0d /tmp ffs rw,nodev,nosuid,noatime,softdep 1 2
/dev/wd0e /usr ffs rw,nodev,noatime,softdep 1 2
/dev/wd0f /usr/local ffs rw,nodev,noatime,softdep 1 2
/dev/wd0g /var ffs rw,nodev,nosuid,noatime,softdep 1 2
/dev/wd0i /var/log ffs rw,nodev,nosuid,noatime,softdep 1 2
/dev/wd0j /var/mail ffs rw,nodev,nosuid,noatime,softdep 1 2
/dev/wd0h /var/mysql ffs rw,nodev,nosuid,noatime,softdep 1 2
/dev/wd0k /var/nginx ffs rw,nodev,nosuid,noatime,softdep 1 2


友情提醒:softdep是一种非同步的文件系统,意外掉电可能造成数据的遗失/损坏,生产系统请谨慎使用!

改完后保存退出,reboot,看能不能正常启动。

一般情况下是没有问题的,个别机器或虚拟机可能会因为兼容性的缘故,无法启动。那么就把根目录的softdep拿掉,其他目录保留,仍然会有作用。

更多关于OpenBSD环境下磁盘性能调优的内容,请参看偶博客的文章,地址在下面:
http://blog.chinaunix.net/u2/81136/showart_1841280.html

Ⅱ、/etc/sysctl.conf调优
  1. vi /etc/sysctl.conf
复制代码
跳到最后,加入下面的内容:

# 增大文件系统缓存到1M
kern.maxvnodes=131072

# 允许最多65536个进程
kern.maxproc=65536

# 同时最多打开65536个文件
kern.maxfiles=65536

# 并发连接最大65536
kern.somaxconn=65536

# 保留的最少连接数
kern.sominconn=256
kern.maxclusters=32768

# 增大TCP接收/发送缓存到64K
net.inet.tcp.recvspace=65536
net.inet.tcp.sendspace=65536

# 增大UDP接收/发送缓存到64K
net.inet.udp.recvspace=65536
net.inet.udp.sendspace=65536


注意:虚拟机测试只加最上面一行kern.maxvnodes=65536即可,其他的不必加了,否则会有各种问题。独立机器的可以加上。

保存退出,reboot。不能正常启动的就把除kern.maxvnodes以外的数字调小或者禁用再试。

三、OpenBSD.Nginx.MySQL.PHP软件环境的安装

OpenBSD环境下软件的安装是非常简单的,因为在官方的ftp中提供了已经编译好的二进制包,需要安装的软件都在ftp中,从ftp中安装即可。

小提示:如果你机器比较多,你可以把需要安装的软件包都down回来,其他机器再来这里安装,速度会非常快!
  1. export PKG_PATH=ftp://ftp.openbsd.org/pub/OpenBSD/4.4/packages/i386/

  2. pkg_add mysql-server php5-fastcgi php5-gd-5.2.6-no_x11 phpMyAdmin lighttpd-1.4.19p3 nginx pecl-APC
复制代码
以偶的1M ADSL小水管为例,大约也就二十分钟左右就安装完毕了!真的是非常快!和其他系统的wget源码、./configure && make && make install...所需要的时间相比,效率是非常高!而且,由于OpenBSD默认采用比较高的安全策略,装上的环境安全性也比其他系统要高!

等所需的软件都安装完成后,按提示作链接并创建PHP临时工作目录:

ln -s /var/www/conf/modules.sample/php5.conf /var/www/conf/modules
ln -fs /var/www/conf/php5.sample/apc.ini /var/www/conf/php5/apc.ini
ln -fs /var/www/conf/php5.sample/gd.ini /var/www/conf/php5/gd.ini
ln -fs /var/www/conf/php5.sample/mbstring.ini /var/www/conf/php5/mbstring.ini
ln -fs /var/www/conf/php5.sample/mcrypt.ini /var/www/conf/php5/mcrypt.ini
ln -fs /var/www/conf/php5.sample/mysql.ini /var/www/conf/php5/mysql.ini
mkdir /var/nginx/sesstmp
chmod 0777 /var/nginx/sesstmp


pkg_info检查一下系统中安装了些什么软件包:



可以看到,所需的软件包和依赖的包都安装好了!

四、Nginx配置

Ⅰ、Nginx配置文件的修改

修改nginx的默认配置文件:
  1. vi /etc/nginx/nginx.conf
复制代码


按下面的内容修改Nginx的配置文件。兰色表示需要手动修改的内容红色表示增加的内容

#user  nobody;

# 指定子进程数,酌情修改
worker_processes  4;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

# 最多可打开文件数
worker_rlimit_nofile 8196;

events {
    # 最大并发数
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    # 关掉错误日志
    error_log       /dev/null  crit;
    # 如果需要错误日志,就用下面这行替换上面这行
    #error_log     /var/log/nginx/error.log  notice;

    # 定义日志格式,对日志使用缓存,避免频繁的磁盘I/O操作
    access_log   /var/log/nginx/access.log combined buffer=1m;

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;

    keepalive_timeout  10;


    # 对静态文件和可压缩文件启用压缩,以节约网络带宽,提高访问速度
    gzip              on;
    gzip_min_length   1k;
    gzip_buffers      4 8k;
    gzip_http_version 1.1;
    gzip_comp_level   3;
    gzip_types        text/html text/css text/xml text/plain application/x-javascript application/xml application/pdf application/x-perl application/x-tcl application/msword application/rtf application/vnd.ms-excel application/vnd.ms-powerpoint application/vnd.wap.xhtml+xml image/x-ms-bmp;
    gzip_disable      "MSIE [1-6] \.";
    gzip_vary         on;


    # 定义输出缓存大小
    output_buffers   4 32k;

    # 最大允许可上传文件大小
    client_max_body_size 20m;

    # 定义一个叫“myzone”的记录区,总容量为 10M
    # 和下面的limit_conn一起限制单个IP的并发连接数为10
    limit_zone myzone $binary_remote_addr  10m;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /var/nginx/html;
            index  index.php index.html index.htm;
            limit_conn  myzone 10;
        }

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {
            root   /var/nginx/html;
        }

        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/nginx/html$fastcgi_script_name;
            include        fastcgi_params;
        }

        # 在浏览器本地暂存图片和静态文件,不记录日志,以节约机器资源
        location ~* \.(gif|png|jpg|jpeg|bmp|css|js|swf)$
        {
            root           /var/nginx/html;
            access_log off;
            expires max;
        }


        # 在浏览器中输入http://xxx.xxx.xxx/status可以看到Nginx的运行信息
        # 需要密码验证,不记录日志,限制IP访问
        location ~ /status
        {
            auth_basic  "O.N.M.P.";
            auth_basic_user_file password;
            stub_status on;
            access_log   off;
            allow 192.168.0.0/24;
            deny all;
        }

    }

}


其他的部分请酌情修改。

运行下面的命令生成查看Nginx运行状态的密码文件:

  1. htpasswd -c /etc/nginx/password webadmin
复制代码


按提示输入两遍密码即可。

在查看status的时候,输入用户名webadmin(见上面这行)和密码就能够看到Nginx的运行数据了。

Nginx能够流行和它的高负载能力是分不开的,在追求性能表现的场合,推荐使用Nginx+PHP-fastcgi的组合以获得强健的性能表现。而对于那些重视安全性的场合来说,可能OpenBSD内核集成的Apache更合适。OpenBSD下搭建Apache、MySQL、PHP环境的详细内容请参见偶的另篇博文,地址在下面:(博客速度可能较慢,四楼有转帖)
http://blog.chinaunix.net/u2/81136/showart_1860332.html

当然,你也可以利用Nginx内置的负载均衡功能,在前端分配访问流量,后端由Apache来运行PHP环境。Nginx负载均衡的配置可以去Nginx的主页参看相关内容,地址:http://wiki.nginx.org/Main

下面为一个Nginx负载均衡的示例:

http {
upstream myproject {
ip_hash;
server 192.168.1.1:80;
server 192.168.1.2:80;
server 192.168.1.3:80;
server 192.168.1.4:80;
}

server {
listen 80;
server_name www.domain.com;
location / {
proxy_pass http://myproject;
}
}
}


网络拓扑示意图如下:



Ⅱ、Nginx日志截断

OpenBSD默认每天00:00会执行/etc/daily.local脚本中的内容,我们只需要把Nginx日志截断的命令加入到这个文件中即可。
  1. vi /etc/daily.local
复制代码
加入下面的内容:

#!/bin/sh
# 对Nginx日志进行截断和压缩,以节约log分区空间
# 在张宴的基础上修改,感谢!
mkdir -p /var/log/nginx/$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/
mv /var/log/nginx/access.log /var/log/nginx/$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/access.$(date -d "yesterday" +"%Y%m%d").log
kill -USR1 `cat /var/run/nginx.pid`
sleep 1
gzip /var/log/nginx/$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/access.$(date -d "yesterday" +"%Y%m%d").log


保存退出,为/etc/daily.local加上执行权限:
  1. chmod 0755 /etc/daily.local
复制代码
其他需要每天运行的命令也都可以加在这个脚本里面,各位自行处理。

五、MySQL与phpMyAdmin的配置

Ⅰ、MySQL的配置

安全起见,MySQL需要运行在自己的daemon下:
  1. vi /etc/login.conf
复制代码
跳到最后,加入MySQL所需的修改:

mysql:\
        :openfiles-cur=2048:\
        :openfiles-max=4096:\
        :tc=daemon:


使修改生效:
  1. cap_mkdb /etc/login.conf
复制代码
初始化MySQL数据库:
  1. /usr/local/bin/mysql_install_db
复制代码
MySQL自带了几个配置文件,在/usr/local/share/mysql目录中,可以拷贝为/etc/my.cnf使用。关于MySQL的配置和优化等内容,可以自行Google,这里不再赘述。
MySQL安全须知
  • 不要用root身份运行数据库或PHP应用。并且,最好是数据库名和数据库用户名不同,以提高安全性。

    例如,域名为example.net,则数据库名设为abcxyz,数据库用户名设为xyzabc。总之,关联度越低越好,数据库名和数据库用户名越复杂越难猜测越好。

  • 控制权限的分配,PHP应用仅给予必要的权限。

    例如,安装/升级Discuz!和PHPWind论坛程序,仅需要下图所示的权限即可:



  • 在安装/升级完毕后,还可以把CREATE、ALTER、DROP权限去掉,不会影响论坛程序的运行,而且提高了安全性!
Ⅱ、phpMyAdmin的配置

由于OpenBSD中的phpMyAdmin默认是安装在/var/www/phpMyAdmin目录中的,直接使用Nginx是无法访问的,我们需要把它拷贝到Nginx目录下,这样就可以通过浏览器来管理MySQL数据库了。
  1. mkdir /var/nginx/html/pma/
  2. cp -rf /var/www/phpMyAdmin/* /var/nginx/html/pma/
复制代码
修改phpMyAdmin的配置文件,使之可用。
  1. vi +17 /var/nginx/html/pma/config.inc.php
复制代码
将下面这行修改成:

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


(仅是加入了字母a而已)

保存退出。
小提示:
  • 上面新建了/var/nginx/html/pma目录来保存phpMyAdmin的文件,目录名很简单。你可以用一个更复杂的目录名来代替,例如:pma2YAY5jRpfFfLXQVm这样的目录名,以防止黑客利用字典攻击等方法渗透你的phpMyAdmin!
  • 你还可以在Nginx的配置文件中,将/var/nginx/html/pma配置成某个虚拟主机的根目录,并限定可以访问这个虚拟主机的IP。这样,就可以在很大程度上提高数据库的安全性了!一个配置示例在下面:

    location / {
        allow   192.168.0.0/24;
        deny    all;
    }

  • 假如平时只是偶尔用到phpMyAdmin,你还可以在用完后删除/var/nginx/html/pma目录,需要用的时候再拷贝过去。
  • 你还可以将以上方法结合起来灵活使用,既建立一个无法被猜测的目录名,又限制IP访问,这样你的系统被黑的机会就会小了很多!
六、强化PHP的安全

OpenBSD软件包中的PHP已经自带了suhosin这个补丁,可以在很大程度上提高PHP脚本的安全。本节主要讨论在php.ini文件中进行相关的设置,进一步提升安全性。具体来说,就是禁用某些危险函数和启用PHP安全模式。

偶一般是把对PHP的所有修改都放在一个单独的文件中进行,包括对PHP参数以及扩展模块的修改,都放在这个文件中一并处理,这样查找、修改和管理会方便许多:
  1. vi /var/www/conf/php5/addphp.ini
复制代码
加入下面的内容:

; 禁止动态加载模块
enable_dl = Off

; 隐藏PHP信息
expose_php = Off

; 限定可访问目录
open_basedir = /var/nginx/html/

;设定session暂存目录
session.save_path=/var/nginx/sesstmp

; 设定PHP上传文件的临时目录
upload_tmp_dir=/var/nginx/tmp

; 禁用危险函数(注意下面的内容应该是一行,编排的原因分成了多行)
disable_functions = phpinfo,com,shell,exec,system,passthru,error_log,
stream_socket_server,putenv,ini_alter,ini_restore,ini_set,dl,openlog,
syslog,readlink,symlink,link,leak,fsockopen,pfsockopen,proc_open,
popepassthru,escapeshellcmd,escapeshellarg,chroot,scandir,
chgrp,chown,shell_exec,proc_get_status,popen,shmop_close,
shmop_delete,shmop_open,shmop_read,shmop_size,shmop_write

; 启用PHP的安全模式
; PHP在安全模式下运行是用性能换安全。据简单测试,性能下降到50%左右,各位请酌情使用
; 启用安全模式后,某些程序可能受到影响。例如,Discuz!将无法上传附件
safe_mode = On

; pecl-APC只使用16M的共享内存用以加速PHP程序的运行
apc.shm_size=16M


保存退出。

感谢所有支持的网友!

[ 本帖最后由 young_king 于 2009-4-21 11:13 编辑 ]

评分

参与人数 1可用积分 +5 收起 理由
OraBSD + 5 原创内容

查看全部评分

论坛徽章:
0
81 [报告]
发表于 2009-07-20 09:08 |只看该作者
原帖由 fender0107401 于 2009-6-4 12:14 发表
我也来顶!


感谢朋友顶帖!

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
80 [报告]
发表于 2009-06-04 12:14 |只看该作者
我也来顶!

论坛徽章:
0
79 [报告]
发表于 2009-06-04 11:54 |只看该作者
收藏起来备用啦,呵呵.文档水平都挺强...

论坛徽章:
2
巳蛇
日期:2014-10-26 22:38:12天蝎座
日期:2016-01-08 09:25:17
78 [报告]
发表于 2009-05-12 12:23 |只看该作者
不错,支持

论坛徽章:
0
77 [报告]
发表于 2009-05-11 09:42 |只看该作者
原帖由 czjin 于 2009-5-10 20:49 发表
openbsd4.5已出来了,不知在安装Nginx Mysql PHP eAccelerator Zend Optimizer 等方面会与openbsd4.4有什么不同?我准备在VM机上测试,碰到问题再请教楼主。





[ 本帖最后由 young_king 于 2009-5-11 09:52 编辑 ]

论坛徽章:
0
76 [报告]
发表于 2009-05-10 20:49 |只看该作者
openbsd4.5已出来了,不知在安装Nginx Mysql PHP eAccelerator Zend Optimizer 等方面会与openbsd4.4有什么不同?我准备在VM机上测试,碰到问题再请教楼主。

论坛徽章:
0
75 [报告]
发表于 2009-04-27 09:42 |只看该作者
原帖由 dooros 于 2009-4-24 13:57 发表
新问题,如果我要安装一个Discuz如何像使用虚拟空间那样,把文件上传上去,然后开始安装呢?是不是要自己设置开启ftp服务?(关键是不知道怎么才可以使上传的文件正好在/var/nginx/html文件夹里)


无须开启FTP服务,简单点说。
  1. export PKG_PATH=ftp://ftp.openbsd.org/pub/OpenBSD/4.4/packages/i386/
  2. pkg_add unzip
  3. cd /tmp
  4. wget http://download.comsenz.com/UCenter/1.5.0/UCenter_1.5.0_SC_UTF8.zip
  5. mkdir /var/nginx/html/uc
  6. unzip UCenter_1.5.0_SC_UTF8.zip
  7. cp -rf /tmp/upload/* /var/nginx/html/uc
  8. rm -rf /tmp/*
  9. ...
  10. ...
  11. wget http://download.comsenz.com/Discuz/7.0.0/Discuz_7.0.0_SC_UTF8.zip
  12. mkdir /var/nginx/html/bbs
  13. unzip Discuz_7.0.0_SC_UTF8.zip
  14. cp -rf /tmp/upload/* /var/nginx/html/bbs
  15. rm -rf /tmp/*
  16. ...
  17. ...
复制代码
明白?

如果是本机上的文件,需要传到服务器上,记得二楼曾经说过的PSFTP?仍然无须开启FTP服务。

[ 本帖最后由 young_king 于 2009-4-27 10:08 编辑 ]

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-12 10:39:39IT运维版块每日发帖之星
日期:2015-10-10 06:20:00
74 [报告]
发表于 2009-04-27 08:49 |只看该作者
Lz很认真

谢谢分享

论坛徽章:
2
羊年新春福章
日期:2015-02-04 10:37:51射手座
日期:2015-02-04 10:38:43
73 [报告]
发表于 2009-04-27 01:30 |只看该作者
非常不错,收藏了
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP