Centos7.2源码编译安装LNMP环境

实验环境: Centos7.2 minimal 64位系统

服务器IP:192.168.10.21

  • 说明:
  1. 安装包已经提前下载好,此文档中不再演示下载步骤
  2. 根据笔者习惯,所有的源码包都在/a01/apps/apps_src/
  3. 所有的服务安装路径都在/a01/apps/xxxxxxx
  4. 其实和之前的文章《Centos6.5源码编译搭建LNMP环境》一样的步骤,只是其中的部分命令有些变化而已,注意区分即可
  • 包版本:
    1
    2
    3
    Nginx: 	nginx-1.12.0.tar.gz
    PHP: libmcrypt-2.5.7.tar.gz、php-7.1.7.tar.gz
    MySQL: mysql-5.7.19.tar.gz或者mysql-boost-5.7.19.tar.gz

一、编译安装Nginx

  1. 安装依赖
    1
    yum -y install pcre-devel zlib-devel gcc gcc-c++ openssl-devel

1
2
3
4
5
6
其中:
zlib: nginx提供 gzip 模块,需要 zlib 库支持

openssl: nginx提供 ssl 功能

pcre: 支持地址重写 rewrite 功能
  1. 解包

    1
    2
    tar -zxvf nginx-1.12.0.tar.gz
    cd nginx-1.12.0
  2. 配置

    1
    ./configure --prefix=/a01/apps/nginx --conf-path=/etc/nginx/nginx.conf --pid-path=/a01/apps/nginx/run/nginx.pid --user=www --group=www --http-log-path=/a01/apps/nginx/log/access.log --error-log-path=/a01/apps/nginx/log/error.log --with-http_ssl_module --with-http_dav_module --with-http_stub_status_module --with-http_mp4_module

1
2
3
4
5
6
其中:
1)configure命令的作用是检测系统环境,配置nginx设置,最后生成Makefile文件
2)--with-http_ssl_module:使用https协议模块,对流量进行加密,需要openssl库
3)--with-http_dav_module:为文件和目录指定权限,限制不同类型用户对于页面有不同操作权限
4)--with-http_stub_status_module:这个模块可以取得一些nginx的运行状态
5)--with-http_mp4_module:支持H.264/AAC文件为伪流媒体
  1. 编译
    1
    make -j 4
  • make的作用:make是把Makefile文件中的指令编译成计算机认识的二进制文件
  • -j 4的作用:比如我的服务器是4核CPU,同时启用4核来编译,速度更快,2核就-j 2
  1. 安装

    1
    make install
  2. 创建运行nginx的用户

    1
    useradd -M -s /sbin/nologin www
  3. 创建软链接

    1
    ln -s /a01/apps/nginx/sbin/nginx /usr/local/sbin/
  4. 配置全局变量

    1
    2
    echo "export PATH=$PATH:/a01/apps/nginx/sbin">> /etc/profile
    source /etc/profile
  5. 修改nginx配置文件

    1
    vim /etc/nginx/nginx.conf

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#user  nobody;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
use epoll;
worker_connections 1024;
}


http {
include mime.types;
default_type application/octet-stream;

#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent""$http_x_forwarded_for"';

#access_log logs/access.log main;
server_tokens off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;

#keepalive_timeout 0;
keepalive_timeout 65;

gzip on;
gzip_min_length 1k;
gzip_types text/plain application/x-javascript text/css application/xml;

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;

server {
listen 80;
server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
root html;
index index.php index.html index.htm;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}



location /nginx_status {
stub_status on;
access_log off;
}



# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}


# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;

# location / {
# root html;
# index index.html index.htm;
# }
#}


# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;

# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;

# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;

# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;

# location / {
# root html;
# index index.html index.htm;
# }
#}

}

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
其中:
标红的部分为新添加的部分,参数详解为:
worker_processes 1; #nginx进程数,一般设置为和CPU核数一样
use epoll; #多路复用IO中的一种方式,仅用于linux2.6以上内核,可大大提高nginx性能
worker_connections 1024; #单个后台worker_processes进程的最大并发连接数,系统优化后可调整
server_tokens off; #隐藏响应header和错误(404等)通知中的版本号
sendfile on; #开启高效传输模式
tcp_nopush on; #减少网络报文段的数量
tcp_nodelay on; #内核会等待将更多的字节组成一个数据包,从而提高I/O性能
gzip on; #开启压缩功能
gzip_min_length 1k; #允许压缩的页面最小字节,建议大于1k,如果小于1k可能会越压越大
gzip_types text/plain application/x-javascript text/css application/xml; #指定“text/html”类型总是会被压缩

