您的位置:晶晶的博客>Linux>CentOS7.3编译安装nginx1.12.0、PHP7.0.21、MySQL5.6.36

CentOS7.3编译安装nginx1.12.0、PHP7.0.21、MySQL5.6.36

最近配置了一台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

转载请注明本文标题和链接:《CentOS7.3编译安装nginx1.12.0、PHP7.0.21、MySQL5.6.36

相关推荐

哟嚯,本文评论功能关闭啦~

  1. #1

    对新手来说有点难, 我们新手用宝塔比较省事

    值得入手 4年前 (2020-06-24) 回复
  2. #2

    新搭建好的centos系统,按照文章中的步骤安装nginx和php都成功了,唯独安装mysql一直不成功.systemctl start mysql.service的时候一直报THE SERVER QUIT WITHOUT UPDATING PID FILE错误

    穆勒 6年前 (2018-05-05) 回复
    • @穆勒:注释掉service文件里的PIDFile内容

      晶晶 6年前 (2018-05-07) 回复
    • @穆勒:问题解决了。其实就是初始化mysql的时候失败导致的。

      穆勒 6年前 (2018-08-22) 回复
    • @穆勒:博主提供的初始化方法是旧的,5.7+版本mysql初始化语句:
      /usr/local/mysql/bin/mysqld --initialize --basedir=/usr/local/mysql --datadir=/data/mysql/data/ --user=mysql,
      可能会提示libnuma.so.1文件不存在,执行yum -y install numactl.x86_64就能解决
      初始化mysql之后就能启动mysql了

      穆勒 6年前 (2018-08-22) 回复
      • @穆勒:另外一点需要注意的是,初始化之后会随机生成一个root@localhost账户的登录密码,要记录下来

        穆勒 6年前 (2018-08-23) 回复
        • @穆勒:这次安装提示THE SERVER QUIT WITHOUT UPDATING PID FILE,是因为缺失/data/log/mysqld.log文件

          穆勒 5年前 (2018-11-06)
  3. #3

    我仔细看看是什么情况!

    该昵称已屏蔽 7年前 (2017-10-11) 回复
  4. #4

    好文章!

    Before80 7年前 (2017-10-07) 回复
  5. #5

    学习学习,参考参考,研究研究!

    笑八达 7年前 (2017-08-24) 回复