零零社区

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

FreeBSD 12+Nginx+PHP+MySQL环境

[复制链接]
Apache 发表于 2019-5-24 22:52:45 | 显示全部楼层 |阅读模式
FreeBSD php运行环境
构建基于FreeBSD 11的PHP+Nginx+MySQL环境

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

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


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

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

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

  1. pkg install -y ifstat htop nano wget unzip rsync
复制代码

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


首先来搞数据库

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

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

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

  1. pkg install -y mysql55-server mysql55-client
  2. pkg install mariadb103-server-10.3.8_2 mariadb103-client-10.3.8
复制代码

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

  1. sysrc mysql_enable="YES"
  2. service mysql-server start
  3. /usr/local/bin/mysql_secure_installation
复制代码

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

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

  1. [client]
  2. port=3306
  3. [mysql]
  4. default-character-set=gbk
  5. [mysqld]
  6. port=3306
  7. skip-name-resolve
  8. lower_case_table_names = 1
  9. max_allowed_packet    = 1200M
  10. skip-innodb
  11. group_concat_max_len=-1
  12. default-storage-engine=MYISAM
  13. sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
  14. max_connections=1400
  15. query_cache_size=10M
  16. table_cache=800
  17. tmp_table_size=16M
  18. thread_cache_size=19
  19. myisam_max_sort_file_size=100G
  20. myisam_sort_buffer_size=8M
  21. key_buffer_size=14M
  22. read_buffer_size=64K
  23. read_rnd_buffer_size=256K
  24. sort_buffer_size=208K
  25. innodb_additional_mem_pool_size=2M
  26. innodb_flush_log_at_trx_commit=1
  27. innodb_log_buffer_size=1M
  28. innodb_buffer_pool_size=25M
  29. innodb_log_file_size=10M
  30. innodb_thread_concurrency=8
复制代码

我的配置里面有一项:

  1. skip-name-resolve
复制代码

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

默认的,mysql的root用户是root@localhost,而用了这个设置以后,mysql就无法解析localhost,也就登录不了,所以在重启之前需要先把root账号处理一下:

  1. mysql -u root -p密码
  2. set password for root@localhost = password('密码');
  3. grant all privileges on *.* to root@"127.0.0.1" identified by '密码' with grant option;
  4. grant all privileges on *.* to root@"%" identified by '密码' with grant option;
  5. exit;
复制代码

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


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


最后重启mysql即可:

  1. service mysql-server restart
复制代码

接着安装Nginx:


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

  1. pkg install -y nginx-full
  2. sysrc nginx_enable="yes"
  3. service nginx restart
复制代码

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




该PHP了:

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

安装命令:

  1. 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
  2. sysrc php_fpm_enable=yes
  3. mv /usr/local/etc/php-fpm.d/www.conf  /usr/local/etc/php-fpm.d/www.conf.bak
  4. service php-fpm restart
复制代码

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


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

创建网站的步骤:

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

  1. pw groupadd bbs.00-net.com
  2. pw useradd www.00-edu.com -s /sbin/nologin -m -d /var/www/www.00-edu.com -G www.00-edu.com www
  3. chown -R www.00-edu.com:www.00-edu.com
  4. /var/www/www.00-edu.com
  5. chmod -R 755 /var/www/www.00-edu.com
