自己动手在centos7编译安装nginx+php+mysql三件套

创建mysql目录 mkdir -p /usr/local/src/mysql

安装编译环境依赖包 yum -y install gcc gcc-c++ glibc automake autoconf libtool make

开始编译工作

1
2
3
4
5
6
cd /usr/local/src/mysql

# mysql5.7依赖这个版本,不要更换到最新版
wget https://nchc.dl.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz

wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.39.tar.gz

编译安装cmake包(本人直接安装依赖包,可选)

1
2
3
4
5
6
7
wget https://github.com/Kitware/CMake/releases/download/v3.14.5/cmake-3.14.5.tar.gz

tar -zxvf cmake-3.14.5.tar.gz
cd cmake-3.14.5
./bootstrap
gmake
gmake install

直接安装mysql依赖包

1
2
3
4
5
6
7
8
9
10
11
yum install ncurses-devel cmake -y

解压好boost
tar xf boost_1_59_0.tar.gz -C /usr/local/
mv /usr/local/boost_1_59_0 /usr/local/boost

mkdir -p /database/mysql/{data,tmp,binlog,logs}
tree -L 2 /database/

groupadd mysql
useradd mysql -s /sbin/nologin -M -g mysql

开始正式的编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
tar xf mysql-5.7.39.tar.gz
cd mysql-5.7.39

cmake . -DCMAKE_INSTALL_PREFIX=/database/mysql \
-DMYSQL_DATADIR=/database/mysql/data \
-DMYSQL_UNIX_ADDR=/database/mysql/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii \
-DENABLED_LOCAL_INFILE=ON \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITHOUT_PARTITION_STORAGE_ENGINE=1 \
-DWITH_ZLIB=bundled \
-DWITH_EMBEDDED_SERVER=1 \
-DWITH_DEBUG=0 \
-DWITH_BOOST=/usr/local/boost

make && make install

mysql配置文件说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
编译参数 说明
-
DCMAKE_INSTALL_PREFIX=/database/mysql-5.7.27
设定mysql安装目录
-DMYSQL_DATADIR=/database/mysql-5.7.27/data
设定mysql数据文件目录
-DMYSQL_UNIX_ADDR=/database/mysql-5.7.27/tmp/mysql.sock
设定mysql.sock路径
-DDEFAULT_CHARSET=utf8
设定默认的字符集为utf8
-DDEFAULT_COLLATION=utf8_general_ci
设定默认排序规则
-DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii
启用额外的字符集类型
-DENABLED_LOCAL_INFILE=ON
启用本地数据导入支持
-DWITH_INNOBASE_STORAGE_ENGINE=1
启用存储引擎;若想启用某个引擎的支持,
-DWITHSTORAGEENGINE=1;
若想禁用某个引擎的支持,
-DWITHOUT_STORAGE_ENGINE=0
-DWITH_FEDERATED_STORAGE_ENGINE=1 启用存储引擎
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 启用存储引擎
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 启用存储引擎
-DWITHOUT_PARTITION_STORAGE_ENGINE=1 启用存储引擎
-DWITH_ZLIB=bundled 启用zlib库支持
-DWITH_EMBEDDED_SERVER=1 编译嵌入式服务器支持
-DWITH_DEBUG=0 禁用debug(默认为禁用)
-DWITH_BOOST=/usr/local/boost 启用boost库支持,MySQL 5.7版本编译安装需要依赖boost库

链接mysql目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
echo 'export PATH=/database/mysql/bin:$PATH' >>/etc/profile

source /etc/profile
chown -R mysql:mysql /database/mysql/

# 编辑my.cnf配置文件
mv /etc/my.cnf /etc/my.cnf.bak
touch /etc/my.cnf
chown mysql:mysql /etc/my.cnf
nano /etc/my.cnf

# 初始化mysql目录,如果失败请删除data下所有文件重来
# 生成初始化密码参数(5.7版本才有),必须要添加,否则会初始化失败,会生成空密码
# --initialize-insecure
# 设定初始化用户 --user=mysql
cd /database/mysql/
./bin/mysqld --initialize-insecure --user=mysql --basedir=/database/mysql --datadir=/database/mysql/data

# 开启ssl加密连接
cd /database/mysql/
./bin/mysql_ssl_rsa_setup --initialize-insecure --user=mysql --basedir=/database/mysql --datadir=/database/mysql/data
cd /database/mysql/data/
chown mysql:mysql /etc/my.cnf
chmod +r server-key.pem

