简介一下,这个系统是世界上最安全的通用操作系统,没有之一。平时所用的OpenSSL、LibSSL等项目都是这个团队做的,还有些平时不太常用的openike/opensmtpd/openbgpd等几个项目。这货的记录我记得是8年未曾出现一个远程漏洞,相比之下,各路大神热捧的Linux则每周至少有1个漏洞,没法比,货比货得扔……

将安全做到极致,但也要付出代价。在较流行的几个BSD兄弟里面,OB的性能我估计是最低的,只是估计……我实际遇到过的是一次无意间发现它的硬盘性能极差,不过也有可能是因为当时硬件兼容问题,因为在其他机器上好像没遇到过(其实也没刻意测试过)。另一种代价就是为了安全么,很多程序的运行被他封闭在一定的环境中,本文中就有。

但是OB的网络性能是很不错的,加上无与伦比的稳定性和安全性,再加上绝佳的身材,所以有不少防火墙项目就是基于OB做的,软路由也有不少。

 

 

首先安装需要的程序:

export PKG_PATH=https://cloudflare.cdn.openbsd.org/pub/OpenBSD/6.3/packages/amd64/
pkg_add ifstat wget nano unzip htop rsync nginx nginx-lua mariadb-server nginx-headers-more nginx-geoip nginx-image_filter nginx-lua nginx-stream nginx-xslt

 

这些没什么说的,重要的是php,先别急,看看命令下面的说明:

pkg_add php-7.0.28 php-bz2-7.0.28 php-curl-7.0.28 php-dba-7.0.28 php-gd-7.0.28 php-imap-7.0.28 php-intl-7.0.28 php-ldap-7.0.28 php-mysqli-7.0.28 php-odbc-7.0.28 php-pspell-7.0.28 php-tidy-7.0.28 php-xmlrpc-7.0.28 php-xsl-7.0.28 php-zip-7.0.28

 

按照这个安装,没问题的,但是OpenBSD给的包包里面,php 7.0是没有mysql库的,只有个mysqli,虽然这是php官方推荐做法,但是毕竟还有不少程序在用以前的库,比如我这wordpress就没法用了,所以上面的命令应该更换为:

pkg_add php-5.6.34 php-bz2-5.6.34 php-curl-5.6.34 php-dba-5.6.34 php-gd-5.6.34 php-imap-5.6.34 php-intl-5.6.34 php-ldap-5.6.34 php-mysqli-5.6.34 php-odbc-5.6.34 php-pspell-5.6.34 php-tidy-5.6.34 php-xmlrpc-5.6.34 php-xsl-5.6.34 php-zip-5.6.34 php-mysql-5.6.34

 

设置MySQL

奇葩的是官方源里面居然没有mysql,所以前面我装的是mariadb。

更奇葩的是他安装好的mariadb是无法启动的,让我折腾了好一阵才知道,需要先执行一下初始化程序:

/usr/local/bin/mysql_install_db

但我不理解的是,既然这程序并不会进行交互,那为什么不安装的时候顺手就办了呢,还非要用户自己动手,妈的……

 

接着进行安全设置:

/usr/local/bin/mysql_secure_installation

跟上篇文章一样,不多说。

然后做一下账户:

mysql -u root -p密码
set password for root@localhost = password('密码'); 
grant all privileges on *.* to root@"127.0.0.1" identified by '密码' with grant option;
grant all privileges on *.* to root@"%" identified by '密码' with grant option;
exit;

最后设置为这个服务可以启动,顺带重启:

rcctl enable mysqld
rcctl restart mysqld

 

补充,mariadb在这个系统上的配置文件为/etc/my.cnf(默认不存在)。同时他绑定地址有点小问题,如果不设置,则默认监听ipv6,用v4则连不上,大概有其他窍门吧,我最终设置的是监听0.0.0.0:

[client]

port=3306

[mysql]

default-character-set=gbk

