• Lmap


    #实现LAMP架构

    1. LAMP介绍

    在这里插入图片描述

    • 什么是LAM(M)P
      一套开源组合,用来构建应用程序服务器

      1. L:linux
      2. A:apache (httpd)
        承载客户端连接,处理静态资源,通过客户端适配器转发动态资源至后端服务器
      3. M: mysql, mariadb
        数据库选择,与编程语言没有关系,与程序员解决方案有关系
      4. (M):memcached
      5. P:php, perl, python
        程序运行所需要的环境
    • 数据分类

      1. 非机构化数据
        数据结构不规则或不完整,没有预定义的数据模型,不方便用数据库二维逻辑表来表现的数据
      2. 结构化数据
        可以使用关系型数据库表示和存储,表现为二维形式的数据。一般特点是:数据以行为单位,一行数据表示一个实体的信息,每一行数据的属性是相同的
      3. 半结构化数据
        半结构化数据是结构化数据的一种形式,它并不符合关系型数据库或其他数据表的形式关联起来的数据模型结构,但包含相关标记,用来分隔语义元素以及对记录和字段进行分层
    • WEB资源类型

      1. 静态资源
        原始形式与响应内容一致,在客户端浏览器执行
      2. 动态资源
        原始形式通常为程序文件,需要在服务器端执行之后,将执行结果返回给客户端,客户端与服务器端看到的源码不同
    • httpd怎么处理动态资源

      1. httpd只是一个纯粹的静态http协议,所能完成的工作为分析用户请求报文,理解用户请求资源,根据本地的路径映射基于本地磁盘加载内容,将内容本身封装为一个响应报文,并发还给客户端
      2. 我们很多时候期望web程序通过MIME识别出用户请求类型后,将执行结果返回给用户,而不是请求的内容,这就需要通过适配机制(例如CGI),将用户的动态资源请求,转发到后端服务器(例如php),将客户端请求执行后以数据流的形式,通过web服务器响应给用户
    • CGI:Common Gateway Interface(通用网关接口)
      可以让一个客户端,从网页浏览器通过http服务器向执行在网络服务器上的程序传输数据;CGI描述了客户端和服务器程序之间传输的一种标准

      1. 请求流程:
        Client – (httpd) --> httpd – (cgi) --> application server (program file) – (mysql) --> mysql
        1. 客户端发送一个请求访问动态页面,通过http协议访问网站
        2. httpd服务器不能处理动态资源,通过cgi协议,发送给cgi应用程序
        3. cgi应用程序执行后,通过mysql调用数据,再通过httpd将结果返回给客户端
      2. FastCGI
        早期CGI与web服务是在同一台主机上的,web服务器承载大量的用户请求服务于静态资源,同时还需要调用另一个组件来执行动态资源,生成结果,给单台服务器带来巨大压力
        FastCGI,通过套接字来完成前后端的分离,前端服务器通过反向代理的方式与后端服务器通信,当动态文件数据量较大时,通常不会放在本地的文件中,为了加速较大量数据的解锁,需要设置专业的数据存储系统,
        1. 不需要文件自身做处理,只需要通过API调对方的服务接口
        2. 剥离数据与文件的关系,单独存储
    • php
      PHP是通用服务器端脚本编程语言,其主要用于web开发以实现动态web页面,它也是最早实现将脚本嵌入HTML源码文档中的服务器端脚本语言之一。同时,php还提供了一个命令行接口,因此,其也可以在大多数系统上作为一个独立的shell来使用,意味着php可以在其交互式窗口直接运行

      1. 官方网站
        官网:http://www.php.net/
      2. Zend Engine
        开源的、PHP脚本语言的解释器,将PHP代码的处理过程分成了两个阶段
        1. 分析PHP代码并将其转换为称作Zend opcode的二进制格式opcode(类似Java的字节码),并将其存储于内存中
        2. 使用Zend Engine去执行这些转换后的Opcode
      3. php的加速器
        基于PHP的特殊扩展机制如opcode缓存扩展也可以将opcode缓存于php的共享内存中,从而可以让同一段代码的后续重复执行时跳过编译阶段以提高性能。这些加速器并非真正提高了opcode的运行速度,而仅是通过分析opcode后并将它们重新排列以达到快速执行的目的
        1. APC (Alternative PHP Cache)
          遵循PHP License的开源框架,PHP opcode缓存加速器,目前的版本不适用于PHP 5.4
          项目地址:http://pecl.php.net/package/APC
        2. eAccelerator
          源于Turck MMCache,早期的版本包含了一个PHP encoder和PHP loader,目前encoder已经不在支持。
          项目地址: http://eaccelerator.net/
        3. XCache
          快速而且稳定的PHP opcode缓存,经过严格测试且被大量用于生产环境,收录EPEL源
          项目地址:http://xcache.lighttpd.net/
        4. Zend Optimizer和Zend Guard Loader
          Zend Optimizer并非一个opcode加速器,它是由Zend Technologies为PHP5.2及以前的版本提供的一个免费、闭源的PHP扩展,其能够运行由Zend Guard生成的加密的PHP代码或模糊代码。 而Zend Guard Loader则是专为PHP5.3提供的类似于Zend Optimizer功能的扩展
          项目地址:http://www.zend.com/en/products/guard/runtime-decoders
        5. NuSphere PhpExpress
          NuSphere的一款开源PHP加速器,它支持装载通过NuSphere PHP Encoder编码的PHP程序文件,并能够实现对常规PHP文件的执行加速。
          项目地址:http://www.nusphere.com/products/phpexpress.htm

    2. 在httpd中使用php的方法

    • httpd+php结合的方式:

      1. Modules:将php编译成依附于httpd服务的子模块,处理动态资源时,生成子进程处理,配置文件生效需要重启httpd服务
        1. 缺点
          每启动一个httpd进程就会装载一次php模块,不论是否使用
        2. 启动
          配置文件生效需要重启httpd服务
      2. FastCGI:PHP以独立的服务器使用(fastcgi server)运行,用fpm实现,php本身只是解释器,配合fpm,让php以守护进程的方式运行,监听在某个套接字上,接收前端的httpd的请求
        1. 运行过程
          请求资源先发送给httpd,通过httpd内部的fastcgi客户端模块,通过此模块能够作为客户端去请求fastcgi的服务端(fpm运行的php server),通常为tcp协议的9000端口
        2. 启动
          配置文件生效需要重启php-fpm服务
          systemctl start php-fpm
          php配置
        3. 版本要求
          1. CentOS 6:需要编译安装httpd-2.4, php-5.3.3+
            PHP-5.3.2之前:默认不支持fpm机制;需要自行打补丁并编译安装
            httpd-2.2:默认不支持fcgi协议,需要自行编译此模块
          2. CentOS 7:
            httpd-2.4:rpm包默认编译支持fcgi模块
            php-fpm包:专用于将php运行于fpm模式
        4. 模块要求
          在HTTPD服务器上必须启用proxy_fcgi_module模块,充当PHP客户端,查看方式:
          1. httpd –M |grep fcgi
          2. cat /etc/httpd/conf.modules.d/00-proxy.conf
    • 在LAMP中设计的PHP程序

      1. php-mysql
        让mysql支持php解释器
      2. php
        php解释器主程序包,包含向Apache HTTP服务器添加php解释器支持的模块
      3. php-fpm
        (FastCGI Process Manager)是PHP FastCGI的另一种备选方案,具有一些额外的特性,对任何规模的站点都有用,特别是比较繁忙的站点
    • php通用配置文件
      配置文件在php解释器启动时被读取

      1. 主配置文件
        /etc/php.ini
      2. 子配置文件
        /etc/php.d/*.ini
      3. 配置文件来源:安装php或php-fpm都会通过依赖关系安装php-common
        [root@hai7-6 ~]$rpm -qf /etc/php.ini
        php-common-5.4.16-45.el7.x86_64
        
        • 1
        • 2
      4. /etc/php.ini配置文件格式
        1. 格式
          [foo]:Section Header   
          directive = value 
          
          • 1
          • 2
        2. 描述
          [foo]:表示段落名称
          ;:没空格的表示可以启用的选项
          ;:加空格的表示纯粹的说明信息
      5. /etc/php.ini配置文件常用项
        1. php.ini的核心配置选项文档:
          http://php.net/manual/zh/ini.core.php
        2. php.ini配置选项列表:
          http://php.net/manual/zh/ini.list.php
        max_execution_time= 30  	  <==最长执行时间30s,高并发情况下,可以考虑调小
        max_input_time = 60 		  <==最大输入时间
        memory_limit = 128M  	 	  <==内存大小,生产不够,可调大 
        display_errors off 		      <==显示错误信息,调试使用,不要打开,否则可能暴露重要信息
        display_startup_errors off	  <==建议关闭,启动错误信息
        post_max_size 8M 			  <==最大上传数据大小,生产可能临时要调大,比下面项要大
        upload_max_filesize 2M		  <==最大上传文件,生产可能要调大
        max_file_uploads = 20		  <==同时上传最多文件数
        date.timezone =Asia/Shanghai  <==指定时区
        short_open_tag=on 			  <==开启短标签,如<? phpinfo();?> ,原格式为<?php  phpinfo(); ?>
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
    • 以下实验会用到的测试代码

      1. php测试代码
        <?php
        echo date("Y/m/d H:i:s");
        phpinfo();
        ?>
        
        • 1
        • 2
        • 3
        • 4
      2. Php使用mysql扩展连接数据库
        <?php
        $conn = mysql_connect(‘mysqlserver','username','password');
        	if ($conn)
        		echo "OK";
        	else
        		echo "Failure";
        ?>
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
      3. Php使用mysqli扩展连接数据库测试代码
        <?php
        $mysqli=new mysqli("mysqlserver",“username",“password");
        	if(mysqli_connect_errno()){
        		echo "Failure";
        			$mysqli=null;
        			exit;
        		}
        		echo “OK";
        		$mysqli->close();
        ?>
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
      4. 使用pdo扩展连接数据库的测试代码1
        <?php
        $dsn='mysql:host=localhost;dbname=mysql';
        $username='root';
        $passwd='centos';
        $dbh=new PDO($dsn,$username,$passwd);
        var_dump($dbh);
        ?>
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
      5. 使用pdo扩展连接数据库的测试代码2
        try {
        	$user='root';
        	$pass=‘centos';
        	$dbh = new PDO('mysql:host=localhost;dbname=mysql', $user, $pass);
        	foreach($dbh->query('SELECT user,host from user') as $row) {
        		print_r($row);
        	}
        	$dbh = null;
        } catch (PDOException $e) {
        	print "Error!: " . $e->getMessage() . "<br/>";
        	die();
        }
        ?>
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13

    3. 实现LAMP架构

    • 以模块(Modules)方式实现
      CentOS 7:涉及安装程序
      Modules:httpd, php, php-mysql, mariadb-server
      CentOS 6:涉及安装程序
      Modules:httpd, php, php-mysql, mysql-server

      1. 安装,如果已经安装了httpd,直接安装php,会通过依赖关系会默认安装php-cli和php-common
        [root@hai7-7 ~]$yum install php
        
        • 1
      2. 安装成功后,会在/etc/httpd/conf.d/下生成新的配置文件,php.conf
        [root@hai7-7 ~]$vim php.conf 
        <FilesMatch .php$>
        SetHandler application/x-httpd-php   <==所有以.php结尾的文件,都交给httpd-php处理
        </FilesMatch>
        DirectoryIndex  index.php            <==设置默认主页
        php_value session.save_handler "files"       		
        php_value session.save_path    "/var/lib/php/session"	 <==保存session目录
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
      3. 在httpd模块目录下,/etc/httpd/conf.modules.d/会增加一个php模块配置文件,10-php.conf
        [root@hai7-7 conf.modules.d]$vim 10-php.conf 
        <IfModule prefork.c>    <==只要在prefork.c模型下才会装载名为php5_module的模块
          LoadModule php5_module modules/libphp5.so
        </IfModule>
        
        • 1
        • 2
        • 3
        • 4
        也就是说httpd以线程模式运行的话,需要装入的模块为php-zts,在extras仓库
      4. 检查php5模块是否已装载,如果未加载,需要检查配置文件和安装的程序包是否相匹配
        root@hai7-7 conf.modules.d]$httpd -M
        
        • 1
      5. 测试,在httpd页面路径下建一个.php文件,然后访问主页,如果可以看到php设置环境界面,说明php模块可以正常运行
        [root@hai7-7 html]$vim index.php
        <?php
                  phpinfo();
        ?>
        
        • 1
        • 2
        • 3
        • 4
      6. 安装mysql,同时让php支持连接mysql,需要组件为 php-mysq
        [root@hai7-6 ~]$yum -y install  mariadb-server  php-mysql
        
        • 1
      7. 在web服务器主机,编辑一个测试代码
        <?php
            $conn = mysql_connect('127.0.0.1','root','');  <本机测试用,生产环境不可以用root,配置文件容易丢
                if ($conn)
                        echo "OK";
                else
                        echo "Failure";
        ?>
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
      8. 重启服务后,访问web页面,如果出现“Failure”错误,说明php扩展没有问题,只是连接数据库失败,可能是数据库没有启动,或者账号密码错误,或者数据服务器端口错误等。如果出现ok界面,说明可以正常连接至数据库,IMP平台也就搭建成功,php程序放在网页目录下就可以对外提供服务了
    • 以FastCGI实现(php-fpm)
      php包与php-fpm包是互斥的,只能安装一种,如果测试机上有php需要先卸载
      FastCGI涉及程序:httpd, php-fpm, php-mysql, mariadb-server

      1. 安装程序包,httpd、php-mysql、mariadb-server
        [root@hai7-7 ~]$yum install httpd php-mysql php-fpm mariadb-server -y
        
        • 1
      2. 修改mysql数据库配置文件,不允许反向解析ip
        [root@hai7-7 ~]$vim /etc/my.cnf.d/server.cnf
        [mysqld]
        skip_name_resolve=ON
        
        • 1
        • 2
        • 3
      3. httpd要适配到FastCGI服务端,依赖于模块proxy_fcgi_module,2.4默认启动状态,2.2需要在epel源安装
        [root@hai7-7 ~]$httpd -M |grep cgi
        proxy_fcgi_module (shared)
        
        • 1
        • 2
      4. 编辑fastCGI服务器端配置文件/etc/php-fpm.conf用来配置php守护进程工作特性(如何管理自己的进程),/etc/php.ini依然生效,用来配置加载那些模块,修改了模块设置,就需要要重启php-fpm服务
        [root@hai7-7 ~]$vim /etc/php-fpm.conf
        include=/etc/php-fpm.d/*.conf            <==模块化配置加载此目录下所有的配置文件
        [global]
        pid = /run/php-fpm/php-fpm.pid   		 <==守护进程的pid
        error_log = /var/log/php-fpm/error.log   <==错误日志
        log_level = notice     					 <==日子记录级别
        daemonize = no     						 <==表示是否以守护进程的方式运行,定义为no,因为要托管到		systemd上
        ;;;;;;;;;;;;;;;;;;;;
        ; Pool Definitions ;
        ;;;;;;;;;;;;;;;;;;;;
        ; See /etc/php-fpm.d/*.conf  			 <==Connection Pool连接池的定义都在php-fpm.d/下模块化的配置文件中
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
      5. 定义连接池的配置文件
        [root@hai7-7 ~]$vim /etc/php-fpm.d/www.conf
        [www]  					   <==连接池的名字,此名可以自定义
        listen = 127.0.0.1:9000    <==监听在哪个地址哪个端口上,本机所有ipv4地址可用修改为0.0.0.0
        listen.backlog = -1        <==队列长度,-1表示在服务器承载范围内不设限,队列时放在内存中的,防止didos攻击,推荐设限
        #listen.allowed_clients = 127.0.0.1    <==访问控制,注释掉
        user = apache     		   <==表示子进程以哪个身份运行
        group = apache
        pm = dynamic       		   <==定义管理连接池的模式,有两个值static和dynamic
        	    static: 		   <==静态模式,直接启用所有子进程
        	    dynamic: 		   <==动态管理模式
        		    following directives:
        		    pm.max_children:'最大连接数,动态静态都有用,默认值50,通过压测确定'
        			pm.start_servers:'服务启动时启动的进程数,此参数动态模式有用,默认值5'
        			pm.min_spare_servers:'空闲进程数,此参数动态模式有用,默认值5'
        			pm.max_spare_servers:'最大空闲进程数,此参数动态模式有用,默认值35'
        pm.max_requests = 500     <==进程最大服务数,达到此值就会kill生成新的,设为0表示不设限
        pm.status_path = /status  <==pm状态页面
        ping.path = /ping  		  <==判断服务工作状态的URL
        ping.response = pong      <==判断/ping后返回的结果,可以自定义
        php_value[session.save_handler] = files     			<==定义会话管理模式
        php_value[session.save_path] = /var/lib/php/session     <==会话保存路径,确保此文件存在,且apache有读写权限
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18
        • 19
        • 20
        • 21
      6. 创建session(会话)管理目录,并且修改为apache具有读写权限
        [root@hai7-7 ~]$mkdir /var/lib/php/session
        [root@hai7-7 ~]$chown apache.apache /var/lib/php/session/
        
        • 1
        • 2
      7. 在虚拟主机上配置http,需要手动指明默认主页文件使用index.php
        1. '编辑http配置文件,添加FCGI的配置'
        [root@hai7-7 data]$vim /etc/httpd/conf.d/text.conf
        DirectoryIndex index.php       <==指明默认主页文件为index.php
        <VirtualHost *:80>
        ServerName www.v9.com
        DocumentRoot /data/virtual/v9.com
        ProxyRequests Off              <==关闭正向代理
        ProxyPassMatch ^/(.*.php)$  fcgi://192.168.50.115:9000/apps/vhosts/b.net/$1  <==反向代理,以php结尾的URL,转发给fcgi由/apps/vhosts/b.net/$1提供,后面的$1是指前面的/(.*.php)
        

    <Directory “/data/virtual/v9.com”> <==授权限制目录
    Options None
    AllowOverride None
    Require all granted
    </Directory>
    </VirtualHost>

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 在指定的页面路径下建一个网页测试文件,重启服务
    [root@hai7-7 v9.com]$ vim /data/virtual/v9.com/index.php
    <?php
            phpinfo();
    ?>
    
    • 1
    • 2
    • 3
    • 4
  • 4. 常见LAMP应用

    • phpmyadmin
      一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库
      1. 获取站点
        下载:https://www.phpmyadmin.net/downloads/
      2. 布置phpmyadmin
        1. 将工具包解压后,移动至httpd服务的DocumentRoot下,做一个指向软连接,方便切换版本
          1. '解压文件'
          [root@hai7-7 ~]$tar xf phpMyAdmin-4.0.10.20-all-languages.tar.gz
          2. '移动至页面目录下'
          [root@hai7-7 ~]$mv phpMyAdmin-4.0.10.20-all-languages /data/virtual/
          3. '做软连接'
          [root@hai7-7 ~]$ln -sv phpMyAdmin-4.0.10.20-all-languages v9.com
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
        2. 进入phpMyAdmin-4.0.10.20-all-languages目录,将配置文件模板,修改为配置文件,去掉sample
          [root@hai7-7 ~]$cp  config.sample.inc.php   config.inc.php
          
          • 1
        3. 修改配置文件config.inc.php
          [root@hai7-7 ~]$vim /data/virtual/phpMyAdmin-4.0.10.20-all-languages/config.inc.php
          $cfg['blowfish_secret'] = '123456';         <==输入一个随机字符串
          $cfg['Servers'][$i]['host'] = 'localhost';  <==修改连接地址,与数据库中授权的用户地址要相同
          
          • 1
          • 2
          • 3
        4. 安装php相关组件,重启服务后,即在httpd页面登入工具,账号密码为数据库授权的账户
          yum install php-mbstring      <==多字符支持
          yum install php-mcrypt        <==加密相关
          systemctl  restart  php-fpm   <==重启php-fpm
          
          • 1
          • 2
          • 3
    • WordPress
      WordPress是一款开源的个人网站搭建程序,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站
      1. 获取地址
        https://cn.wordpress.org/
      2. 部署WordPress
        1. 将获得的压缩包,解压到网页目录中,进入目录找到配置文件模板,将其重命名为wp-config.php
          [root@hai7-7 ~]$cd /var/www/html/wordpress-4.9
          [root@hai7-7 wordpress-4.9]$cp  wp-config-sample.php   wp-config.php
          
          • 1
          • 2
        2. 修改配置文件权限,保证Apache有读写权限
          [root@hai7-7 ~]$chmod 666 wp-config.php 
          
          • 1
        3. 在数据库中创建一个网站专用数据库,专用账户
          [root@hai7-7 ~]$mysql
          MariaDB [(none)]> CREATE DATABASE wpdb;
          MariaDB [(none)]> GRANT ALL ON phptest.* TO 'wpuser'@'172.20.0.%'IDENTIFIED BY 'centos';
          
          • 1
          • 2
          • 3
        4. 编辑配置文件,修改如下项,以连接数据库
          [root@hai7-7 ~]$vim /var/www/html/wordpress-4.9/wp-config.php
          define('DB_NAME', 'phptest');     <==指定数据库名
          define('DB_USER', 'root');      <==指定用户名
          define('DB_PASSWORD', '');      <==指定密码
          define('DB_HOST', '192.168.50.115');       <==指定主机
          
          • 1
          • 2
          • 3
          • 4
          • 5
        5. 或者将配置文件删除,访问网站,会出现配置页面,填写相关信息后,会生成配置文件,将内容复制到wordpress目录下生成一个配置文件wp-config.php

    5. 将httpd/fpm分别以独立主机运行

    • 独立搭建服务器优点

      1. 不需要文件自身做处理,只需要通过API调对方的服务接口
      2. 剥离数据与文件的关系,单独存储
    • 搭建过程
      规划以110为httpd服务器,107为php-fpm服务器,基于FastCGI

      1. 在107上安装php,如果需要连接数据库,还要安装php-mysql组件
        [root@hai7-7 ~]$yum install php-fpm  php-mysql
        
        • 1
      2. php服务器没有httpd服务,所以将web的php相关程序单独存放在一个目录下,新建目录/data/website
        [root@hai7-7 ~]$mkdir /data/website
        
        • 1
      3. 修改Php服务器的监听端口,默认情况是监听本地127.0.0.1上,需要修改为监听在网络ip,或者直接写端口,表示所有地址的9000都可以访问,重启服务
        [root@hai7-7 website]$vim /etc/php-fpm.d/www.conf
        listen = 9000
        [root@hai7-7 website]$systemctl restart php-fpm
        [root@hai7-7 website]$ss -ntl
        State      Recv-Q Send-Q     Local Address:Port           
        LISTEN     0      128          *:9000 <==看到*就说明所有地址都可以访问
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
      4. 在110服务器上安装Apache服务,并修改配置文件为代理服务器
        [root@hai7-8 ~]$yum install httpd
        [root@hai7-8 ~]$vim /etc/httpd/conf.dfcgi.conf
        DirectoryIndex index.php
        ProxyRequests Off
        ProxyPassMatch ^/(.*.php)$  fcgi://192.168.50.107:9000/data/website/$1   <==目标地址改为php服务器
        
        • 1
        • 2
        • 3
        • 4
        • 5

    6 搭建虚拟主机,在同一台服务器上运行2个网站

    • 实验目标
      实现LAMP架构,在web服务器上维护两个网站
    • 使用的网页资源
      1. wordpress-4.9.4-zh_CN.tar.gz
      2. Discuz_X3.2_SC_UTF8.zip
    • 搭建过程
      1. 数据库服务器

        1. 先搭建数据库服务器,这里以服务器C(107)为例
          [root@hai7-6 ~]$yum install mariadb-server
          
          • 1
        2. 计划运行两个网页,所以在数据库中建立相应数据库和账户
          1. '为wordpress网页建立数据库和账户'
          [root@hai7-6 ~]$mysql -e "CREATE DATABASE wpdb;GRANT ALL ON wpdb.* TO 	wpuser@'192.168.50.%' IDENTIFIED BY 'centos'"
          2. '为Discuz网页建立数据库和账户'
          [root@hai7-6 ~]$mysql -e "CREATE DATABASE Dzdb;GRANT ALL ON Dzdb.* TO 	dzuser@'192.168.50.%' IDENTIFIED BY 'centos'"
          
          • 1
          • 2
          • 3
          • 4
      2. php-fpm服务器

        1. 服务器B(110),安装php-fpm,连接数据库组件php-mysql
          [root@hai7-6 ~]$yum install   php-fpm  php-mysql
          
          • 1
        2. 分别建立2个网站对应的网页目录,Discuz稍后重命名
          [root@hai7-6 ~]$mkdir /data/wordpress
          
          • 1
        3. 在官网获取页面文件包wordpress-4.9.4-zh_CN.tar.gz和Discuz_X3.2_SC_UTF8.zip,分别解压至对应网页目录
          [root@hai7-6 ~]$tar xvf wordpress-4.9.4-zh_CN.tar.gz
          [root@hai7-6 ~]$unzip Discuz_X3.2_SC_UTF8.zip 
          'Discuz解压后的目录为upload,重命名为discuz'
          [root@hai7-6 ~]$mv upload/ discuz
          
          • 1
          • 2
          • 3
          • 4
        4. 修改wordpress配置文件
          1. '进入wordpress目录下,将配置文件模板修改为配置文件'
          [root@hai7-8 ~]$mv wp-config-sample.php  wp-config.php
          2. '修改配置文件'
          [root@hai7-8 ~]$vim /data/wordpress/wp-config.php
          /** WordPress数据库的名称 */
          define('DB_NAME', 'wpdb');
          /** MySQL数据库用户名 */
          define('DB_USER', 'wpuser');
          /** MySQL数据库密码 */
          define('DB_PASSWORD', 'centos');
          /** MySQL主机 */
          define('DB_HOST', '192.168.50.107');
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
        5. 让Apache对discuz目录具有写权限
          [root@hai7-8 /data]$setfacl -R -m u:apache:rwx discuz/
          
          • 1
      3. httpd服务器

        1. 安装httpd服务
          [root@hai7-8 ~]$yum -y install  httpd
          
          • 1
        2. 修改httpd配置文件,定义两个虚拟主机,并授权目录
          [root@hai7-8 ~]$vim /etc/httpd/conf.d/test.conf
          DirectoryIndex index.php         <==指定默认网页文件为index.php
          <VirtualHost *:80>       		 <==设立虚拟主机
          ServerName www.wordpress.net     <==服务名
          DocumentRoot /data/wordpress/    <==web服务页面路径
          ProxyRequests Off       		 <==不启用正向代理
          ProxyPassMatch ^/(.*.php)$ fcgi://127.0.0.1:9000/data/wordpress/$1        <==启用反向代理
          <Directory "/data/wordpress/">   <==授权虚拟主机服务目录
          Require all granted
          </Directory>
          </VirtualHost>
          

    <VirtualHost :80> <==第二个虚拟机
    ServerName www.discuz.net
    DocumentRoot /data/discuz/
    ProxyRequests Off
    ProxyPassMatch ^/(.
    .php)$ fcgi://127.0.0.1:9000/data/discuz/$1
    <Directory “/data/discuz/”>
    Require all granted
    </Directory>
    </VirtualHost>

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 客户端
    在客户端D上修改hosts文件,模拟DNS解析,登录网页检测

    [root@hai6  ~]$vim /etc/hosts
    192.168.50.110  www.wordpress.net  www.discuz.net
    
    • 1
    • 2
  • 7 CentOS7编译安装LAMP,基于fastcgi方式

    • 编译环境
      1. httpd可移植运行库
        apr-1.6.3.tar.gz
        apr-util-1.6.1.tar.gz
      2. Apache源码
        httpd-2.4.34.tar.bz2
      3. mariadb二进制文件
        mariadb-10.2.15-linux-x86_64.tar.gz
      4. php解释器
        php-7.1.18.tar.bz2
      5. 页面文件
        wordpress-4.9.4-zh_CN.tar.gz
    • 编译顺序
      mariadb–>httpd–>php
      mariadb和httpd先后可以随意,php依赖于mariadb,需要最后安装
    • 编译流程
      1. 准备开发包组
        [root@hai7-8 ~]$yum groupinstall "Development Tools"
        
        • 1
      2. 编译httpd
        1. 安装依赖包
          [root@hai7-7 ~]$yum install pcre-devel openssl-devel expat-devel -y
          
          • 1
        2. 官方下载httpd源码,以及依赖的apr包(apr-1.6.3.tar.gz、apr-util-1.6.1.tar.gz 、httpd-2.4.34.tar.bz2),导入linux中,然后解压缩
          [root@hai7115 srcd]$tar xf apr-1.6.3.tar.gz 
          [root@hai7115 srcd]$tar xf apr-util-1.6.1.tar.gz 
          [root@hai7115 srcd]$tar xf httpd-2.4.34.tar.bz2 
          
          • 1
          • 2
          • 3
        3. 将apr和apr-util整个目录拷贝到httpd-2.4.34/srclib/目录下,并且改名(必须)为apr和apr-util
          [root@hai7115 srcd]$cp -r apr-1.6.3 httpd-2.4.34/srclib/apr
          [root@hai7115 srcd]$cp -r apr-util-1.6.1 httpd-2.4.34/srclib/apr-util
          
          • 1
          • 2
        4. 编译,./configure作用,检查系统环境和配置生成makefile文件,检查所有所需要的编译操作的依赖环境是否可以满足,如果可以满足,将检查结果和命令行定义的选项特性结合makefile.in生成为makefile文件
          –enable-so enable表示启用某个内建特性;
          –disable表示禁用程序自带的特性;
          –with表示需要调用另外一个软件程序一起安装;
          –without表示不结合;
          '进入httpd解压后的目录,运行configure'
          ./configure
          --prefix=/app/httpd24
          --enable-so      		  <==是否支持动态模块
          --enable-ssl  			  <==是否支持加密
          --enable-cgi    
          --enable-rewrite
          --with-zlib     
          --with-pcre      		  <==正则表达式
          --with-included-apr      <==表示已经将apr相关需要编译的内容放在httpd相关的路径下,可以一起编译
          --enable-modules=most    <==是否支持大部分模块
          --enable-mpms-shared=all
          --with-mpm=prefork        <==是否支持mpm的prefork工作模型
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
        5. 构造和安装,make为项目管理工具,组织项目间的依赖关系,让最终的构建者能够快速构建项目代码,调用GCC等编译器,编译成特定程序包。
          安装步骤为大量的cp操作,将编译好的二进制程序放到对应目录下,make install会调用相应脚本执行cp动作。
          创建apache账号,不创建系统默认启动的账号为daemon
          1. '构造和安装 '
          [root@hai7115 httpd-2.4.34]$make -j 8  && make install
          2. '创建用户'
          [root@hai7-7 ~]$useradd -r -s /sbin/nologin apache
          3. '修改配置文件中的用户项,将httpd账号修改为apache'
          [root@hai7-7 ~]$vim /app/httpd24/conf/httpd.conf 
          User apache
          Group apache		
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
        6. 编译安装目录
          [root@hai7-8 /app/httpd24]$ll
          bin
          build
          cgi-bin   <==动态资源存放目录,cgi脚本
          conf
          error     <==错误页(例如访问页面不存在返回404等)
          htdocs    <==网页测试页面
          icons
          include   <==调用当前开发库做二次开发,需要知道API接口有哪些接口可被调用,对于c语言而言,都在include里用头文件标识
          lib       <==当前程序提供的库文件,分为共享库和开发库,共享库,被本程序的多个程序或程序包共享使用,开发库时做二次开发的的调用接口
          logs      <==日志文件
          man       <==帮助手册
          manual    <==超链接手册,需要web服务进行访问,在主配置文件中启用 #Include conf/extra/httpd-manual.conf行,配置文件在include后面为manual配置文件,需要启用negotiation_module模块
          modules   <==以编译的模块
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
        7. 将二进制程序放入PATH变量中,启动测试,测试所见页面文件来自/app/httpd24/htdocs目录下
          1. '加入PATH列表'
          [root@hai7-7 ~]$echo PATH=/app/httpd24/bin:$PATH > /etc/profile.d/lamp.sh
          2. '重启生效'
          [root@hai7-7 ~]$. /etc/profile.d/lamp.sh 
          
          • 1
          • 2
          • 3
          • 4
        8. 让自编译httpd开机启动,将其放入系统启动脚本rc.local,加上执行权限。或者写启动脚本,写启动脚本可以用service控制启动
          1. '将启动程序放在启动脚本中'
          [root@hai7-7 rc.d]$vim /etc/rc.d/rc.local 
          /app/httpd24/bin/apachectl
          2. '加上执行权限'
          [root@hai7-7 rc.d]$chmod +x /etc/rc.d/rc.local
          
          • 1
          • 2
          • 3
          • 4
          • 5
      3. 二进制编译数据库
        1. 解压数据库二进制包到指定目录下,目录必须/usr/local
          [root@hai7-7 ~]$tar xvf mariadb-10.2.15-linux-x86_64.tar.gz -C /usr/local
          
          • 1
        2. 解压后程序名为mariadb,需要修改为mysql,建一个软连接,建立一个系统mysql账号,修改所有者和所属组
          1. '进入解压目录'
          [root@hai7-7 ~]$cd /usr/local/
          2. '建立软连接,重命名程序'
          [root@hai7-7 local/]$ln -s mariadb-10.2.15-linux-x86_64/ mysql
          3. '建立系统账户'
          [root@hai7-7 local/]$useradd -r -s /sbin/nologin mysql
          4. '修改权限'
          [root@hai7-7 local]$chown -R mysql.mysql  mysql/
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
        3. 准备数据目录
          1. '建立数据库目录'
          [root@hai7-7 ~]$mkdir /app/mysql
          2. '将目录所属组所属者修改为mysql'
          [root@hai7-7 ~]$chown mysql.mysql /app/mysql
          3. '运行解压包带的脚本,生成系统数据库,必须在解压目录(/usr/local/mysql)运行,指定路径为新建的数据库目录,指定账号'
          [root@hai7-7 mysql]$scripts/mysql_install_db --datadir=/app/mysql --user=mysql
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
        4. 准备配置文件
          1. '在etc下建一个独立配置文件目录'
          [root@hai7-7 ~]$mkdir /etc/mysql
          2. '拷贝二进制包中模板来修改'
          [root@hai7-7 ~]$cp /usr/local/mysql/support-files/my-huge.cnf /etc/mysql/my.cnf
          3. '修改配置文件,指定数据库目录'
          [root@hai7-7 ~]$vim /etc/mysql/my.cnf
          [mysqld]
          datadir=/app/mysql
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
        5. 准备服务脚本,压缩包有模板文件,然后加入服务脚本启动列表中
          [root@hai7-7 ~]$cp /usr/local/mysql/support-files/mysql.server  /etc/init.d/mysqld
          [root@hai7-7 ~]$chkconfig  --add  mysqld
          
          • 1
          • 2
        6. 将mysql下的bin放入PATH变量中,加入httpd自定义变量文件中
          [root@hai7-7 bin]$vim /etc/profile.d/lamp.sh
          PATH=/app/httpd24/bin:/usr/local/mysql/bin:$PATH
          '生效一下'
          [root@hai7-7 bin]$. /etc/profile.d/lamp.sh
          
          • 1
          • 2
          • 3
          • 4
        7. 跑一下安全脚本mysql_secure_installation后,为wordpress建立一个使用的账号
          '建立wordpress网页用的账号和数据库'
          [root@hai7-7 bin]$mysql -e "CREATE DATABASE wpdb2;GRANT ALL ON wpdb2.* TO wpuser@'localhost' IDENTIFIED BY 'centos'"
          
          • 1
          • 2
      4. 编译php
        1. 安装依赖包
          libxml2-devel:php有些功能启用时,需要使用代码处理xml格式的文档,必须兼容使用xml的开发库
          bzip2-devel:php本身使用压缩解压功能,所依赖的库
          libmcrypt-devel :加密解密功能(epel)
          [root@hai7-7 bin]$yum -y install libxml2-devel  bzip2-devel  libmcrypt-devel
          
          • 1
        2. 解压php源码文件,进入目录,运行configure
          基于模块方式编译,加如下项,不可与fpm模式共用,使用apxs2编译成httpd模块
          –with-apxs2=/app/httpd24/bin/apxs
          基于fpm模式编译
          –enable-fpm
          注意:php-7.0以上版本使用–enable-mysqlnd --with-mysqli=mysqlnd ,原–with-mysql不再支持
          1. '解压源码包'
          [root@hai7-7 data]$tar xvf php-7.1.18.tar.bz2 
          2. '进入目录'
          [root@hai7-7 data]$cd php-7.1.18/
          3. '运行configure'
          [root@hai7-7 php-7.1.18]$./configure --prefix=/app/php 
          --enable-mysqlnd       
          --with-mysqli=mysqlnd        <==连接数据库的3种方法之一
          --with-openssl 
          --with-pdo-mysql=mysqlnd     <==连接数据库的方法之一,基于对象方式来访问数据的接口
          --enable-mbstring  		  <==支持多字节
          --with-freetype-dir    	  <==与字体处理相关联的库
          --with-jpeg-dir 			  <==与图形处理相关的
          --with-png-dir 		 	  <==png图形处理相关
          --with-zlib 		 		  <==压缩解压缩相
          --with-libxml-dir=/usr  	  <==处理xml格式文档
          --enable-xml 		  		  <==启用xml功能
          --enable-sockets 		  	  <==支持基于sockets本地进行通讯
          --enable-fpm                 <==基于fpm工作
          --with-config-file-path=/etc 		     		<==指明config路径
          --with-config-file-scan-dir=/etc/php.d 		<==模块化配置文件路径
          --enable-maintainer-zts  		  				<==mpm如果是prefork不需要此项,此项为启用线程化的php模块
          --disable-fileinfo 禁止访问file信息
          4. '构造和安装'
          [root@hai7-7 php-7.1.18]$make -j 8 && 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
        3. 将php的bin目录加入PATH变量
          [root@hai7-7 bin]$cat /etc/profile.d/lamp.sh 
          PATH=/app/httpd24/bin:/usr/local/mysql/bin:/app/php/bin:$PATH
          
          • 1
          • 2
        4. 为php提供配置文件,在编译目录下复制一份到etc目录下,命名为php.ini,默认设置,除时区外,通常不需要修改
          php.ini-development(开发环境)和php.ini-production(生成环境),二者配置参数不同,根据环境选择
          [root@hai7-7 ~]$cp /data/php-7.1.18/php.ini-production /etc/php.ini
          
          • 1
        5. 在Apache配置文件中加入一些设置,让其识别php程序,建立一个独立子配置文件
          1. '先在主配置文件中加入include,让其可以包含子配置文件'
          [root@hai7-7 ~]$vim /app/httpd24/conf/httpd.conf
          Include conf/extra/php.conf
          2. '建立子配置文件,加入FCGI配置项'
          [root@hai7-7 ~]$cd /app/httpd24/conf/extra/
          [root@hai7-7 extra]$vim php.conf
          AddType application/x-httpd-php .php          <==让httpd可以识别php文件
          AddType application/x-httpd-php-source .phps
          

    ProxyRequests Off <==不启动正向代理
    ProxyPassMatch ^/(.*.php)$ fcgi://127.0.0.1:9000/app/httpd24/htdocs/$1 <==启动反向代理```

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 启用httpd的两个模块,定位到LoadModule,去掉注释即可,指定默认页面文件为php
    [root@hai7-7 ~]$vim /app/httpd24/conf/httpd.conf
    DirectoryIndex index.php  index.html           <==指定默认页面文件为php文件,没有在读取html
    LoadModule proxy_module modules/mod_proxy.so   <==需要启动的模块
    LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so  <==需要启动的模块
    
    • 1
    • 2
    • 3
    • 4
  • 准备启动脚本
    1. '将解压目录下init.d.php-fpm文件作为模板,拷贝到init.d中'
    [root@hai7-7 ~]$cp /data/php-7.1.18/sapi/fpm/init.d.php-fpm  /etc/init.d/php-fpm
    2. '为其加上执行权限'
    [root@hai7-7 ~]$chmod +x /etc/init.d/php-fpm
    3. '加入到启动服务列表'
    [root@hai7-7 ~]$chkconfig --add  php-fpm
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 准备php配置文件,和www的子配置文件
    1. '编译后已经生成,只是文件后缀不符合要求,进入/app/php/etc目录,修改后缀,启动服务'
    [root@hai7-7 ~]$cd /app/php/etc
    [root@hai7-7 etc]$cp php-fpm.conf.default php-fpm.conf    <==主配置文件
    2.' 进入 /app/php/etcphp-fpm.d'
    [root@hai7-7 etc]$cd php-fpm.d/
    [root@hai7-7 php-fpm.d]$cp  www.conf.default  www.conf    <==子配置文件
    3. '在子配置文件中修改运行账号,还可以定义监听端口等'
    [root@hai7-7 php-fpm.d]$vim  www.conf 
    user = apache    <==将运行账号修改为apache
    group = apache
    4. '启动服务'
    [root@hai7-7 php-fpm.d]$service php-fpm start
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • workpress
    1. 解压workpress文件,拷贝到网页文件目录下(/app/httpd24/htdocs/)
      1. '解压文件'
      [root@hai7-7 data]$tar xvf wordpress-4.9.4-zh_CN.tar.gz 
      2. '拷贝到页面目录下'
      [root@hai7-7 data]$cp -r wordpress/* /app/httpd24/htdocs/
      3. '准备wordpress的配置文件'
      [root@hai7-7 htdocs]$cp wp-config-sample.php wp-config.php
      4. '修改配置,连接数据库'
      [root@hai7-7 htdocs]$vim wp-config.php
      /** WordPress数据库的名称 */
      define('DB_NAME', 'wpdb2');
      /** MySQL数据库用户名 */
      define('DB_USER', 'wpuser');
      /** MySQL数据库密码 */
      define('DB_PASSWORD', 'centos');
      /** MySQL主机 */
      define('DB_HOST', 'localhost');
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
  • 8 CentOS6编译安装PHP-FPM模式的LAMP

    • 编译环境
      1. mairadb:通用二进制格式,mariadb-5.5.56
      2. httpd:编译安装,httpd-2.4.27
      3. php5:编译安装,php-5.6.30
      4. Wordpress: 安装wordpress-4.8-zh_CN.tar.gz
      5. Xcache:编译安装xcache-3.2.0
    • 实现顺序
      mariadb–>httpd–>php
    • 编译过程
    1. 安装相关包
      bzip2-devel libxml2-devel libmcrypt-devel(epel源)
    2. 编译安装php
      1. 进入解压目录
        cd php-5.6.30/
      2. 编译安装
        1. 运行configure脚本
          ./configure --prefix=/app/php5 --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --enable-fpm --with-mcrypt --with-config-file-path=/etc/php5 --with-config-file-scan-dir=/etc/php5.d --with-bz2
        2. 构造和安装
          make -j 4 && make install
        3. 实现php的配置文件和服务脚本
          1. mkdir /etc/php5 /etc/php5.d/
          2. cd php-5.6.30/
          3. cp php.ini-production /etc/php5/php.ini
          4. cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
          5. chmod +x /etc/rc.d/init.d/php-fpm
          6. chkconfig --add php-fpm
          7. chkconfig --list php-fpm
    3. 编辑php配置文件
      1. cd /app/php5/etc
      2. cp php-fpm.conf.default php-fpm.conf
      3. vim /app/php5/etc/php-fpm.conf
        pm.max_children = 50
        pm.start_servers = 5
        pm.min_spare_servers = 2
        pm.max_spare_servers = 5 和pm.start_servers一致
        pid = /app/php5/var/run/php-fpm.pid
      4. service php-fpm restart
    4. 修改httpd24的配置文件
      1. vim /app/apache24/conf/httpd.conf
        说明:启用httpd的相关模块
        在Apache httpd 2.4以后已经专门有一个模块针对FastCGI的实现,此模块为mod_proxy_fcgi.so,它其实是作为mod_proxy.so模块的扩充,因此,这两个模块都要加载
        去掉下面两行注释
        LoadModule proxy_module modules/mod_proxy.so
        LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
        添加如下二行
        AddType application/x-httpd-php .php
        AddType application/x-httpd-php-source .phps
        定位至DirectoryIndex index.html
        修改为:
        DirectoryIndex index.php index.html
        加下面两行
        ProxyRequests Off 关闭正向代理
        ProxyPassMatch ^/(.*.php)$ fcgi://127.0.0.1:9000/app/httpd24/htdocs/$1
        service httpd24 restart
    5. 测试
      vim /app/httpd24/htdocs/index.php
      <?php
      $link = mysql_connect('127.0.0.1','root','magedu');
      if ($link)
      echo "Success...";
      else
      echo "Failure...";
      mysql_close();
      phpinfo();
      ?>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
            </div>
    					<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-7f770a53f2.css" rel="stylesheet">
                </div>
    
  • 相关阅读:
    变量传递方法
    一些很好的话
    通过“任务计划”设置了计划任务后,到了预定时刻没有执行。这是怎么回事?
    结果集合并查询(union后不加all可去掉相同结果项)
    将SqlCe/sql server 转sqlite
    安装KB 2756920 SharePoint 2010无法工作
    适合新手的 Android 开发环境搭建(2) 安装及更新SDK
    在Internal Table 中使用AT FIRST , AT NEW, AT THE END OF , AT LAST, Sum
    Bex Analyzer 在 win 7 下无法登录sap gui 中新增的bw系统
    适合新手的 Android 开发环境搭建
  • 原文地址:https://www.cnblogs.com/duanxin1/p/9902282.html
  • Copyright © 2020-2023  润新知