假日漫漫,忽然想起有十几年没用过bsd系统了,遂练一下手。

简单回顾了一下,十几年时间,变化还是挺大的,光安装系统都比以前复杂多了。。。而且,tmd居然有大坑。。。

 

安装操作系统的过程改天再写了,直接上系统装好以后的后续步骤:

首先自己修改/etc/ssh/sshd_config,让root可以远程登录。一般vps提供的系统已经是修改过的,这一步略过。

安装一些常用的工具什么的:

pkg install -y ifstat htop nano wget unzip rsync

 

第一次运行pkg会自动更新库信息,所以稍等即可。

 

首先来搞数据库

关于MySQL和MariaDB的选择各位见仁见智吧。一般来说,相同底层版本的MariaDB比mysql的内存占用会稍多一些,同时新版本比老版本的内存占用也会多一些,所以我个人习惯是使用能找到并且目前处于支持状态的最老版本。对于大多数应用来说,版本的更替并不会带来什么特明显的性能和功能提升,比如搞个网站什么的,其实十几年前的版本就是最合适的,占用资源少,速度还快,而这十几年来增加的那些功能其实对大多数应用都没什么用。

搜索可用版本(2选1):

pkg search mysql
pkg search mariadb

 

具体用哪个就自己选了,上面命令会列出pkg系统目前有的版本,我自己用的是mysql 5.5(2选1):

pkg install -y mysql55-server mysql55-client
pkg install mariadb103-server-10.3.8_2 mariadb103-client-10.3.8

 

然后设置这个服务为自行启动,启动该服务,并且应用mysql自带的安全设置工具:

sysrc mysql_enable="YES"
service mysql-server start
/usr/local/bin/mysql_secure_installation

 

是交互式命令行界面,注意初始的时候是没有root密码的,所以第一个问题应该直接回车,后面的根据需要设置就行,基本都是一路回车。

然后呢,根据自己的需要设置一下/var/db/mysql/my.cnf文件,注意默认是没有这个文件的,如果需要的话应该自己创建:

[client]

port=3306

[mysql]

default-character-set=gbk

[mysqld]
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

 

我的配置里面有一项:

skip-name-resolve

 

这个配置会让mysql禁用解析主机名,从而加快每一次连接mysql的速度,但是有个贼尴尬的问题:

默认的,mysql的root用户是root@localhost,而用了这个设置以后,mysql就无法解析localhost,也就登录不了,所以在重启之前需要先把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;

 

同时我还禁用了innodb,需要的话把那一行注释即可。

 

一个小的科普知识:localhost和127.0.0.1是不同的,或者说根本就是两回事,但是默认情况呢,在本机用这两个进行连接却会得到相同结果,因为hosts里面有一项是对localhost进行指向了,再加上mysql会进行主机名解析,所以mysql最终得到的结果是相同的。在禁用主机名解析之后,客户端连接localhost实际上仍然连接的是127,而服务器面对localhost却无法解析为127,所以账号库里面的root@localhost永远无法登陆了。

 

最后重启mysql即可:

service mysql-server restart

 

 

 

接着安装Nginx:

 

这个很简单,所以直接复制即可:

pkg install -y nginx-full
sysrc nginx_enable="yes"
service nginx restart

过程挺长,会自动安装100多个包包,但是速度还是挺快的,抽根烟的时间是不够的。

 

 

 

该PHP了:

这里有个贼大贼大的坑,截止昨天(2018.10.07)的时候,FreeBSD官方源里面的PHP 7.2是有问题的,我遇到的情况就是两个wordpress站点,一个正常一个不正常,而不正常的这个又找不到任何错误输出,nginx和php-fpm全都没有具体错误,就是无脑的报500,而出错这个站点内自己写一个phpinfo却又正常,我在自己手工装的系统和Vultr提供的系统全都是这样,最终花了很长很长时间才判断到问题在php 7.2这里,更换为7.0就一切正常了,连配置文件都不用改。所以还是前面说的话,太新的版本其实没多大用,搞不好还要郁闷。。。

安装命令:

pkg install -y php70 php70-bz2 php70-calendar php70-curl php70-dba php70-exif php70-gd php70-gettext php70-hash php70-iconv php70-imap php70-json php70-mbstring php70-memcache php70-mysqli php70-odbc php70-opcache php70-openssl php70-pspell php70-readline php70-session php70-sockets php70-sqlite3 php70-tidy php70-xml php70-xmlrpc php70-xsl php70-zip php70-zlib php70-filter
sysrc php_fpm_enable=yes
mv /usr/local/etc/php-fpm.d/www.conf  /usr/local/etc/php-fpm.d/www.conf.bak
service php-fpm restart

 

那个www.conf是自带的一个例子,但是却会产生一个进程占用内存,所以拿掉就可以。

 