[mysqld]
bind-address=0.0.0.0
port=3306
skip-name-resolve
lower_case_table_names = 1
max_allowed_packet      = 1200M
skip-innodb

group_concat_max_len=-1
default-storage-engine=MYISAM
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
max_connections=1400
query_cache_size=10M
table_cache=800
tmp_table_size=16M
thread_cache_size=19
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=8M
key_buffer_size=14M
read_buffer_size=64K
read_rnd_buffer_size=256K
sort_buffer_size=208K
innodb_additional_mem_pool_size=2M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M
innodb_buffer_pool_size=25M
innodb_log_file_size=10M
innodb_thread_concurrency=8

 

 

 

PHP设置

这里不需要更改什么,只是将php-fpm设置为可以启动就行了:

mkdir /etc/php-fpm.d

rcctl enable php70_fpm
rcctl start php70_fpm

默认的包含路径是/etc/php-fpm.d,而这个目录并不存在,所以上面建立了一个。

 

 

 

Nginx设置:

启用服务:

rcctl enable nginx

需要注意的是,因为Nginx是暴露给公网的,所以为了安全考虑,系统把Nginx的环境封锁在/var/www里面了,所以站点相关的php-fpm设置应该也把链接文件放在这个里面,否则Nginx连不上后台php,会报告502错误。

另外一个解决途径就是解除对nginx的chroot:

rcctl set nginx flags -u

 

默认是不包含站点文件和动态库的,所以为了习惯,先在/etc/nginx/nginx.conf里面头部加上:

load_module /var/www/modules/ndk_http_module.so;
load_module /var/www/modules/ngx_http_geoip_module.so;
load_module /var/www/modules/ngx_http_headers_more_filter_module.so;
load_module /var/www/modules/ngx_http_image_filter_module.so;
load_module /var/www/modules/ngx_http_lua_module.so;
load_module /var/www/modules/ngx_http_xslt_filter_module.so;
load_module /var/www/modules/ngx_stream_module.so;

 

在http段加一行:

