这两天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一般是用不上的,我这是因为有个程序必须这么搞,所以统一配置。

作者 听涛

发表回复

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