复制代码

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

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

  1. [www.00-edu.com]
  2. user = www.00-edu.com
  3. group = www.00-edu.com
  4. listen = /var/run/php7-fpm-www.00-edu.com.sock
  5. listen.owner = www
  6. listen.group = www
  7. php_admin_value[include_path] = .:/var/www/www.00-edu.com/
  8. php_admin_value[open_basedir] = /var/www/www.00-edu.com:/tmp
  9. php_admin_value[upload_max_filesize] = 50M
  10. php_admin_value[max_execution_time] = 30
  11. php_admin_value[max_input_time] = 60
  12. php_admin_value[memory_limit] = 256M
  13. php_admin_value[output_buffering] = 4096
  14. 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
  15. php_admin_flag[allow_url_fopen] = off
  16. php_admin_flag[expose_php] = Off
  17. php_admin_flag[display_errors] = Off
  18. pm = dynamic
  19. pm.max_children = 5
  20. pm.start_servers = 2
  21. pm.min_spare_servers = 1
  22. pm.max_spare_servers = 3
  23. 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.00-edu.com.conf :

  1. #######################################################
  2. # www.00-edu.com
  3. server {
  4.         listen 80;
  5.         listen [::]:80;
  6.         server_name www.00-edu.com;
  7.         keepalive_timeout    120;
  8.         
  9.         listen          443 ssl;
  10.         listen          [::]:443 ssl;
  11.         ssl_certificate      /var/www/ca/www.00-edu.com/Nginx/1_www.00-edu.com_bundle.crt;
  12.         ssl_certificate_key  /var/www/ca/www.tingtao.org/Nginx/2_www.00-edu.com.key;
  13.         ##############################################
  14.         error_log /dev/null;
  15.         access_log /dev/null;
  16.         root /var/www/www.00-edu.com;
  17.         location ~ ^.+\.php {
  18.             fastcgi_split_path_info ^(.+\.php)(.*)$;
  19.             fastcgi_pass   unix:/var/run/php7-fpm-www.00-edu.com.sock;
  20.             fastcgi_index  index.php;
  21.             fastcgi_param  SCRIPT_FILENAME  /var/www/www.00-edu.com$fastcgi_script_name;
  22.             include fastcgi_params;
  23.             fastcgi_param  QUERY_STRING     $query_string;
  24.             fastcgi_param  REQUEST_METHOD   $request_method;
  25.             fastcgi_param  CONTENT_TYPE     $content_type;
  26.             fastcgi_param  CONTENT_LENGTH   $content_length;
  27.             fastcgi_param PHP_ADMIN_VALUE "cgi.fix_pathinfo=1";
  28.             fastcgi_param PHP_ADMIN_VALUE   "include_path= .:/var/www/globals/v.haote.net/lib:/usr/share/php/";
  29.             fastcgi_param PHP_ADMIN_VALUE   "open_basedir= $document_root/:/tmp:/usr/share/php/";
  30.             fastcgi_param PHP_ADMIN_VALUE   "upload_max_filesize= 50M";
  31.             fastcgi_param PHP_ADMIN_VALUE   "max_execution_time= 30";
  32.             fastcgi_param PHP_ADMIN_VALUE   "max_input_time= 60";
  33.             fastcgi_param PHP_ADMIN_VALUE   "memory_limit= 128M";
  34.             fastcgi_param PHP_ADMIN_VALUE   "output_buffering= 4096";
  35.             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";
  36.             fastcgi_param PHP_ADMIN_VALUE   "allow_url_fopen= off";
  37.             fastcgi_param PHP_ADMIN_VALUE   "expose_php= Off";
  38.             fastcgi_param PHP_ADMIN_VALUE   "display_errors= Off";
  39.             fastcgi_intercept_errors        on;
  40.             fastcgi_ignore_client_abort     on;
  41.             fastcgi_read_timeout 180;
  42.         }
  43.         location / {
  44.             #定义首页索引文件的名称
  45.             index index.php index.html index.htm;
  46.             #下面这行和后面的跟wordpress有关
  47.             try_files $uri $uri/ /index.php?$args;
  48.         }
  49.         rewrite /wp-admin$ $scheme://$host$uri/ permanent;
  50. }
复制代码

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

  1. service nginx restart
  2. service php-fpm restart
复制代码


一些小经验:

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

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

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




对了,写个小知识。添加站点用户的时候我是给他指定了两个组的,一个自有组,一个www,也就是说-G www.00-edu.com 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



 楼主| Apache 发表于 2019-5-24 22:57:32 | 显示全部楼层
FreeBSD 12+Nginx+PHP+MySQL环境

系统的安装过程和11.2完全一样,就不写了。



安装需要的软件包:

  1. [font="][size=15px]pkg install -y ifstat nload htop nano wget unzip rsync expect proftpd nginx-full mysql55-server mysql55-client bash php72 php72-bz2 php72-calendar php72-curl php72-dba php72-exif php72-gd php72-gettext php72-hash php72-iconv php72-imap php72-json php72-mbstring php72-mysqli php72-odbc php72-opcache php72-openssl php72-pspell php72-readline php72-session php72-sockets php72-sqlite3 php72-tidy php72-xml php72-xmlrpc php72-xsl php72-zip php72-zlib php72-filter [/size][/font]
复制代码


设置proftpd:


  1. [font="][size=15px]sysrc proftpd_enable="YES"
  2. mkdir /var/log/proftpd[/size][/font]
复制代码

设置mysql:


  1. [font="][size=15px]sysrc mysql_enable="YES"
  2. service mysql-server restart[/size][/font]
复制代码

设置mysql可以远程登录root:


  1. [font="][size=15px]mysql -u root -p密码
  2. set password for root@localhost = password('密码');
  3. grant all privileges on *.* to root@"127.0.0.1" identified by '密码' with grant option;
  4. grant all privileges on *.* to root@"%" identified by '密码' with grant option;
  5. exit;[/size][/font]
复制代码


顺带吐槽一下,wordpress新版不好用,有点想吐。



回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /1 下一条


小黑屋|手机版|Archiver|零零论坛 ( 豫ICP备09039788号 )

GMT+8, 2020-8-8 11:35 , Processed in 1.711023 second(s), 11 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表