PHP environment lnmp source installation

LNMP动态网站部署架构是一套由Linux + Nginx + MySQL + PHP组成的动态网站系统解决方案。

Source Package

Environment

Centos7 + nginx1.4 + mysql8 + php7.2

Preparation

准备工作需要安装编译器gcc、gcc-c++,还有下载解压wget、tar等及其它软件依赖,可使用yum安装。(如未配置yum源,请查看配置安装yum源软件仓库文章)

1
$ yum -y install gcc gcc-c++ wget tar

mysql5.5后的版本需要使用cmake安装,这里安装一下cmake

1
2
3
$ cd /usr/local/src/cmake-3.13.0
$ ./bootstrap
$ gmake && gmake install

Download and Unpack

接下来需要下载并解压搭建LNMP所需要的源码包,这里统一下载到/usr/local/src目录下,可使用wget进行下载,tar进行解压。

1
2
3
4
#wget下载源码包
wget http://xxx.com/xxx-version.tar.gz
#tar解压源码包
tar xvf xxx-version.tar.gz

Install NGINX

上面已经完成所有源码包的下载及解压的工作,这里直接进行编译配置工作。

1
2
3
4
5
6
7
8
9
10
11
#编译配置,详细参数见官网
$ ./configure --sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--with-http_ssl_module \
--with-pcre=../pcre-8.41 \
--with-zlib=../zlib-1.2.11
#生成二进制安装程序
$ make
#安装
$ make install

Install PHP

配置安装PHP

1
2
3
4
5
6
#编译配置,详细参数见官网
$ ./configure --prefix=/usr/local/php --with-curl --with-freetype-dir --with-gd --with-gettext --with-iconv-dir --with-kerberos --with-libdir=lib64 --with-libxml-dir --with-mysqli --with-openssl --with-pcre-regex --with-pdo-mysql --with-pdo-sqlite --with-pear --with-png-dir --with-jpeg-dir --with-xmlrpc --with-xsl --with-zlib --with-bz2 --with-mhash --enable-fpm --enable-bcmath --enable-libxml --enable-inline-optimization --enable-mbregex --enable-mbstring --enable-opcache --enable-pcntl --enable-shmop --enable-soap --enable-sockets --enable-sysvsem --enable-sysvshm --enable-xml --enable-zip
#注意:编译报错缺少依赖包可用yum进行安装
$ yum -y install bzip2 bzip2-devel curl curl-devel libjpeg-devel libpng-devel freetype-devel libxslt-devel
#生成二进制安装程序及安装
$ make && make install

创建配置文件,并将其复制到正确的位置,当前位置:/usr/local/src/php7.2.12

1
2
3
$ cp php.ini-development /usr/local/php/etc/php.ini
$ cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
$ cp sapi/fpm/php-fpm /usr/local/bin

需要着重提醒的是,如果文件不存在,则阻止 Nginx 将请求发送到后端的 PHP-FPM 模块, 以避免遭受恶意脚本注入的攻击。
将 php.ini 文件中的配置项 cgi.fix_pathinfo 设置为 0 。
打开 php.ini:

1
$ vim /usr/local/php/etc/php.ini

定位到 cgi.fix_pathinfo= 并将其修改为如下所示:

1
cgi.fix_pathinfo=0

在启动服务之前,需要修改 php-fpm.conf 配置文件,确保 php-fpm 模块使用 www-data 用户和 www-data 用户组的身份运行。

1
$ vim /usr/local/etc/php-fpm.conf

找到以下内容并修改:

1
2
3
4
5
; Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
user = www-data
group = www-data

然后启动 php-fpm 服务:

1
$ /usr/local/bin/php-fpm

配置 Nginx 使其支持 PHP 应用:修改nginx配置文件

1
$ vim /usr/local/nginx/nginx.conf

修改默认的 location 块,使其支持 .php 文件:

1
2
3
4
location / {
root html;
index index.php index.html index.htm;
}

下一步配置来保证对于 .php 文件的请求将被传送到后端的 PHP-FPM 模块, 取消默认的 PHP 配置块的注释,并修改为下面的内容:

1
2
3
4
5
6
7
location ~* \.php$ {
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}