#以下参数是为了改善网站性能,减少资源占用,提高访问速度
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;

location ~ \.php$ {
root html; #网站的根目录
fastcgi_pass 127.0.0.1:9000; #通过fastcgi接口将请求发送给这个IP
fastcgi_index index.php; #设置首页
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #在浏览器中访问.php的文件时,实际读取的是$document_root(网站根目录)下的.php文件
include fastcgi_params;
}


#以下参数为设定查看nginx状态的地址
location /nginx_status {
stub_status on;
access_log off;
}
  1. 检测nginx配置文件是否有错误
    1
    nginx -t

1
2
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
  1. 开启防火墙80端口

    1
    2
    firewall-cmd --add-port=80/tcp --permanent
    systemctl reload firewalld
  2. 启动nginx

    1
    /a01/apps/nginx/sbin/nginx

1
2
3
关闭:/a01/apps/nginx/sbin/nginx -s stop
重新加载:/a01/apps/nginx/sbin/nginx -s reload
可使用/a01/apps/nginx/sbin/nginx -h查看相关参数
  1. 编写nginx脚本加入系统服务
    1
    2
    cd /etc/systemd/system
    vim nginx.service

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=nginx web server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/a01/apps/nginx/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/a01/apps/nginx/sbin/nginx -s reload
ExecStop=/a01/apps/nginx/sbin/nginx -s stop

[Install]
WantedBy=multi-user.target

  1. 加入系统服务并开机自启
    1
    2
    chmod 754 nginx.service
    systemctl enable nginx

Nginx和Apache处理PHP文件过程的区别

1
2
3
nginx-->php-fpm-->php

apache+libphp5.so/libphp7.so-->php
  • 找到一张图说明一下:
    Pret0I.png

