这两天OpenBSD发布了6.4,昨天睡不着,折腾一下。
至于OpenBSD就没必要多介绍了,世界上最安全的操作系统,没有之一。
自带的pkg包都是很新的版本,nginx是1.14,PHP是7.2.10,mariadb是10.0.36。
之前写OB 6.3的时候,因为有十几年没用过这系统了,而近几年一直在用Linux,所以全搞混了,基本上是纯新手,几乎完全忘记怎么玩了,最近捣鼓捣鼓,慢慢找回点感觉了。之前6.3的文章有些细节可能是有误或者不够详细,这次进行了细致的记录,确保完全无误。
至于系统安装,BSD类的系统安装都是很简单的,十几年来好像就没变过,可以参考前两年写的那个。
安装好以后,改一下/etc/ssh/sshd_config,确保root可以登录,本文假设环境为干净系统+root登录ssh。
第一步,安装所有需要的软件
依次执行下面命令(必须单步执行,因为里面有些需要交互):
export PKG_PATH=https://cloudflare.cdn.openbsd.org/pub/OpenBSD/6.4/packages/amd64/ pkg_add -v pcre pkg_add ifstat bash wget nano unzip htop rsync nginx nginx-lua nginx-headers-more nginx-geoip nginx-image_filter nginx-stream nginx-xslt mariadb-server mariadb-client php-7.2.10 php-bz2-7.2.10 php-curl-7.2.10 php-dba-7.2.10 php-gd-7.2.10 php-imap-7.2.10 php-intl-7.2.10 php-ldap-7.2.10 php-mysqli-7.2.10 php-odbc-7.2.10 php-pspell-7.2.10 php-tidy-7.2.10 php-xmlrpc-7.2.10 php-xsl-7.2.10 php-zip-7.2.10
更换shell(非必须,但推荐):
chsh -s /usr/local/bin/bash echo "alias ll='ls -al'" >> /root/.profile
第二步,搞数据库
安装初始数据并且设置为自动启动(需要单步执行):
/usr/local/bin/mysql_install_db rcctl enable mysqld rcctl restart mysqld
基本的安全设置:
/usr/local/bin/mysql_secure_installation
具体内容我记不太清,印象中首先问你root密码,默认是空的就直接回车,然后问你要不要设置root密码,接着依次是删除匿名用户、禁止root远程登录、测试测试数据库、重载权限,我只允许了root远程,其他的直接回车。
接着是我的惯用设置,非必须:
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 restart mysqld
MariaDB/MySQL配置文件在/etc/my.cnf ,如果需要的话,自行调整相应设置。
第三步,Nginx设置
模块的地址为/var/www/modules,需要的话可以手工加载。
这里没什么需要特殊设置的,根据自己需要搞吧,配置文件在/etc/nginx/nginx.conf,我加了一行
include /etc/nginx/sites-enabled/*.conf;
设置为自动启动以及解除chroot,再重启一下:
rcctl enable nginx rcctl set nginx flags -u rcctl restart nginx
第四步,PHP设置
这里有个坑,第一步的命令我们安装了php-mysqli,这一点是毋庸置疑的,但是这个模块居然没有自动加载,而奇怪的是其他模块却是自动的,这个坑让我折腾了很久,mlgb的,需要修改/etc/php-7.2.ini,取消mysqli模块的注释行,其他模块不需要动也可用,但是打开也可以,如果发现打开的多了不行就慢慢试一下。
然后习惯性的站点配置目录:
mkdir /etc/php-fpm.d
在/etc/php-fpm.conf最后面加一行:
include=/etc/php-fpm.d/*.conf
最后启用并且重启:
rcctl enable php72_fpm rcctl restart php72_fpm
注意,这里重启php是肯定会出错的,因为并没有具体的站点配置文件,等后面做了站点以后再重启就好了。
至此,大功告成,环境做好了,下面搞个站点:
第五步,开设站点
以本博客为例,首先是用户、组、目录、权限以及清除不需要的文件:
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:
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_nocache.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 "include_path= .:/var/www/globals/v.haote.net/lib:/usr/share/php/"; 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_param PHP_ADMIN_VALUE "post_max_size= 50M"; fastcgi_intercept_errors on; fastcgi_ignore_client_abort on; fastcgi_read_timeout 180; #下面这5行在调试的时候可以注释掉 add_header Fastcgi-Cache $upstream_cache_status; fastcgi_cache_bypass $skip_cache; fastcgi_no_cache $skip_cache; fastcgi_cache wp_fastcgi; fastcgi_cache_valid 2h; } location / { #定义首页索引文件的名称 index index.php index.html index.htm; #下面这行和后面的跟wordpress有关 try_files $uri $uri/ /index.php?$args; } }
最后重启一下php和nginx就可以了
rcctl restart php72_fpm rcctl restart nginx
本文就是在这个OpenBSD环境写的,phpinfo:
备注一些可能需要注意的
文中命令最好单步执行,因为有些需要交互的会被批量执行给搞乱掉,或者如果有需要的话,自己搞个shell脚本吧。
站点的php配置我写在两个地方了,而且很明显有重复,是因为每个系统的情况不一样,有些linux以php-fpm配置优先,而有些unix系统则以nginx传过去的变量优先,所以为了统一配置,为了方便,更重要是为了安全起见,我把两个地方都办了,重复配置不会有任何影响。
站点php配置里面的include_path一般是用不上的,我这是因为有个程序必须这么搞,所以统一配置。