include /etc/nginx/sites-enabled/*.conf;

 

 

 

 

站点

至此就完成了,基本不需要怎么动手,下面做一个示例站点:

首先创建用户和组:

groupadd www.tingtao.org
useradd -m -b /var/www/www.tingtao.org -d /var/www/www.tingtao.org -G www.tingtao.org,www -p 密码 -s /sbin/nologin www.tingtao.org
rm -R /var/www/www.tingtao.org/.*

 

然后做一个php-fpm的设置文件:

cat > /etc/php-fpm.d/www.tingtao.org.conf <<- _EOF1_
[www.tingtao.org]
user = www.tingtao.org
group = www.tingtao.org
listen = /var/www/run/php7-fpm-www.tingtao.org.sock
listen.owner = www
listen.group = www
php_admin_value[include_path] = .:/var/www/globals/www.3ha.net/lib
php_admin_value[open_basedir] = /var/www/www.tingtao.org:/tmp
php_admin_value[upload_max_filesize] = 50M
php_admin_value[max_execution_time] = 30
php_admin_value[max_input_time] = 60
php_admin_value[memory_limit] = 256M
php_admin_value[output_buffering] = 4096
php_admin_value[disable_functions] = system,exec,shell_exec,passthru,error_log,dl,sys_getloadavg,pfsockopen,openlog,syslog,readlink,symlink,link,leak,popen,escapeshellcmd,proc_close,proc_get_status,proc_nice,proc_open,proc_terminate,escapeshellarg,pcntl_exec,show_source,highlight_file,ini_restore,apache_child_terminate,apache_get_modules,apache_get_version,apache_getenv,apache_note,apache_setenv,virtual,mb_send_mail,set_time_limit,max_execution_time,php_uname,disk_free_space,diskfreespace,stream_copy_to_stream
php_admin_flag[allow_url_fopen] = off
php_admin_flag[expose_php] = Off
php_admin_flag[display_errors] = Off
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chdir = /
_EOF1_

 

接着就是nginx的设置文件/etc/nginx/sites-enabled/www.tingtao.org.conf:

#######################################################
#                      www.tingtao.org

server {
        listen 80; 
        listen [::]:80; 
        server_name     www.tingtao.org;
        keepalive_timeout    120;
        
        listen          443 ssl;
        listen          [::]:443 ssl;
        ssl_certificate      /var/www/ca/www.tingtao.org/Nginx/1_www.tingtao.org_bundle.crt;
        ssl_certificate_key  /var/www/ca/www.tingtao.org/Nginx/2_www.tingtao.org.key;

        ##############################################

        error_log /dev/null;
        access_log /dev/null;

        root /var/www/www.tingtao.org;

        location ~ ^.+\.php {
            fastcgi_split_path_info ^(.+\.php)(.*)$;
            fastcgi_pass   unix:/var/www/run/php7-fpm-www.tingtao.org.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/www/www.tingtao.org$fastcgi_script_name;
            include fastcgi_params;
            fastcgi_param  QUERY_STRING     $query_string;
            fastcgi_param  REQUEST_METHOD   $request_method;
            fastcgi_param  CONTENT_TYPE     $content_type;
            fastcgi_param  CONTENT_LENGTH   $content_length;
            fastcgi_param PHP_ADMIN_VALUE "cgi.fix_pathinfo=1";
            fastcgi_param PHP_ADMIN_VALUE   "open_basedir= $document_root/:/tmp:/usr/share/php/";
            fastcgi_param PHP_ADMIN_VALUE   "upload_max_filesize= 50M";
            fastcgi_param PHP_ADMIN_VALUE   "max_execution_time= 30";
            fastcgi_param PHP_ADMIN_VALUE   "max_input_time= 60";
            fastcgi_param PHP_ADMIN_VALUE   "memory_limit= 128M";
            fastcgi_param PHP_ADMIN_VALUE   "output_buffering= 4096";
            fastcgi_param PHP_ADMIN_VALUE   "disable_functions= system,exec,shell_exec,passthru,error_log,dl,sys_getloadavg,pfsockopen,openlog,syslog,readlink,symlink,link,leak,popen,escapeshellcmd,proc_close,proc_get_status,proc_nice,proc_open,proc_terminate,escapeshellarg,pcntl_exec,show_source,highlight_file,ini_restore,apache_child_terminate,apache_get_modules,apache_get_version,apache_getenv,apache_note,apache_setenv,virtual,mb_send_mail,set_time_limit,max_execution_time,php_uname,disk_free_space,diskfreespace,stream_copy_to_stream";
            fastcgi_param PHP_ADMIN_VALUE   "allow_url_fopen= off";
            fastcgi_param PHP_ADMIN_VALUE   "expose_php= Off";
            fastcgi_param PHP_ADMIN_VALUE   "display_errors= Off";
            fastcgi_intercept_errors        on;
            fastcgi_ignore_client_abort     on;
            fastcgi_read_timeout 180;

        }

        location / {
            #定义首页索引文件的名称
            index index.php index.html index.htm;
            #下面这行和后面的跟wordpress有关
            try_files $uri $uri/ /index.php?$args;
        }
        rewrite /wp-admin$ $scheme://$host$uri/ permanent;

}

 

完成以后,重启一下服务就行:

rcctl restart nginx
rcctl restart php70_fpm

 

 

 

 

对我而言,既然已经用上PHP7了,再让我用回5,心理有点别扭,所以这次没有更换系统,还是老老实实等wordpress更新吧。

一个小技巧,本文第一行命令的地址可以用浏览器打开,然后要装什么包就直接怼上命令即可,如果有多个版本的话(比如php)则把文件名里面的版本号也带上就行。

用这个系统是可以做到常年不维护的,比较省心。

 

作者 听涛

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注