# 启动mysql并设置成开机启动
cd ..
cp support-files/mysql.server /etc/init.d/mysqld
systemctl daemon-reload
chkconfig mysqld on
/etc/init.d/mysqld start

my.cnf配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[client]
port = 3306
socket = /database/mysql/tmp/mysql.sock
default-character-set = utf8
[mysqld]
port = 3306
user = mysql
basedir = /database/mysql
datadir = /database/mysql/data
pid-file = /database/mysql/mysqld.pid
socket = /database/mysql/tmp/mysql.sock
tmpdir = /database/mysql/tmp
character_set_server = utf8
server-id = 1
max_connections = 100
max_connect_errors = 10
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
log-bin = /database/mysql/binlog/mysql-bin
log-error = /database/mysql/logs/mysql_5_7_39.err

配置文件说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
[client]
# 默认连接端口
port = 3306
# 用于本地连接的socket套接字
socket = /database/mysql/tmp/mysql.sock
# 编码
default-character-set = utf8
5、初始化 MySQL 数据库

设定mysql工作目录
[mysqld]
# 服务端口号,默认3306
port = 3306
# mysql启动用户
user = mysql
# mysql安装根目录
basedir = /database/mysql
# mysql数据文件所在位置
datadir = /database/mysql/data
# pid文件所在目录
pid-file = /database/mysql/mysqld.pid
# 为MySQL客户端程序和服务器之间的本地通讯指定一个套接字文件
socket = /database/mysql/tmp/mysql.sock
# MySQL存放临时文件的目录
tmpdir = /database/mysql/tmp
# 数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)
character_set_server = utf8
# MySQL服务的唯一编号,每个mysql服务Id需唯一
server-id = 1
# 最大连接数
max_connections = 100
# 最大错误连接数
max_connect_errors = 10
# sql_mode,定义了mysql应该支持的sql语法,数据校验
# NO_ENGINE_SUBSTITUTION:如果需要的存储引擎被禁用或未编译,可以防止自动替换存储引擎
# STRICT_TRANS_TABLES:存储引擎启用严格模式,非法数据值被拒绝
# NO_AUTO_CREATE_USER:禁止GRANT创建密码为空的用户
# NO_AUTO_VALUE_ON_ZERO:默认情况下自增长列是从1开始的,如果你插入值为0的数据会报错,设置
这个之后就可以正常插入为0的数据了
# NO_ZERO_IN_DATE:在严格模式,不接受月或日部分为0的日期
# NO_ZERO_DATE:在严格模式,不要将 ‘0000-00-00ʹ做为合法日期
# ERROR_FOR_DIVISION_BY_ZERO:在严格模式,在INSERT或UPDATE过程中,如果被零除(或
MOD(X,0)),则产生错误(否则为警告)。如果未给出该模式,被零除时MySQL返回NULL
# PIPES_AS_CONCAT:将视为字符串连接操作符(+)(同CONCAT()),而不视为OR
# ANSI_QUOTES:将‘”'视为识别符引号(‘`'引号字符),不要视为字符串的引号字符
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
# 开启二进制日志功能,binlog数据位置
log-bin = /database/mysql/binlog/mysql-bin
# mysql生成的错误日志存放的路径
log-error = /database/mysql/logs/mysql_5_7_27.err

安装编译nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel perl-devel perl-ExtUtils-Embed gd-devel

mkdir -p /usr/local/src/nginx
cd /usr/local/src/nginx
wget http://nginx.org/download/nginx-1.22.1.tar.gz
useradd -s /sbin/nologin -M nginx
mkdir -p /var/tmp/nginx/client/
cd /usr/local/src/nginx

tar zxvf nginx-1.22.1.tar.gz
cd nginx-1.22.1
./configure \
--user=nginx \
--group=nginx \
--prefix=/usr/local/nginx \
--conf-path=/etc/nginx/nginx.conf \
--sbin-path=/usr/sbin/nginx \
--error-log-path=/var/log/nginx/nginx_error.log \
--http-log-path=/var/log/nginx/nginx_access.log \
--pid-path=/usr/local/nginx/run/nginx.pid \
--lock-path=/usr/local/nginx/lock/nginx \
--with-http_image_filter_module \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-http_perl_module \
--with-mail \
--with-mail_ssl_module \
--with-pcre \
--http-client-body-temp-path=/var/tmp/nginx/client/ \
--http-proxy-temp-path=/var/tmp/nginx/proxy \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--http-scgi-temp-path=/var/tmp/nginx/scgi
make && make install

