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

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

服务器IP:192.168.1.111

  • 说明:
  1. 安装包已经提前下载好,此文档中不再演示下载步骤
  2. 根据笔者习惯,所有的源码包都在/a01/apps/apps_src/
  3. 所有的服务安装路径都在/a01/apps/xxxxxxx
  • 包版本:
    1
    2
    3
    Apache: 	httpd-2.4.28.tar.gz、apr-1.6.2.tar.gz、apr-util-1.6.0.tar.gz、pcre-8.41.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

一、编译安装Apache

  1. 安装依赖
    1
    yum -y install gcc gcc-c++ zlib-devel openssl-devel expat-devel
  • 在安装Apache之前还需要准备一些必要的依赖包
  1. apr编译安装(下载地址http://apr.apache.org/download.cgi)

    1
    2
    3
    tar -zxvf apr-1.6.2.tar.gz
    cd apr-1.6.2
    ./configure --prefix=/a01/apps/apr && make -j 4 && make install && echo $?
  2. apr-util编译安装(下载地址http://apr.apache.org/download.cgi)

    1
    2
    3
    tar -zxvf apr-util-1.6.0.tar.gz
    cd apr-util-1.6.0
    ./configure --prefix=/a01/apps/apr-util --with-apr=/a01/apps/apr/ && make -j 4 && make install && echo $?
  3. pcre编译安装(下载地址https://sourceforge.net/projects/pcre/files/)

    1
    2
    3
    tar -zxvf pcre-8.41.tar.gz
    cd pcre-8.41
    ./configure && make -j 4 && make install && echo $?
  4. 解包安装Apache(下载地址http://www.apache.org/dist/httpd/)

    1
    2
    tar -zxvf httpd-2.4.28.tar.gz
    cd httpd-2.4.28
  • 在进行下一步之前,我要说一下:

Apache的动态编译和静态编译

1
2
3
4
5
6
7
8
9
10
11
12
13
A.静态编译
在使用./configure 编译的时候,即没有使用--enable-mods-shared=[module]或者--enable-[module]=shared这2个中的一个,那么所有的默认模块为静态。何谓静态? 其实就是编译的时候所有的模块自己编译进httpd 这个文件中,启动的时候这些模块就已经加载进来了,也就是可以使用了

B.动态编译
就是编译的时候,使用--enable-mods-shared=[module]或者--enable-[module]=shared 来动态编译。 那么什么是动态? 静态是直接编译进httpd中, 那么动态显然就不编译进去了,也就是你启动的时候根本不会加载这个模块, 而是给你一个module.so 文件,你一定要使用 loadmodule 这个语法来加载,这个模块才有效。

C.区别
那么区别就出来了:静态的模块通常是在httpd.conf文件中使用<ifmodule></ifmodule> 来配置, 动态使用loadmoule来加载,然后再配置。

D.总结
1)如果编译参数中有--enable-mods-shared=all或者--enable-mods-shared=most,那么所有--enable-[module]都将会以动态模式来编译,除非特别指定--enable-[module]=static 为静态编译 。
2)如果编译参数中有--enable-mods=all 指定所有静态方式的话,还可以用--enable-[module]=shared 来动态加载模块。
3 ) 特别注意如果编译参数中既有--enable-mods=all静态编译又有--enable-mods-shared=all动态编译,那么最终会使用动态编译。

Apache多进程处理模块MPM三种模式

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
A.Prefork MPM
prefork模式可以算是很古老但是非常稳定的Apache模式。Apache在启动之初,就预先fork一些子进程,然后等待请求进来。之所以这样做,是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间点内,只能处理一个请求。

优点:成熟稳定,兼容所有新老模块。同时,不需要担心线程安全的问题。

缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求,在这种场景下,它会将请求放进队列中,一直等到有可用进程,请求才会被处理。


B.Worker MPM
worker模式比起上一个,是使用了多进程和多线程的混合模式。它也预先fork了几个子进程(数量比较少),然后每个子进程创建一些线程,同时包括一个监听线程。每个请求过来,会被分配到1个线程来服务。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些。在高并发的场景下,因为比起prefork有更多的可用线程,表现会更优秀一些。

有些人会觉得奇怪,那么这里为什么不完全使用多线程呢,还要引入多进程?

原因主要是需要考虑稳定性,如果一个线程异常挂了,会导致父进程连同其他正常的子线程都挂了(它们都是同一个进程下的)。为了防止这场异常场景出现,就不能全部使用线程,使用多个进程再加多线程,如果某个线程出现异常,受影响的只是Apache的一部分服务,而不是整个服务。


优点:占据更少的内存,高并发下表现更优秀。


缺点:必须考虑线程安全的问题,因为多个子线程是共享父进程的内存地址的。如果使用keep-alive的长连接方式,某个线程会一直被占据,也许中间几乎没有请求,需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)