重启 Nginx。

1
2
$ sudo /usr/local/nginx/nginx -s stop
$ sudo /usr/local/nginx/nginx

Install MYSQL

配置mysql参数项及安装,这里下载的是包含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
41
#删除原有mysql或者mariadb,查看系统原有程序
$ rpm -qa | grep mariadb
$ rpm -qa | grep mysql
#删除原有mysql
$ rpm -e | grep mysql-*
$ rpm -e mariadb-libs-5.5.60-1.el7_5.x86_64
#如果失败则
$ rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64
#查找有关mysql文件
$ find / -name mysql*
#删除有关文件及配置文件
$ rm -rf /etc/my.cnf
#创建用户及用户组
$ useradd mysql -s /sbin/nologin
$ groupadd mysql
#添加用户mysql到用户组mysql中
$ usermod -a -G mysql mysql
#创建mysql数据库服务程序目录及数据库文件目录
$ mkdir -p /usr/local/mysql/data
#修改所有者、所属组
$ chown -Rf mysql:mysql /usr/local/mysql
#安装缺少依赖
$ yum -y install ncurses-devel
#编译配置,详细参数见官网
$ cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DSYSCONFDIR=/etc \
-DMYSQL_TCP_PORT=3306 \
-DWITH_BOOST=/usr/local/src/mysql-8.0.13/boost \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_0900_ai_ci \
-DENABLED_LOCAL_INFILE=ON \
-DWITH_INNODB_MEMCACHED=ON \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1
#生成二进制安装程序及安装,需要长时间等待
$ make && make install

使用mysqld手动初始化数据目录,当前位置/usr/local/mysql

1
2
$ bin/mysqld --initialize --user=mysql
$ bin/mysqld --initialize-insecure --user=mysql

使用 –initialize了“ 默认安全 ”安装(即包括生成随机初始的root密码)。在这种情况下,密码被标记为已过期,您需要选择一个新密码。使用该 –initialize-insecure选项,不会 root生成密码; 假设您在将服务器投入生产使用之前及时为帐户分配密码。

这可能需要指定其他选项,如 –basedir或 –datadir如果 mysqld的不能识别的安装目录或数据目录中的正确位置。例如(在一行中输入命令)

1
$ bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

如果您希望服务器能够部署并自动支持安全连接,请使用 mysql_ssl_rsa_setup实用程序创建默认的SSL和RSA文件:

1
$ bin/mysql_ssl_rsa_setup

启动服务器:
如果您的安装包含mysqld_safe,请启动MySQL服务器

1
$ bin/mysqld_safe --user=mysql &

修改账号密码

1
mysql> alter user 'root'@'localhost' identified by "123456";

至此LNMP已经搭建完毕

centos7配置服务开机自启动

nginx

在系统服务目录里创建nginx.service文件

1
$ vim /lib/systemd/system/nginx.service

修改内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=nginx
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/nginx
ExecReload=/usr/local/nginx/nginx -s reload
ExecStop=/usr/local/nginx/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

设置开机启动

1
$ systemctl enable nginx.service

mysql

在系统服务目录里创建nginx.service文件

1
$ vim /lib/systemd/system/mysqld.service

修改内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=mysql
After=network.target
After=syslog.target

[Service]
User=mysql
Group=mysql
#Type=forking
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
ExecStop=/usr/local/mysql/bin/mysqladmin shutdown
#PrivateTmp=true

[Install]
WantedBy=multi-user.target

解释:
[Unit]:服务的说明
Description:描述服务
After:描述服务类别
[Service]服务运行参数的设置
Type=forking是后台运行的形式
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:[Service]的启动、重启、停止命令全部要求使用绝对路径
[Install]运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3

其他命令:

1
2
3
4
5
6
7
8
9
10
11
12
#启动nginx服务
$ systemctl start nginx.service
#设置开机自启动
$ systemctl enable nginx.service
#停止开机自启动
$ systemctl disable nginx.service
#查看服务当前状态
$ systemctl status nginx.service
#重新启动服务
$ systemctl restart nginx.service
#查看所有已启动的服务
$ systemctl list-units --type=service

参考