配置文件说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
./configure
--user=nginx \ # worker进程运行用户
--group=nginx \ # worker进程运行的组
--prefix=/usr/local/nginx \ # Nginx安装的根路径,所有其他的路径
都要依赖于改选项
--conf-path=/etc/nginx/nginx.conf \ # 如果在命令行没有指定配置文件,那么
将会通过这里指定的路径,Nginx将会去那里查找它的配置文件
--sbin-path=/usr/sbin/nginx \ # 指定Nginx二进制文件的路径。如果没
有指定,那么这个路径会依赖于--prefix选项
--error-log-path=/var/log/nginx/nginx_error.log \ # 指定错误文件的路径,Nginx将会往
其中写入错误日志文件,除非有其他配置
--http-log-path=/var/log/nginx/nginx_access.log \ # http访问日志的默认路径
--pid-path=/usr/local/nginx/run/nginx.pid \ # 指定的文件将会写入Nginx master进
程的pid,通常在/var/run下
--lock-path=/usr/local/nginx/lock/nginx \ # 共享存储器互斥锁文件的路径
--with-http_ssl_module \ # 启用 ngx_http_ssl_module 支持
(使支持 https 请求,需已安装openssl)
--with-http_realip_module \ # 启用 ngx_http_realip_module 支
持(这个模块允许从请求标头更改客户端的 IP 地址值,默认为关)
--with-http_addition_module \ # 启用 ngx_http_addition_module
支持(作为一个输出过滤器,支持不完全缓冲,分部分响应请求)
--with-http_sub_module \ # 启用 ngx_http_sub_module 支持
(允许用一些其他文本替换nginx 响应中的一些文本)
--with-http_dav_module \ #启用ngx_http_dav_module支持(增加
PUT,DELETE,MKCOL:创建集合,COPY 和 MOVE 方法)默认情况下为关闭,需编译开启
--with-http_flv_module \ # 启用 ngx_http_flv_module 支持
(提供寻求内存使用基于时间的偏移量文件)
--with-http_gzip_static_module \ # 启用
ngx_http_gzip_static_module 支持(在线实时压缩输出数据流)
--with-http_stub_status_module \ # 启用ngx_http_stub_status_module
支持(获取nginx自上次启动以来的工作状态)
--with-http_perl_module \ # Nginx配置能够扩展使用Perl代码。这
个选项启用这个模块(然而使用这个模块会降低性能)
--with-mail \ # 该选项用于启用mail模块,该模块默认
没有被激活
--with-mail_ssl_module \ # 为了代理任何一种类型的使用SSL/TLS
的mail,激活该模块
--with-pcre \
--http-client-body-temp-path=/var/tmp/nginx/client/ \ # 从客户端收到请求后,该选项
设置的目录用于作为请求体零食存放的目录,如果WebDAV模块启用,那么推荐设置该路径为同一文件系统
上的目录作为最终的目的地
--http-proxy-temp-path=/var/tmp/nginx/proxy \ # 在使用代理后,通过该选项设置存放临
时文件路径
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi \ # 设置FastCGI临时文件的目录
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \ # 设置uWSGI临时文件的目录
--http-scgi-temp-path=/var/tmp/nginx/scgi # 设置SCGI临时文件的目录

设置nginx开机启动项

1
2
3
4
5
6
7
8
9
10
11
12
13
vim /lib/systemd/system/nginx.service

[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/usr/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
./configure \
--prefix=/usr/local/php7 \
--with-config-file-path=/usr/local/php7 \
--with-config-file-scan-dir=/usr/local/php7/php.d \
--enable-mysqlnd \
--with-mysqli \
--with-pdo-mysql \
--enable-fpm \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--enable-gd \
--with-iconv \
--with-zlib \
--enable-xml \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-mbregex \
--enable-mbstring \
--enable-ftp \
--with-openssl \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--with-zip \
--enable-soap \
--without-pear \
--with-gettext \
--enable-session \
--with-curl \
--with-jpeg \
--with-freetype \
--enable-opcache