20、httpd程序包自带的工具介绍
        
            httpd:
            httpd - Apache Hypertext Transfer Protocol Server
                apache服务器程序
        
                -t: 测试配置文件是否有语法错误
                -l: 列表静态模块
                -l     Output  a  list  of  modules  compiled  into  the server. This will not list dynamically loaded modules included using the LoadModule directive.
                -D DUMP_MODULES:列出DSO模块
                -M:
                -D DUMP_VHOSTS: 列出所有虚拟主机
        
            htpasswd:
                为基于文件的basic认证创建和更新用户认证文件
        
            apachectl:
            apachectl - Apache HTTP Server Control Interface
                脚本,httpd服务控制工具;
        Usage: /usr/sbin/httpd [-D name] [-d directory] [-f file]
                               [-C "directive"] [-c "directive"]
                               [-k start|restart|graceful|graceful-stop|stop]
                               [-v] [-V] [-h] [-l] [-L] [-t] [-S]
         在编译时,没有启动脚本时,可以用此命令来启动Apache                      
        
            ab: apache benchmark
                httpd的基准性能测试工具;
        
            apxs:
                httpd得以扩展使用第三方模块的工具;
        
            htcacheclean:
                磁盘缓存清理工具;
        
            htdigest:
                为digest认证创建和更新用户认证文件
        
            httxt2dbm:
                为rewrite map(重写映射表)创建dbm格式的文件
                htcacheclean - Clean up the disk cache
        
            rotatelogs:
            rotatelogs - Piped logging program to rotate Apache logs
                不关闭httpd而切换其使用日志文件的工具
        
                access_log, access_log.1, access_log.2,(日志滚动)
                /etc/logrotate.d/httpd 能自动实现日志滚动的   是rpm包安装才有的
        
            suexec:
            suexec - Switch user before executing external programs
                User apache
                Group apache
        
                当httpd进程需要以另外的用户的身份去访问某些资源时,可以以suexec作临时切换;
        
        21、ab工具的初步使用
        ab - Apache HTTP server benchmarking tool
        Apache基准性能测试工具
        
        生产环境、测试环境、开发环境
        
            同类工具:http_load, webbench, seige
        
            Usage: ab [options] [http[s]://]hostname[:port]/path
        
                -c #: 模拟的并发数;
                -c concurrency
               Number of multiple requests to perform at a time. Default is one request at a time.
                -n #: 总的请求数
                -n requests
              Number of requests to perform for the benchmarking session. The default is to  just  perform  a  single request which usually leads to non-representative benchmarking results.
        
                -n的值一定要大于等于-c的值;
        
        =================
        tcpcopy 模拟真正的环境来进行测试
        tcpcopy-0.9.6-1.el6.x86_64
        =================

        在另外一台主机上发起压力测试,并发200个请求,总共请求5000次,注意在压测时,可以访问服务器的状态页面,就能看到服务器工作的大量信息
        [[email protected] ~]# ab -c 200 -n 5000 http://192.168.20.163/compress
        This is ApacheBench, Version 2.3 <$Revision: 655654 $>
        Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
        Licensed to The Apache Software Foundation, http://www.apache.org/
        
        Benchmarking 192.168.20.163 (be patient)
        Completed 500 requests
        Completed 1000 requests
        Completed 1500 requests
        Completed 2000 requests
        Completed 2500 requests
        Completed 3000 requests
        Completed 3500 requests
        Completed 4000 requests
        Completed 4500 requests
        Completed 5000 requests
        Finished 5000 requests
        
        
        Server Software:        Apache
        Server Hostname:        192.168.20.163
        Server Port:            80
        
        Document Path:          /compress
        Document Length:        312673 bytes
        
        Concurrency Level:      200  并发级别为200个
        Time taken for tests:   133.513 seconds  整个测试所经过的时长
        Complete requests:      5000  完成请求的个数为5000个
        Failed requests:        0
        Write errors:           0
        Total transferred:      1568340024 bytes  此次传输一共多少个字节
        HTML transferred:       1567036644 bytes  一共传输的html有多少字节,基本都是html的内容
        Requests per second:    37.45 [#/sec] (mean) 每秒钟完成的请求个数
        Time per request:       5340.508 [ms] (mean)  并发一次请求所经过的时长
        Time per request:       26.703 [ms] (mean, across all concurrent requests) 每一次请求所经过的时长
        Transfer rate:          11471.43 [Kbytes/sec] received  使用带宽11471.43/1024大约为11Mbps

       
        Connection Times (ms)
                      min  mean[+/-sd] median   max
        Connect:        3  481 165.9    506    3156
        Processing:   210 4798 972.9   4796   14069
        Waiting:       32  892 1079.2    546   10284
        Total:        214 5279 1064.2   5321   15102
        
        Percentage of the requests served within a certain time (ms)
          50%   5321
          66%   5333
          75%   5342
          80%   5351
          90%   5456
          95%   5837
          98%   6411
          99%   9182
         100%  15102 (longest request)        
        测试条件:在测试时,能够正常打开网页的,测试有效在3-5s之内访问正常
        
        [[email protected] ~]# ab -c 500 -n 10000 http://192.168.20.163/compress
        This is ApacheBench, Version 2.3 <$Revision: 655654 $>
        Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
        Licensed to The Apache Software Foundation, http://www.apache.org/
        
        Benchmarking 192.168.20.163 (be patient)
        apr_socket_recv: Connection reset by peer (104)
        Total of 221 requests completed

        打开太多文件了,直接退出,因为web服务器在VMware workstation上,处理性能比较低
        
        Linux限定每个普通用户最多只能打开1024个文件
        
        22、资源限定
            软限定:可临时超出一定时长的上限,达到时长后,超出的会全部关闭
            硬限定:绝对不可超出的上限
        
            管理员可使用ulimit命令临时性地修改各种资源的软限制;
                ulimit -n #:显示能同时打开的文件数
                       -u #: 能同时启动的进程数
        [[email protected] ~]# ulimit -n
        1024
        [[email protected] ~]# ulimit -u
        3686


        Modify shell resource limits.
            
        Provides control over the resources available to the shell and processes
        it creates, on systems that allow such control.
        [[email protected] ~]# ulimit -n 5000
        [[email protected] ~]# ulimit -n
        5000

          可以设置访问限制
            永久修改,配置文件:
                /etc/security/limits.conf  文件中有使用帮助可以#man limits.conf查看帮助手册
                /etc/security/limits.d/*.conf

        


        此处已经安装好了apache,apache又是在Linux上工作,加下来就要安装MySQL了

        MySQL安装:
            三种方式:
                1、rpm包安装(两种类型)
                    (1) OS vendor (发行商所提供的rpm包)
                    (2) 项目方提供
                2、通用二进制格式
                    展开、配置后即可使用
                3、源码编译安装
                    使用:cmake编译器
    
            CentOS 6.x:
                mysql-server:
                    服务脚本:/etc/rc.d/init.d/mysqld
                    主服务程序:/usr/bin/mysqld_safe
                    数据文件:/var/lib/mysql
                    配置文件:/etc/my.cnf
                    客户端程序:/usr/bin/mysql
    
                    unix sock: /var/lib/mysql/mysql.sock 启动时,自动生成
                    
        mysql是单进程多线程模型,维持的是内部线程
                mysqld第一次启动之前需要先初始化:
                    创建mysqld服务自身运行依赖元数据数据库:mysql

        查看有哪些与MySQL相关的包

        [[email protected] ~]# yum list all mysql*

         。。。。

        。。。。。

        需要安装mysql-server包,提供mysql服务

        [[email protected] ~]# yum install -y mysql-server

        启动myql

        [[email protected] ~]# service mysqld start

        Initializing MySQL database:  Installing MySQL system tables...初始化
        OK
        Filling help tables...
        OK
        
        To start mysqld at boot time you have to copy
        support-files/mysql.server to the right place for your system
        
        PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
        To do so, start the server, then issue the following commands:
        
        /usr/bin/mysqladmin -u root password 'new-password'
        /usr/bin/mysqladmin -u root -h localhost.localdomain password 'new-password'
        
        Alternatively you can run:
        /usr/bin/mysql_secure_installation
        
        which will also give you the option of removing the test
        databases and anonymous user created by default.  This is
        strongly recommended for production servers.
        
        See the manual for more instructions.
        
        You can start the MySQL daemon with:
        cd /usr ; /usr/bin/mysqld_safe &
        
        You can test the MySQL daemon with mysql-test-run.pl
        cd /usr/mysql-test ; perl mysql-test-run.pl
        
        Please report any problems with the /usr/bin/mysqlbug script!
        
                                                                   [  OK  ]
        Starting mysqld:                                           [  OK  ]

        [[email protected] httpd]# ss -tnlp | grep mysql
LISTEN     0      50                        *:3306                     *:*      users:(("mysqld",27797,10))

        MySQL起来了监听在tcp的3306端口,服务进程为mysqld

        [[email protected] ~]# mysql  连接到MySQL服务器
        Welcome to the MySQL monitor.  Commands end with ; or \g.
        Your MySQL connection id is 2
        Server version: 5.1.73 Source distribution
        
        Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
        
        Oracle is a registered trademark of Oracle Corporation and/or its
        affiliates. Other names may be trademarks of their respective
        owners.
        
        Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
        
        mysql> show databases;  显示当前有哪些数据库
        +--------------------+
        | Database           |
        +--------------------+
        | information_schema |
        | mysql              |
        | test               |
        +--------------------+
        3 rows in set (0.00 sec)
        
        mysql> select User,Host,Password from mysql.user; 显示用户名和主机和密码
        +------+-----------------------+----------+
        | User | Host                  | Password |
        +------+-----------------------+----------+
        | root | localhost             |          |
        | root | localhost.localdomain |          |
        | root | 127.0.0.1             |          |
        |      | localhost             |          |匿名用户
        |      | localhost.localdomain |          |匿名用户
        +------+-----------------------+----------+
        5 rows in set (0.00 sec)
        
        mysql>
        

        交互式命令:
                客户端命令:无需分号结尾;
                服务器端命令:必需分号结尾;

        


        关于PHP
    
        一、PHP简介
            
        PHP是通用服务器端脚本编程语言,其主要用于web开发以实现动态web页面,它也是最早实现将脚本嵌入HTML源码文档中的服务器端脚本语言之一。同时,php还提供了一个命令行接口,因此,其也可以在大多数系统上作为一个独立的shell来使用。
    
        Rasmus Lerdorf于1994年开始开发PHP,它最初是一组被Rasmus Lerdorf称作“Personal Home Page Tool” 的Perl脚本, 这些脚本可以用于显示作者的简历并记录用户对其网站的访问。后来,Rasmus Lerdorf使用C语言将这些Perl脚本重写为CGI程序,还为其增加了运行Web forms的能力以及与数据库交互的特性,并将其重命名为“Personal Home Page/Forms Interpreter”或“PHP/FI”。此时,PHP/FI已经可以用于开发简单的动态web程序了,这即是PHP 1.0。1995年6月,Rasmus Lerdorf把它的PHP发布于comp.infosystems.www.authoring.cgi Usenet讨论组,从此PHP开始走进人们的视野。1997年,其2.0版本发布。
    
        1997年,两名以色列程序员Zeev Suraski和Andi Gutmans重写的PHP的分析器(parser)成为PHP发展到3.0的基础,而且从此将PHP重命名为PHP: Hypertext Preprocessor。此后,这两名程序员开始重写整个PHP核心,并于1999年发布了Zend Engine 1.0,这也意味着PHP 4.0的诞生。2004年7月,Zend Engine 2.0发布,由此也将PHP带入了PHP 5时代。PHP5包含了许多重要的新特性,如增强的面向对象编程的支持、支持PDO(PHP Data Objects)扩展机制以及一系列对PHP性能的改进。
    
        二、PHP Zend Engine
    
        Zend Engine是开源的、PHP脚本语言的解释器,它最早是由以色列理工学院(Technion)的学生Andi Gutmans和Zeev Suraski所开发,Zend也正是此二人名字的合称。后来两人联合创立了Zend Technologies公司。
    
        Zend Engine 1.0于1999年随PHP 4发布,由C语言开发且经过高度优化,并能够做为PHP的后端模块使用。Zend Engine为PHP提供了内存和资源管理的功能以及其它的一些标准服务,其高性能、可靠性和可扩展性在促进PHP成为一种流行的语言方面发挥了重要作用。
    
        Zend Engine的出现将PHP代码的处理过程分成了两个阶段:首先是分析PHP代码并将其转换为称作Zend opcode的二进制格式(类似Java的字节码),并将其存储于内存中;第二阶段是使用Zend Engine去执行这些转换后的Opcode。
    
        三、PHP的Opcode
    
        Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL。
        PHP执行PHP脚本代码一般会经过如下4个步骤(确切的来说,应该是PHP的语言引擎Zend):
        1、Scanning(Lexing) —— 将PHP代码转换为语言片段(Tokens)
        2、Parsing —— 将Tokens转换成简单而有意义的表达式
        3、Compilation —— 将表达式编译成Opocdes
        4、Execution —— 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能
    
            扫描-->分析-->编译-->执行
    
        四、php的加速器
    
        基于PHP的特殊扩展机制如opcode缓存扩展也可以将opcode缓存于php的共享内存中,从而可以让同一段代码的后续重复执行时跳过编译阶段以提高性能。由此也可以看出,这些加速器并非真正提高了opcode的运行速度,而仅是通过分析opcode后并将它们重新排列以达到快速执行的目的。
    
        常见的php加速器有:
    
        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缓存,经过严格测试且被大量用于生产环境。项目地址
        ,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
    
        五、PHP源码目录结构
    
        PHP的源码在结构上非常清晰。其代码根目录中主要包含了一些说明文件以及设计方案,并提供了如下子目录:
    
        1、build —— 顾名思义,这里主要放置一些跟源码编译相关的文件,比如开始构建之前的buildconf脚本及一些检查环境的脚本等。
        2、ext —— 官方的扩展目录,包括了绝大多数PHP的函数的定义和实现,如array系列,pdo系列,spl系列等函数的实现。 个人开发的扩展在测试时也可以放到这个目录,以方便测试等。
        3、main —— 这里存放的就是PHP最为核心的文件了,是实现PHP的基础设施,这里和Zend引擎不一样,Zend引擎主要实现语言最核心的语言运行环境。
        4、Zend —— Zend引擎的实现目录,比如脚本的词法语法解析,opcode的执行以及扩展机制的实现等等。
        5、pear —— PHP 扩展与应用仓库,包含PEAR的核心文件。
        6、sapi —— 包含了各种服务器抽象层的代码,例如apache的mod_php,cgi,
        fastcgi以及fpm等等接口。
        7、TSRM —— PHP的线程安全是构建在TSRM库之上的,PHP实现中常见的*G宏通常是对TSRM的封装,TSRM(Thread Safe Resource Manager)线程安全资源管理器。
        8、tests —— PHP的测试脚本集合,包含PHP各项功能的测试文件。
        9、win32 —— 这个目录主要包括Windows平台相关的一些实现,比如sokcet的实现在Windows下和*Nix平台就不太一样,同时也包括了Windows下编译PHP相关的脚本。
    
    
    
    
        php.ini官方文档:
            配置参数:http://www.php.net/manual/zh/ini.list.php
            核心配置参数详解:http://www.php.net/manual/zh/ini.core.php
    
    php的安装:
        rpm包
        编译安装

        [[email protected] httpd]# yum install -y php php-mysql

        [[email protected] httpd]# rpm -ql php
        /etc/httpd/conf.d/php.conf
        /usr/lib64/httpd/modules/libphp5.so
        /var/lib/php/session
        /var/www/icons/php.gif
        [[email protected] httpd]# rpm -ql php-mysql
        /etc/php.d/mysql.ini
        /etc/php.d/mysqli.ini
        /etc/php.d/pdo_mysql.ini
        /usr/lib64/php/modules/mysql.so
        /usr/lib64/php/modules/mysqli.so
        /usr/lib64/php/modules/pdo_mysql.so
       

        提供php测试页面

        [[email protected] httpd]# cat /web/love_oi/index.php
        <?php
           phpinfo();
        ?>

        重启httpd
        [[email protected] httpd]# service httpd restart
        Stopping httpd:                                            [  OK  ]
        Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName
        在客户端访问

        从一个页面请求开始(二)                                                           [  OK  ]                

        提供连接MySQL的测试文件

        [[email protected] httpd]# cat /web/love_oi/index.php
        <?php
           $link = mysql_connect('127.0.0.1','root','');
        
           if ($link)
              echo "Success...";
           else
              echo "Failure...";
        
           mysql_close();
        
           phpinfo();
        ?>

        在客户端访问测试页面

        从一个页面请求开始(二)

        部署wordpress,解压wordpress,把cp wp-config-sample.php wp-config.php已提供配置文件,此时访问时会出现  
        Error establishing a database connection

        [[email protected] love_oi]# tar xf wordpress-3.9.1.tar.gz
        [[email protected] love_oi]# ls
        bacula-7.0.5.tar.gz  index.php                         wordpress
        compress             phpMyAdmin-4.1.13-english.tar.gz  wordpress-3.9.1.tar.gz
        [[email protected] love_oi]# cd wordpress
        [[email protected] wordpress]# ls
        index.php        wp-admin              wp-content         wp-load.php      wp-signup.php
        license.txt      wp-blog-header.php    wp-cron.php        wp-login.php     wp-trackback.php
        readme.html      wp-comments-post.php  wp-includes        wp-mail.php      xmlrpc.php
        wp-activate.php  wp-config-sample.php  wp-links-opml.php  wp-settings.php
        [[email protected] wordpress]# cp wp-config-sample.php wp-config.php
        提供wordpress存储数据的数据库

        mysql> create database wordpress;  新建数据库
        Query OK, 1 row affected (0.00 sec)
        把数据库授权给wordpress,并给其提供密码
        mysql> grant all on wordpress.* to 'wordpress'@'192.168.20.%' identified by '123456';
        Query OK, 0 rows affected (0.00 sec)
        
        mysql> flush privileges;  刷新授权表
        Query OK, 0 rows affected (0.00 sec)
        
        mysql> \q
        Bye       

        编辑wp-config.php
        指定wordpress的数据库和用户名和密码,可以新建一个数据库,再给其授权               

        // ** MySQL settings - You can get this info from your web host ** //
        /** The name of the database for WordPress */
        define('DB_NAME', 'database_name_here改为wordpress');  
        
        /** MySQL database username */
        define('DB_USER', 'username_here改为wordpress');
        
        /** MySQL database password */
        define('DB_PASSWORD', 'password_here改为123456');
        
        /** MySQL hostname */
        define('DB_HOST', 'localhost改为192.168.20.163');

        再从客户端访问时显示如下

        从一个页面请求开始(二)        安装好后,登录进去就是如下界面:

        从一个页面请求开始(二)

         部署phpmyadmin

        [[email protected] love_oi]# tar xf phpMyAdmin-4.1.13-english.tar.gz -C /web/love_op/
        [[email protected] love_oi]# cd /web/love_op/
        [[email protected] love_op]# ls
        index.html  phpMyAdmin-4.1.13-english
        [[email protected] love_op]# mv phpMyAdmin-4.1.13-english phpmyadmin       

         phpmyadmin部署后,访问不显示任何信息,日志记录如下
         PHP Fatal error:  Call to undefined function mb_detect_encoding()
          in /web/love_op/phpmyadmin/libraries/php-gettext/gettext.inc on line 177
        说明编码格式不支持
        # yum install -y php-mbstring  安装对编码的支持

        # rpm -ql php-mbstring
        # service httpd restart 或重新加载才能生效
        此时访问正常了,显示

        从一个页面请求开始(二)

        提供访问phpmyadmin的用户

        mysql> grant all on phpmyadmin.* to 'root'@'localhost' identified by '123456';
        Query OK, 0 rows affected (0.00 sec)
        
        mysql> flush privileges;
        Query OK, 0 rows affected (0.00 sec)
        
        mysql>        

        用root用户登录显示如下:

        从一个页面请求开始(二)

        此时可以管理MySQL了


        部署一个discuz,如下操作:

        [[email protected] love_cn]# unzip Discuz_X3.1_SC_UTF8.zip

        [[email protected] discuz]# ls /web/love_cn
        readme  upload  utility

        在客户端访问192.168.20.163:8080/upload,显示如下:

        从一个页面请求开始(二)

        显示这种情况时,就在

        [[email protected] upload]# pwd
        /web/love_cn/upload 下把对应文件和文件的权限{其他用户有些权限}给定后,刷新访问页面就ok了

        [[email protected] upload]# chmod o+w config/ data/     data/{cache,avatar,plugindata,download,addonmd5,template,threadcache,p_w_upload}
        [[email protected] upload]# chmod o+w data/p_w_upload/{album,forum,group} data/log
        [[email protected] upload]# chmod o+w uc_client/data/cache uc_server/data uc_server/data/{cache,avatar,backup,logs,tmp,view}

        创建数据库,并且授权给用户

        mysql> create database ultrax;
        Query OK, 1 row affected (0.00 sec)
        
        mysql> grant all on ultrax.* to 'root'@'localhost' identified by 'root';
        Query OK, 0 rows affected (0.00 sec)

        安装好后,就显示如下界面

        从一个页面请求开始(二)

        从一个页面请求开始(二)

        从一个页面请求开始(二)

        接下来再对部署的几个应用中的其中一个做压力测试,测试后通过提供一个xcache来应用php的加速,把mysql分离,后续提供MySQL的主从复制和自动化运维工具ansible的讲解看看具体能提供怎样的性能,欲知后续如何,请看下回分解,