二、编译安装PHP

  1. 安装依赖

    1
    yum -y install libxml2-devel bzip2-devel libcurl-devel libjpeg-devel libpng-devel readline-devel freetype freetype-devel
  2. 安装libmcrypt(下载地址https://sourceforge.net/projects/mcrypt/files/Libmcrypt/)

    1
    2
    3
    tar -zxvf libmcrypt-2.5.7.tar.gz
    cd libmcrypt-2.5.7
    ./configure --prefix=/a01/apps/libmcrypt && make -j 4 && make install && echo $?
  3. 解包 (下载地址http://php.net/releases/)

    1
    2
    tar -zxvf php-7.1.7.tar.gz
    cd php-7.1.7
  4. 配置

    1
    ./configure --prefix=/a01/apps/php7 --with-config-file-path=/etc/php --with-mcrypt=/a01/apps/libmcrypt/ --enable-fpm --with-fpm-user=www --with-fpm-group=www --enable-mysqlnd --with-mysqli --with-pdo-mysql --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib-dir --with-libxml-dir --disable-rpath --enable-bcmath --enable-inline-optimization --with-curl --enable-mbstring --with-mhash --with-gd --with-openssl --enable-zip --with-bz2 --enable-ftp --with-gettext

PreaAP.png

1
2
3
报错了,解决:
方法一:export LD_LIBRARY_PATH=/lib/:/usr/lib/:/usr/local/lib
方法二:configure后边加上--with-libdir=lib64
  • 加上参数之后重新配置,又报新的错误了……
    PreB9S.png
  • 解决:
  • 去重新配置编译一下libmcrypt,把指定的路径取消:
    1
    2
    rm -rf /a01/apps/libmcrypt
    ./configure && make -j 4 && make install && echo $?
  • 编译安装好libmcrypt之后,我们再继续配置php,把指定libmcypt模块的路径也取消:
    1
    ./configure --prefix=/a01/apps/php7 --with-config-file-path=/etc/php --with-mcrypt --enable-fpm --with-fpm-user=www --with-fpm-group=www --enable-mysqlnd --with-mysqli --with-pdo-mysql --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib-dir --with-libxml-dir --disable-rpath --enable-bcmath --enable-inline-optimization --with-curl --enable-mbstring --with-mhash --with-gd --with-openssl --enable-zip --with-bz2 --enable-ftp --with-gettext

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
51
52
53
其中:
参数详解为:
--with-mcrypt #mcrypt算法扩展模块
--enable-fpm #开启fpm模式(nginx等服务用的)

#以下简单说明以下mysqlnd参数:
--enable-mysqlnd
--with-mysqli
--with-pdo-mysql

mysqldnd即mysql native driver简写,即是由PHP源码提供的mysql驱动连接代码.它的目的是代替旧的libmysql驱动.传统的安装php的方式中,我们在编译PHP时,一般需要指定以下几项:
--with-mysql=/usr/local/mysql
--with-pdo-mysql=/usr/local/mysql

这实际上就是使用了mysql官方自带的libmysql驱动, 这是比较老的驱动, PHP 5.3开始已经不建议使用它了, 而建议使用mysqlnd

为何要使用mysqlnd驱动?
A.libmysql驱动是由mysql AB公司(现在是oracle公司)编写, 并按mysql license许可协议发布,所以在PHP中默认是被禁用的.

而mysqlnd是由php官方开发的驱动,以php license许可协议发布,故就规避了许可协议和版权的问题

B.因为mysqlnd内置于PHP源代码,故你在编译安装php时就不需要预先安装mysql server也可以提供mysql client API (mysql_connect, pdo , mysqli), 这将减化一些工作量.

C. mysqlnd是专门为php优化编写的驱动,它使用了PHP本身的特性,在内存管理,性能上比libmysql更有优势. php官方的测试是:libmysql将每条记录在内存中保存了两份,而mysqlnd只保存了一份

D. 一些新的或增强的功能
增强的持久连接
引入特有的函数mysqli_fetch_all()
引入一些性能统计函数mysqli_get_cache_stats(), mysqli_get_client_stats(),
mysqli_get_connection_stats(),
使用上述函数,可很容易分析mysql查询的性能瓶颈!
SSL支持(从php 5.3.3开始有效)
压缩协议支持
命名管道支持(php 5.4.0开始有效)

--with-freetype-dir #打开对freetype字体库的支持
--with-jpeg-dir #打开对JPEG图片的支持
--with-png-dir #打开对PNG图片的支持
--with-zlib-dir #打开zlib库的支持,用于http压缩传输
--with-libxml-dir #打开libxml2库的支持
--disable-rpath #关闭额外的运行库文件
--enable-bcmath #打开图片大小调整,用到zabbix监控的时候用到这个模块
--enable-inline-optimization #优化线程
--with-curl #打开crul浏览工具的支持
--enable-mbstring #启用多字节字符串的支持
--with-mhash #mhash算法扩展模块
--with-gd #打开gd库的支持
--with-openssl #打开openssl的支持,加密传输https时用到的
--enable-zip #打开对zip的支持
--with-bz2 #打开对bz2文件的支持
--enable-ftp #打开ftp的支持
--with-gettext #打开GNU的gettext的支持,编码库用到的
--with-pear #打开pear命令的支持,php扩展用到的
  1. 编译

    1
    make -j 4
  2. 安装

    1
    make install
  3. 创建php配置文件目录

    1
    mkdir -p /etc/php/
  4. 生成php配置文件

    1
    cp /a01/apps/apps_src/php-7.1.7/php.ini-production /etc/php/php.ini
  5. 创建php-fpm配置文件

    1
    2
    cp /a01/apps/php7/etc/php-fpm.conf.default /etc/php/php-fpm.conf
    cp /a01/apps/php7/etc/php-fpm.d/www.conf.default /a01/apps/php7/etc/php-fpm.d/www.conf
  6. 编写php-fpm脚本服务

    1
    2
    cd /etc/systemd/system
    vim php-fpm.service

1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=php-fpm
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/a01/apps/php7/sbin/php-fpm --daemonize --fpm-config /etc/php/php-fpm.conf --pid /var/run/php-fpm.pid
ExecStop=kill -QUIT `cat $PHP_FPM_PID`

[Install]
WantedBy=multi-user.target

  1. 开机自启

    1
    2
    chown 754 php-fpm.service
    systemctl enable php-fpm
  2. 配置全局变量

    1
    2
    echo "export PATH=$PATH:/a01/apps/php7/bin/">> /etc/profile
    source /etc/profile
  3. 编写测试网页测试nginx是否支持php

    1
    2
    cd /a01/apps/nginx/html/
    vim test.php

1
2
3
<?php
phpinfo();
?>

http://192.168.10.21/test.php
PreIc4.png

  1. nginx和apache支持php的运行原理对比
    Pre7u9.png

三、编译安装MySQL

  • 这里说一下怎么下载MySQL的源码包,我也被整蒙圈了好一会,希望写下来可以帮助到正在看这篇文章的读者们。
  • 首先进入以上下载地址,选择版本,只能下载社区版的,企业版收费
    PreLAx.png
  • 选择Source Code源码包:
    Prev9O.png
  • 这里就是最关键的一步了,必须要选择All,如果选择了下边的指定系统版本,根本就找不到源码包:
    Prex3D.png
  • 接下来往下拉到页底找到后缀为tar.gz的包,然后Download即可
    PrmSjH.png
  • 可以看到,有一个mysql-5.7.19.tar.gz和一个mysql-boost-5.7.19.tar.gz,这两个其实都一样,唯一的区别是一个源码包带有boost,而另一个没有带boost。本章中就下载带boost的源码包来演示,因为MySQL5.7之后安装需要boost扩展才能进行安装,为了减少再下载boost的步骤,我直接选择了带boost的源码包
  1. 安装依赖

    1
    yum -y install cmake bison-devel ncurses-devel openssl-devel bison ncurses autoconf
  2. 解包

    1
    2
    3
    4
    注:
    A.从MySQL5.5版本开始,使用cmake进行编译设置
    B.从MySQL5.7版本开始,安装MySQL需要依赖Boost的C++扩展
    C.根据官方文档提示,MySQL安装过程比较消耗内存,像很多阿里服务器的1/2G内存在编译的过程可能会出现编译失败的现象,请提前做好swap交换内存

1
2
tar -zxvf mysql-boost-5.7.19.tar.gz
cd mysql-5.7.19/
  1. 配置
    1
    cmake -DCMAKE_INSTALL_PREFIX=/a01/apps/mysql -DSYSCONFDIR=/etc/mysql -DMYSQL_DATADIR=/a01/apps/mysql/data -DMYSQL_UNIX_ADDR=/tmp/mysql.sock  -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DENABLED_LOCAL_INFILE=1 -DWITH_BOOST=/a01/apps/apps_src/mysql-5.7.19/boost/

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
其中:
参数详解为:

-DCMAKE_INSTALL-PREFIX=/a01/apps/mysql
#指定mysql安装的根目录,只要/a01/apps/目录存在就可以了,mysql目录在安装时,会自动创建,这个值可以在服务启动时,通过--basedir来设置。

-DSYSCONFDIR=/etc/mysql
#指定mysql配置文件目录

-DMYSQL_DATADIR=/a01/apps/mysql/data
#指定mysql数据库存放数据的目录

-DMYSQL_UNIX_ADDR=/tmp/mysql.sock
#mysql服务用于监听的套接字,这个必须是一个绝对路径,默认是/tmp/mysql.sock。在服务启动时,可通过--socket来设置

-DDEFAULT_CHARSET=utf8
#设置mysql默认使用utf8字符集,不指定,默认使用latin1西欧字符集

-DDEFAULT_COLLATION=utf8_general_ci
#默认字符校对

-DWITH_EXTRA_CHARSETS=all
#指定mysql扩展字符集支持所有的字符集。默认mysql支持所有字符集

-DWITH_MYISAM_STORAGE_ENGINE=1
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_MEMORY_STORAGE_ENGINE=1
#静态编译Myisam、Innobase、Memory存储引擎到mysql服务,这样mysql服务就支持这三种存储引擎了

-DWITH_READLINE=1
#支持readline库

-DENABLED_LOCAL_INFILE=1
#允许从本地导入数据,启用加载本地数据

-DWITH_BOOST=/a01/apps/apps_src/mysql-5.7.19/boost/
#指定boost路径来配置mysql

具体参数详解请看官方文档:
https://dev.mysql.com/doc/refman/5.5/en/source-configuration-options.html

  1. 编译

    1
    make -j 4
  2. 安装

    1
    make install
  3. 创建MySQL配置文件目录

    1
    mkdir -p /etc/mysql
  4. 生成mysql配置文件
    这里的配置文件我又要说一句了,之前编译安装完MySQL之后,可以在support-files/目录下找到MySQL的配置文件,但是我这次怎么也找不到了,不知道是不是版本的问题,那目前只能是自己去修改/etc/my.cnf这个本身就有的配置文件了

1
2
mv /etc/my.cnf /etc/mysql/
vim /etc/mysql/my.cnf

1
2
3
4
5
6
7
8
9
10
[mysqld]
datadir=/a01/apps/mysql/data
socket=/tmp/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

  1. 编写MySQL启动脚本
    1
    2
    cd /etc/systemd/system
    vim mysqld.service

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=mysql
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking

ExecStart=/a01/apps/mysql/support-files/mysql.server start
ExecReload=/a01/apps/mysql/support-files/mysql.server restart
ExecStop=/a01/apps/mysql/support-files/mysql.server stop

[Install]
WantedBy=multi-user.target

  1. 开机自启

    1
    2
    chmod 754 mysqld.service
    systemctl enable mysqld
  2. 创建运行MySQL的用户并授权

    1
    2
    useradd -M -s /sbin/nologin mysql
    chown -R mysql:mysql /a01/apps/mysql/
  3. 初始化数据库

    1
    /a01/apps/mysql/bin/mysqld --initialize-insecure --basedir=/a01/apps/mysql/ --datadir=/a01/apps/mysql/data --user=mysql

Prm9ud.png

  • 出现了一堆警告,这里我们先不解决
  1. 启动MySQL

    1
    systemctl start mysqld
  2. 开启防火墙3306端口

    1
    2
    firewall-cmd --add-port=3306/tcp --permanent
    systemctl reload firewalld
  3. 配置全局变量

    1
    2
    echo "export PATH=$PATH:/a01/apps/mysql/bin">> /etc/profile
    source /etc/profile
  4. 使用mysql命令登录测试

    1
    mysql

PrmFEt.png

  1. 设置mysql root密码
    1
    mysqladmin -u root password

PrmVC8.png

  • 发现一处警告:
  • 警告:由于密码将以纯文本格式发送到服务器,请使用SSL连接确保密码安全。
博主QQ:1012405802
技术交流QQ群:830339411
版权声明:网站内容有原创和转载,如有侵权,请联系删除,谢谢!!
感谢打赏,93bok因你们而精彩!!(支付宝支持花呗)
0%