注:keep-alive的长连接方式,是为了让下一次的socket通信复用之前创建的连接,从而,减少连接的创建和销毁的系统开销。保持连接,会让某个进程或者线程一直处于等待状态,即使没有数据过来。


C.Event MPM
这个是Apache中最新的模式,在现在版本里的已经是稳定可用的模式。它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。


event MPM在遇到某些不兼容的模块时,会失效,将会回退到worker模式,一个工作线程处理一个请求。官方自带的模块,全部是支持event MPM的。


注意一点,event MPM需要Linux系统(Linux 2.6+)对EPoll的支持,才能启用。


还有,需要补充的是HTTPS的连接(SSL),它的运行模式仍然是类似worker的方式,线程会被一直占用,知道连接关闭。部分比较老的资料里,说event MPM不支持SSL,那个说法是几年前的说法,现在已经支持了。



在编译Apache时,可以编译--with-mpms-shared=all选择支持所有模式,再指定默认使用的模式--with-mpm=event,后期可以修改配置文件来修改模式。如果不指定,默认使用prefork模式
  1. 配置Apache
    1
    ./configure --prefix=/a01/apps/apache --sysconfdir=/etc/httpd/ --with-apr=/a01/apps/apr/ --with-apr-util=/a01/apps/apr-util/ --enable-mods-shared=all --with-pcre --with-zlib --enable-rewrite --enable-ssl --enable-so --enable-cgi --enable-cache --enable-file-cache --enable-mem-cache --enable-disk-cache --with-mpms-shared=all --with-mpm=event

1
2
3
4
5
6
7
8
9
10
11
12
13
14
参数详解:
1)--enable-mods-shared=all #动态编译所有模块
2)--with-pcre #表示依赖的pcre,用于支持url重写时支持正则表达式
3)--with-zlib #表示依赖的zlib,用于支持压缩功能
4)--enable-rewrite #表示支持url地址重写功能
5)--enable-ssl #启用ssl加密功能
6)--enable-so #支持动态加载模块
7)--enable-cgi #启用支持cgi机制的功能
8)--enable-cache #启用缓存
9)--enable-file-cache #启用文件缓存
10)--enable-mem-cache #启用记忆缓存
11)--enable-disk-cache #启用磁盘缓存
12)--with-mpms-shared=all #支持MPM所有模式
13)--with-mpm=event #默认使用event模式

  1. 四核编译
    1
    make -j 4
  • make的作用:make是把Makefile文件中的指令编译成计算机认识的二进制文件
  • -j 4的作用:比如我的服务器是4核CPU,同时启用4核来编译,速度更快,2核就-j 2
  1. 安装

    1
    make install
  2. 查看Apache正在使用的MPM是什么模式的

    1
    /a01/apps/apache/bin/httpd –l或者/a01/apps/apache/bin/apachectl -l

PrkZ3d.png

  1. 配置Apache
    1
    vim /etc/httpd/httpd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1)在406行下添加以下语句,使Apache支持php
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .php7

.php7中,如果是php5,自行修改就可以了

2)在235、236行修改Apache站点根目录
DocumentRoot "/home/web1"
<Directory "/home/web1">

3)在505行添加虚拟主机配置文件
Include /etc/httpd//extra/web1.conf

4)在180、181行指定Apache运行用户和组
User www
Group www

  1. 创建站点根目录

    1
    mkdir -p /home/web1
  2. 创建Apache运行用户

    1
    useradd -M -s /sbin/nologin www
  3. 创建虚拟主机配置文件

    1
    vim /etc/httpd/extra/web1.conf

