假日漫漫,忽然想起有十几年没用过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