至此,系统环境已经完成,因为我之前一直用的是proftpd,而没找到这个包包,其他的ftp服务器我不熟,回头再写这一块吧。

 

 

创建网站的步骤:

首先创建用户、组、目录什么的:

pw groupadd www.tingtao.org
pw useradd www.tingtao.org -s /sbin/nologin -m -d /var/www/www.tingtao.org -G www.tingtao.org www
chown -R www.tingtao.org:www.tingtao.org /var/www/www.tingtao.org
chmod -R 755 /var/www/www.tingtao.org

 

用-d参数会创建用户的目录,还会自动放一些环境设置什么的文件,可以删掉的。FreeBSD系统上nginx默认的路径并不是/var/www,我习惯用这个了,而且我的配置文件也都是这样,所以依照习惯搞了。

然后有两块,先做php-fpm的配置,比如文件为/usr/local/etc/php-fpm.d/www.tingtao.org.conf :

[www.tingtao.org]
user = www.tingtao.org
group = www.tingtao.org
listen = /var/run/php7-fpm-www.tingtao.org.sock
listen.owner = www
listen.group = www
php_admin_value[include_path] = .:/var/www/www.tingtao.org/
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 = /

 

接着是nginx的站点配置了,我用的debian系统默认是/etc/nginx/sites-enabled,而FreeBSD是/usr/local/etc/nginx,为了方便,我让nginx包含了/usr/local/etc/nginx/sites-enabled这个目录(自己创建),则配置文件就是/usr/local/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/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_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;

}

 

最后重启一下php-fpm和nginx就可以访问了:

service nginx restart
service php-fpm restart

 

 

一些小经验:

1,nginx 模块的位置 /usr/local/libexec/nginx,需要的话可以自己加载。

2,本文中的有些目录并不存在,只是我根据自己习惯所用的,可以强行手工创建:

mkdir -p /usr/local/etc/nginx/sites-enabled/

 

 

 

对了,写个小知识。添加站点用户的时候我是给他指定了两个组的,一个自有组,一个www,也就是说-G www.tingtao.org www的意思是把用户添加到这两个组内。因为我们一般设置网站文件为755或者750,而Nginx是运行在www的,所以Nginx可以读取并且执行该站点的文件。同时php-fpm的配置里面有两种身份,运行身份为用户自己,所以php可以读取、执行、修改站点内文件;而监听身份是www,所以Nginx的fastcgi模块可以连接到这个站点的php-fpm进程。Nginx和php-fpm以及站点用户的关系就是这样了,通过这样的设置,可以让各部分该干嘛就干嘛,不会越权,也不会影响到其他站点安全性。

 

 

今天凌晨我已将前端节点更换为BSD了,目前来说感觉还是挺爽的。

昨天还试了一下OpenBSD系统,遇到了更大的坑,最新是6.3,而6.3没有php-fastcgi,6.2有;但是我需要用nginx的lua模块,只有6.3自带的有,6.2则没有。于是我花了几个小时时间编译nginx和php,还是用ports编译的,最终nginx无法通过,php我实在等不了直接Ctrl+C了,回头有时间再折腾这个系统吧。

 

 

 

最后是一些感慨吧。在十几年前来看,当时的Linux还很傻逼,因为有正统Unix血缘的Solaris、AIX、HP-Unix以及各类BSD系统(当然还有其他,我一时记不起了)里面,并不包括Linux。而这些Unix系统因为已经发展了很多很多年,所以稳定和强健程度自然没得说,也在高端领域接受了数十年的考验。而Linux系统因为是仿造Unix,所以其实两类系统差别挺大的,就拿本文的nginx+php+mysql这个最常用的环境来说,相同的硬件配置,则BSD系统使用内存是少于Linux的,同时我虽未测试,但能明显的感觉到速度是快于Linux的,甚至目前很多Linux上被人津津乐道的设计其实是用的几十年前Unix的做法。

但是,也因为有了Linux的竞争,所以让BSD系统也开始不那么摆谱,各方面都开始注重易操作。就比如本文的环境,只是为了解释步骤所以MySQL环节详细的写了每一步,而实际上本文所有的安装命令是可以合并的,也就是本文全部环境其实用不了几行命令就完事了。

就实际性能和用户反映来看,迄今为止Unix依然是高端霸主,Linux偏向于中低端。对我们来说呢,不必计较谁是正统,反正谁方便就用谁,我们日常的服务器应用来说,这俩没多大区别的,Linux因为中低端,所以意味着用户群较大,所以遇到的问题可能很容易找到别人填坑的经验,算是个很大的优点。就用户群来说,玩Linux的多数喜欢装B出风头,玩Unix的则一般都不太理人,哈哈。

 

 

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

2018.10.20 补充:

根据近几天的测试,证实了php 7.2是没问题的,我之前测试出错是因为另个站点无法自动切换到mysqli

发表评论

电子邮件地址不会被公开。 必填项已用*标注