简介一下,这个系统是世界上最安全的通用操作系统,没有之一。平时所用的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)则把文件名里面的版本号也带上就行。
用这个系统是可以做到常年不维护的,比较省心。