最近配置了一台CentOS7.3下的PHP生产环境,将配置过程记录如下:
前言
CentOS这款经典的Linux系统升级到7系列之后,变化非常之大、非常之多,除了主发行版本内只提供64位的操作系统之外,系统内置的服务管理套件也由systemd
取代了老旧的sysVinit
。
什么是sysVinit、systemd?下面这种在7系列之前的CentOS系统中管理应用程序的命令很常见:
##启动mysql-server service mysqld start ##重新启动mysql-server service mysqld restart ##关闭mysql-server service mysqld stop ##查看mysql-server运行状态 service mysqld status
而到了7系列之后管理应用程序的命令可能就变成了systemctl
:
##启动mysql-server systemctl start mysql.service ##重启mysql-server systemctl restart mysql.service ##关闭mysql-server systemctl stop mysql.service ##查看mysql-server运行状态 systemctl status mysql.service
什么是sysVinit、systemd不是本文的重点,可以不是很全面的认为service
方式就是sysVinit,systemctl
方式就是systemd,当然实际情况可没有这么简单,各位客官请查找权威资料自主补充。另外7系列CentOS仍然提供有32位的,不过已经拆分出CentOS主发行序列之外,叫altarch项目,有兴趣的可以看看:https://mirror.centos.org/altarch/,国内的话有清华源:https://mirrors.tuna.tsinghua.edu.cn/centos-altarch/。可以这么认为:CentOS自7以及7系列之后作为服务器操作系统是仅有64位的。
---
编译版本选择说明:PHP7系列现在已经出到7.2了,目前7.2还是测试版,发布于2015年12月份的7.0已经很稳定了,7.1版的话截止至本文才出到7.1.7共8个正式版,所以选择稳定性和新特性兼具的7.0版本,差不多明年这个时候就可以选择7.1用于新项目的生产环境了。MySQL系列已经出到8.0了,8.0直接干掉了MyISAM存储引擎,不利于老项目,5.7引入了大量新特性变化较多不熟悉的情况下不要冒进,选择性能、稳定性都不错的5.6版本。nginx就不用说了,选择最新的稳定版本(stable version)而不是开发版本(mainline version,直译:主线版本,理解起来就是个开发版)。因为是生产环境选择版本会比较保守一些,各位要是开发环境请随意!
一、安装前准备
基础库和源码包下载
yum安装更新编译必备的基础库,并下载程序包源代码或二进制分发的程序包。
##安装yum的扩展程序包 #许多库、软件都是由epel扩展提供的 yum -y install epel-release yum makecache ##yum安装基础库和工具 yum -y install wget tar zip unzip openssl* gd gd-devel gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel openldap-clients openldap-servers make libmcrypt libmcrypt-devel fontconfig fontconfig-devel libXpm* libtool* libxml2 libxml2-devel t1lib t1lib-devel re2c libaio libaio-devel
7系列的话至此基本上编译所需的库和工具就没有其他需要额外安装的了,例外的是libiconv库,yum至今不支持,不知为何,如下方法检测后决定是否需要编译安装:
##查看国际化字符库iconv是否安装 iconv -l ##该命令将列出iconv支持的所有字符编码,若没有安装libiconv这个库将提示错误 ##可选安装libiconv,若系统已有iconv命令则无需安装 cd /usr/local/src wget https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz tar -zxvf libiconv-1.15.tar.gz cd libiconv-1.15 ./configure --prefix=/usr/local make && make install
下载源码包或二进制可执行程序包:
cd /usr/local/src ##nginx最新稳定版 wget https://nginx.org/download/nginx-1.12.0.tar.gz ##MySQL二进制分发安装包 wget https://mirrors.tuna.tsinghua.edu.cn/mysql/downloads/MySQL-5.6/mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz ##正则匹配库pcre--nginx用到 wget https://ftp.pcre.org/pub/pcre/pcre-8.41.tar.gz ##PHP7.0.21 wget https://cn2.php.net/distributions/php-7.0.21.tar.gz
需要说明的是:MySQL有3种安装方式可选择
1、rpm版二进制优化版,为各个平台独立优化过的rpm包,可能为各平台单独调优过
2、Linux Generic版也就是编译好的二进制分发版,压缩包解压后即可得到二进制程序代码,配置好参数即可使用
3、自己从头源码编译,需要使用cmake,想要了解自主编译流程和原理的可以一试
我们这儿选择Linux Generic版也就是编译好的二进制分发版,理论上来讲稳定性第3种是最好的第1种次之第2种再次之,也说过了是“理论上”,Linux Generic版基于gcc编译,理论上任何支持gcc的linux都可以正常运行,依然是“理论上”,让我抛弃rpm方式安装的原因是该rpm安装后有关MySQL的文件会分别存放至不同的目录。
建立运行组和运行用户和所需目录
nginx、php-fpm以及mysql的运行组和运行用户,以及定制的pid、日志存放目录
#建立PHP-fpm、nginx的运行组和运行用户 #建立MySQL的运行组和运行用户 groupadd nginx #添加php-fpm、nginx运行组 useradd -g nginx nginx #添加php-fpm、nginx运行用户 groupadd mysql #添加mysql运行组 useradd -g mysql mysql #添加mysql运行用户 ulimit -SHn 65535 #提高负载链接数 mkdir -p /data/pid ##存放进程pid文件的目录 mkdir -p /data/log ##存放日志log的目录 mkdir -p /data/mysql/data ##mysql的数据存储目录
二、编译PHP
CentOS7系列之后编译PHP时不需要再额外手动编译依赖库了,上方yum已经全部搞定;你想要额外编译高版本依赖库也没人拦着的。
cd /usr/local/src tar zxvf php-7.0.21.tar.gz cd php-7.0.21 ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-config-file-scan-dir=/usr/local/php/etc/ini --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-mysql-sock=/tmp/mysql.sock --with-gd --with-png-dir --with-jpeg-dir --with-freetype-dir --with-xpm-dir=/usr/ --with-zlib-dir --with-iconv --enable-libxml --enable-xml --enable-shmop --enable-sysvsem --enable-inline-optimization --enable-opcache --enable-mbregex --enable-fpm --enable-mbstring --enable-gd-native-ttf --with-openssl --enable-pcntl --enable-sockets --enable-ftp --enable-zip --with-xmlrpc --enable-soap --with-gettext --with-mcrypt --with-curl --enable-ctype make && make install
这里编译参数中加入了--with-config-file-scan-dir
,这样以后为PHP加入扩展后配置文件就不用动php.ini
,而是在这个参数指定的目录中加入后缀为.ini
的配置文件即可。
配置PHP、PHP-FPM
##复制php配置文件 cp php.ini-production /usr/local/php/etc/php.ini ##修改php配置文件 cd /usr/local/php/etc vi php.ini ##将;date.timezone = 改为date.timezone = PRC 去掉前面的分号,在php配置文件中分号代表注释 ##将expose_php = On改为expose_php = Off ##将disable_functions后加入禁用的几个存在安全风险的函数 ##disable_functions = passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec ###复制service文件 cp ./sapi/fpm/php-fpm.service /usr/lib/systemd/system/ ##配置php-fpm cd /usr/local/php/etc cp php-fpm.conf.default php-fpm.conf cd php-fpm.d cp www.conf.default www.conf vi www.conf ### 将user = nobody改为user = nginx ### 将group = nobody改为group = nginx ##pm.max_children、pm.start_servers等其他调优参数就不做示例了,依据实际内存、应用情况调整 ##启动php-fpm服务 systemctl start php-fpm.service ##查看php-fpm服务的运行状态 systemctl status php-fpm.service ##输出结果中不出意外的话应该会看到绿色的字样:active (running) 这种时候我喜欢绿色,不喜欢红色,特别是红色的failed字样!!! ##将php-fpm服务加入开机启动 systemctl enable php-fpm.service
PHP源码包提供有支持CentOS7系列的systemd服务管理脚本php-fpm.service
,直接复制至指定目录即可使用。
三、编译Nginx
编译安装nginx
nginx的rewrite需要pcre库的支持,nginx依赖的pcre库不需要编译安装,源码目录作为nginx的编译参数即可,当然因为前方已经yum安装依赖库的时候,pcre已经作为依赖被安装上了,你也可以不用指定--with-pcre
这个参数。
##注意ginx依赖的pcre库不需要编译安装,源码目录作为nginx的编译参数即可 cd /usr/local/src tar zxvf pcre-8.41.tar.gz tar zxvf nginx-1.12.0.tar.gz cd nginx-1.12.0 ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.41 --with-http_mp4_module --with-http_flv_module --with-http_realip_module --with-http_image_filter_module --with-http_stub_status_module make && make install
配置nginx
设置nginx主配置文件:
##配置nginx #个人不喜欢修改nginx的配置文件,直接新建,当然新建前记得备份下 mv /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.back vi /usr/local/nginx/conf/nginx.conf #新建nginx配置文件并写入如下内容 ####### user nginx nginx;#此处必须与跑php-fpm的用户、用户组一致 本例均为nginx worker_processes 2; error_log /data/log/nginx_error.log; pid /data/pid/nginx.pid; events { use epoll; worker_connections 4096; } http { include mime.types; default_type application/octet-stream; sendfile on; #tcp_nopush on; server_tokens off;#http头中部显示nginx版本号 http头中仅有Server:nginx项 没有版本号 keepalive_timeout 65; client_max_body_size 8M;#最大post文件体大小 主要针对文件上传 此处8M 也就意味着网站中若有上传的文件大于8M是会上传失败的 gzip on; gzip_min_length 1k; gzip_types text/plain application/x-javascript text/css application/xml; #加载网站主机配置 include /usr/local/nginx/conf/vhost/*.conf; } ####### :wq! #保存退出
设置nginx下“虚拟主机”配置文件:
##新建www.jjonline.cn的nginx配置文件,可以作为一个配置模板 ##以后要新加其他虚拟主机直接复制过来修改下即可 #将网站的nginx配置文件独立处理,依据实际情况修改成你自己的名字 #这里的配置文件名字任意,用网址作为名字仅仅是为了便于自己识别,木有别的含义哟 ##然后就是目录规划,一切都只是为了便于识别和统一规则,不一定非得这样的 mkdir /usr/local/nginx/conf/vhost #建立nginx多个站点配置文件目录 vi /usr/local/nginx/conf/vhost/www.jjonline.cn.conf #建立www.jjonline.cn网站的nginx配置文件 写入配置内容如下: ###### server { listen 80; server_name www.jjonline.cn; charset utf-8; root /var/www/www.jjonline.cn/wwwRoot; index index.html index.htm index.php; location / { if (!-e $request_filename) { rewrite ^/(.*)$ /index.php/$1 last; break; } } #This vhost Log Dir && Log Name access_log /data/log/www.jjonline.cn.log; #Error 404 Page Info error_page 404 /404.html; location = 404.html { root /var/www/www.jjonline.cn/wwwRoot; } #Error 50x Page Info error_page 500 502 503 504 /50x.html; location = /50x.html { root /var/www/www.jjonline.cn/wwwRoot; } #Handle PHP fastcgi location ~ ^(.+\.php)(.*)$ { root /var/www/www.jjonline.cn/wwwRoot; #fastcgi_pass unix:/dev/shm/fpm-dev.sock; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_param PATH_INFO $fastcgi_path_info;##支持php的pathinfo # 检测被执行的php脚本是否存在,不存在则返回404错误 if (!-e $document_root$fastcgi_script_name) { return 404; } # 或者采用下面这种方式 二选一均可 # try_files $fastcgi_script_name = 404; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } #rotots none log location = /robots.txt { allow all; log_not_found off; access_log /dev/null; } #Cache all image 1 month location ~ .*\.(gif|jpg|jpeg|png|bmp|css|js)$ { expires 30d; } #Image not found handler ##当浏览器请求的图片不存在时将网站根目录下的noImage.jpg返回 location ~ .*\.(gif|jpg|jpeg|png|bmp)$ { if (!-f $request_filename){ rewrite ^ /noImage.jpg last; } expires 7d; } #Deny All hidden File location ~ /\. { deny all; access_log /dev/null; log_not_found off; } } ###### :wq! #保存退出
nginx的systemd管理脚本
##nginx服务管理文件处理 vi /lib/systemd/system/nginx.service ##写入如下内容 #### [Unit] Description=The Nginx Web Server Process Manager After=network.target [Service] Type=forking ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quit PrivateTmp=false [Install] WantedBy=multi-user.target ####### :wq! #保存退出 ##nginx开机启动 systemctl enable nginx.service ##启动nginx systemctl start nginx.service
四、解压安装MySQL
解压mysql二进制压缩包并定制mysql二进制程序存储目录
cd /usr/local/src ##解压二进制mysql包 tar zxvf mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz ##文件夹整个移动并重命名至/usr/local/mysql mv mysql-5.6.36-linux-glibc2.5-x86_64 /usr/local/mysql
配置mysql
mysql5.6提供的参考配置文件参考意义不大,直接写:
##删除系统默认自带的mysql配置文件 rm -rf /etc/my.cnf cd /usr/local/mysql vi my.cnf ##写入如下内容 #### [client] port = 3306 socket = /tmp/mysql.sock default-character-set = utf8 [mysqld] # log_bin basedir = /usr/local/mysql datadir = /data/mysql/data server_id = 1 port = 3306 socket = /tmp/mysql.sock table_open_cache = 256 max_allowed_packet = 32M max_heap_table_size = 128M read_rnd_buffer_size = 16M sort_buffer_size = 16M join_buffer_size = 16M query_cache_size = 32M query_cache_limit = 1M #default_table_type = InnoDB tmp_table_size = 64M character-set-server = utf8 performance_schema_max_table_instances = 128 table_definition_cache = 128 table_open_cache = 256 ##sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION [mysql] #bind-address = 127.0.0.1 #pid-file = /data/pid/mysql.pid user = mysql default-character-set = utf8 [mysqld_safe] log-error = /data/log/mysqld.log sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" #### :wq! #保存退出 ##做一个软连接 ln -s /usr/local/mysql/my.cnf /etc/my.cnf
MySQL启动文件配置
MySQL提供的服务管理文件还是SysVinit模式的,因为systemd可以兼容使用,修改下
vi ./support-files/mysql.server ## 将如下位置完善 basedir=/usr/local/mysql datadir=/data/mysql/data
然后基于SysVinit脚本编写systemd的服务管理脚本:
vi /lib/systemd/system/mysql.service [Unit] Description=MySQL Community Server After=syslog.target network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/data/pid/mysql.pid ExecStart=/usr/local/mysql/support-files/mysql.server start ExecReload=/usr/local/mysql/support-files/mysql.server restart ExecStop=/usr/local/mysql/support-files/mysql.server stop PrivateTmp=false [Install] WantedBy=multi-user.target
注意PrivateTmp必须是false
,否则/tmp/mysql.sock
将被放置在一个文件夹中。
初始化MySQL、设置root密码、设置环境变量
初始化MySQL
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/data/mysql/data --user=mysql #初始化mysql
启动MySQL并设置MySQL开机启动
#启动mysql systemctl start mysql.service #systemctl start mysql是一样的 ### #可能在启动时会有权限问题,执行: chown -R mysql:mysql /data/mysql/data touch /data/log/mysql.log ### ##设置mysql开机启动 systemctl enable mysql.service #设置mysql的root账户密码 #敲入如下命令 #连续两次回车后输入需要设置的密码(也是要输入两次)即可 /usr/local/mysql/bin/mysqladmin -u root -p password ##第一次回车是执行这个命令,第二次回车是输入mysql的默认密码也就是一个空密码
设置环境变量
##这里设置的环境变量有MySQL、PHP、以及nginx vi /etc/profile #在文件末尾添加 export PATH=$PATH:/usr/local/mysql/bin:/usr/local/nginx/sbin:/usr/local/php/bin:/usr/local/php/sbin #此处可以参考本博客另外一篇文章:《centos手动添加系统环境变量》https://blog.jjonline.cn/linux/165.html :wq! #保存退出 source /etc/profile #环境变量立即生效
限于篇幅原因,其他Redis、php的redis扩展以及ftp之类的可以参考:https://blog.jjonline.cn/linux/184.html,不再赘述。
nginx支持https,申请ssl证书的可以参考:https://blog.jjonline.cn/linux/221.html
nginx的访问日志每日切割管理,可以参考:https://blog.jjonline.cn/linux/170.html
对新手来说有点难, 我们新手用宝塔比较省事