1
2
3
4
5
6
<VirtualHost *:80>
ServerName www.web1.com
DocumentRoot /home/web1
ErrorLog "/a01/apps/apache/logs/web1-error_log"
CustomLog "/a01/apps/apache/logs/web1-access_log"common
</VirtualHost>

  1. 编辑网站内容

    1
    echo "Zhe Apache server is SUCCESS!!You are so cool." >> /home/web1/index.html
  2. 授权

    1
    2
    chown -R www:www /a01/apps/apache/
    chown -R www:www /home/web1/
  3. 启动Apache

    1
    /a01/apps/apache/bin/httpd
  4. 开启防火墙80端口

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

    1
    2
    echo "PATH=$PATH:/a01/apps/apache/bin" >> /etc/profile
    source /etc/profile
  6. 编写Apache脚本加入系统服务

    1
    2
    cd /etc/systemd/system
    vim httpd.service

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

[Service]
Type=forking
ExecStart=/a01/apps/apache/bin/httpd -k start
ExecStop=/a01/apps/apache/bin/httpd -k stop

[Install]
WantedBy=multi-user.target

  1. 加入系统服务并开机自启

    1
    2
    chmod 754 httpd.service
    systemctl enable httpd
  2. 报错解决
    忽然发现不论是启动还是关闭Apache服务,都会报出以下信息,虽然不影响使用,但是看着实在是很揪心,看字面上的意思应该是没有在httpd.conf中指定ServerName,所以Apache会用主机上的名称来取代,既然这样,我们去设置一下就可以了
    Prk34g.png

1
vim /etc/httpd/httpd.conf

PrkYgs.png

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

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

apache+libphp5.so/libphp7.so-->php
  • 找到一张图说明一下:
    PrkdbV.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 && 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
    export LD_LIBRARY_PATH=/lib/:/usr/lib/:/usr/local/lib
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 --with-apxs2=/a01/apps/apache/bin/apxs
  • 说明:apache要解析php,需要libphp7.so模块,这个模块在安装php时,要加上–with-apxs2=/a01/apps/apache/bin/apxs 才会生成。

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
其中:
参数详解为:
--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扩展用到的
```bash
***

5. 编译
```bash
make -j 4
  1. 安装

    1
    make install
  2. 查看是否生成了libphp7.so模块

    1
    ls /a01/apps/apache/modules/

PrkBUU.png

  1. 创建php配置文件目录

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

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

    1
    2
    cp /a01/apps/php7/etc/php-fpm.conf.default /a01/apps/php7/etc/php-fpm.conf
    cp /a01/apps/php7/etc/php-fpm.d/www.conf.default /a01/apps/php7/etc/php-fpm.d/www.conf
  4. 配置全局变量

    1
    2
    echo "PATH=$PATH:/a01/apps/php7/bin" >> /etc/profile
    source /etc/profile
  5. 编写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 /a01/apps/php7/etc/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. 编写测试网页测试nginx是否支持php

    1
    vim /home/web1/test.php

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

http://192.168.1.111/test.php
PrkD5F.png

三、编译安装MySQL

  • 这里说一下怎么下载MySQL的源码包,我也被整蒙圈了好一会,希望写下来可以帮助到正在看这篇文章的读者们。
  • 首先进入以上下载地址,选择版本,只能下载社区版的,企业版收费
    Prky8J.png
  • 选择Source Code源码包:
    PrkcvR.png
  • 这里就是最关键的一步了,必须要选择All,如果选择了下边的指定系统版本,根本就找不到源码包:
    Prk2K1.png
  • 接下来往下拉到页底找到后缀为tar.gz的包,然后Download即可
    PrkRDx.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
[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

PrkWb6.png

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

13.开启防火墙3306端口

1
2
firewall-cmd --add-port=3306/tcp --permanent
systemctl reload firewalld

  1. 配置全局变量
    1
    2
    echo "PATH=$PATH:/a01/apps/mysql/bin">> /etc/profile
    source /etc/profile

15.使用mysql命令登录测试

1
mysql

Prk4UO.png

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

PrkT8H.png

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