httpd 高级应用

回顾:httpd, lamp, mysql httpd:https, mod_deflate, …

httpd+php:三种结合方式
    Module:
        prefork:libphp5.so
        worker, event:libphp5-zts.so
    CGI:通用网关接口
    FastCGI

php连接数据库

mysql(mariadb):
    C/S:
        C --> mysql协议 --> S
            mysql协议主要传输SQL语句

php需要一个扩展模块,默认是不安装的
    php-mysql

amp-module:
    静态资源:Client --> http协议 --> httpd (IO操作)
    php动态资源:Client --> http协议 --> httpd --> libphp5.so (IO操作)
    php动态资源:Client --> http 协议--> httpd --> libphp5.so (IO操作, php-mysql)--> mysql协议 --> mysqld

lamp(1)

静态资源响应速度快。 动态资源响应速度要比静态资源慢的多,服务器需要加载,执行动态资源,还可能需要访问数据,php再与数据库进行交互,获取数据资源。 应该尽量少的使用动态资源。一般遵循二八法则

php:嵌入式web应用编程语言

php及解析器(解释器)

作者:Rasmus Lerdorf, Personal Home Page tool, C语言(CGI,Web Forms), PHP/FI
zeev, andi重写php的解析器, zend engine 1.0, php 4.0; zend engine 2.0 php 5.0(增强的面向对象,支持PDO(php数据对象,php与数据库交互式时,不仅能基于数据流的交换,还能基于对象的方式进行交换)机制)

php解析器

php解析器--编译成opcode--执行
解析器功能:词法语法句法分析等...
scanning扫描,parsing分析,compilation,excution
提升opcode性能,使用opcodecache  php加速器

解析器:两类

zend engine:编译 --> 编译为opcode, 执行

    分解为4步:Scanning(Lexing(开源词法分析工具)词法分析), Parsing(语法分析), Compilation, Excution
    编译成伪二进制格式,在zend引擎上执行。将php代码运行缩减为两部

hhvm:刚诞生的组件,但是应用的不多。运行效率更高。facebook研发的解释器
    把php代码翻译成c++代码。

注:zend把php代码的执行分为两个阶段,第一阶段解析,第二阶段执行。编译的结果缓存下来,用户请求同一个资源则快了很多,不需要从编译,只需重新执行一次就可以,带来了效率的提升。 任何语言都需要解析器,分析,分解,语法分析,词法分析,然后才能编译。 php使用zend引擎

php加速器:

以httpd进程模型为例(prefork) httpd是以进程模型,为用户提供服务。php也是基于类似方式运行。一个php进程服务于一个httpd进程。php使用zend引擎,编译后的opcod缓存先来只能为与之对应的httpd进程服务。 但是如果其他httpd进程请求了同样的动态资源,就不能共享其opcode。zend不能跨进程为httpd服务提供共享缓存。

加速器:加速器在php的多进程之间放一段空间,将每个进程编译的opcode代码放到一个公共的空间。这个组件就是组件,opcache。

使用opcache提升性能2到3倍以上

XCache加速器

加速器有多种

APC (php的扩展模块),eAccelerator,XCache(较流行的)...

安装XCache,epel源。还有管理工具需要单独安装

使用ab测试,根据访问模型,可能测试不出来。ab -c50 -n1000 http://127.0.0.1/index.php

需要优化时修改其配置文件,rpm -ql php—xcache

php可以以类似worker方式运行,但是不同woker之间不能共享编译后的opcode,zend引擎也仅是对单个woker的线程有优化作用。后来则出现了加速器,实现不同php线程间共享opcode

APC,eAccelerator,XCache

XCache安装包获取途径epel源

XCache: XCache is a fast, stable  PHP opcode and data cacher that has been tested and is now running on production servers under high load.

    [root@localhost ~]# rpm -ql php-xcache
    /etc/php.d/xcache.ini   ####定义xcache工作机制
    /usr/lib64/php/modules/xcache.so
    /usr/share/doc/php-xcache-3.1.1
    /usr/share/doc/php-xcache-3.1.1/AUTHORS
    /usr/share/doc/php-xcache-3.1.1/COPYING
    /usr/share/doc/php-xcache-3.1.1/ChangeLog
    /usr/share/doc/php-xcache-3.1.1/README
    /usr/share/doc/php-xcache-3.1.1/THANKS

安装httpd,php,mariadb-server,php-mysql,php-xcache [root@centos7 ~]# yum install mariadb-server php php-mysql php-xcache httpd php-mbstring -y 注意php-xcache使用epel源安装,yum仓库要配置epel源。

php要支持中就要安装php-mbstring这个扩展模块 php要支持mysql数据库就要安装php-mysql这个扩展模块

环境搭建完毕可使用php函数写一个测试页

可以看到系统环境的配置信息。

httpd配置信息 php及php扩展的配置信息 与mysql交互的配置信息

<?php
        phpinfo();
?>

安装phpMyAdmin,可以实现web界面管理数据库。

php配置文件:/etc/php.ini, /etc/php.d/*.ini

ini:
    [section_id]
    directive = value

    注释符;
date.timezone = Asia/Shanghai 必须修改时区,否则系统会报错。默认事注释掉的。使用系统时区。


php.ini的核心配置选项:
    http://php.net/manual/zh/ini.core.php 
php.ini配置选项列表:
    http://php.net/manual/zh/ini.list.php 

依赖于程序员的要求或压测结果进行优化php。没有统一标准化的配置。都是实际生产环境配置。配置安全方面,启用关闭某些模块...
配置文件中的配置项有说明事开发环境或是生产环境使用的。根据实际情况做调整。

httpd+php使用FastCGI模式结合

PHP FastCGI Process Manager 特别适用于繁忙的站点。

php是个独立的守护进程,用户可以独立的给php发送请求。适合繁忙的站点 监听在某个套接字上,基于某种并发方式相应前端的并发请求。

php-fpm

FastCGI的linux上实现是php的扩展模块php-fpm实现 同时httpd要支持php的FastCGI,与之通信,httpd也需要模块支持。

基于某个套接字与用户通信,httpd要扮演成客户端,去连接fastcgi服务端。

httpd要使用模块 fcgi   proxy_fcgi_module (shared)
httpd 代理用户访问php
只是个代理模块。作为反向代理用户访问动态资源。

2.2当中没有自带,需要重新编译。2.4中已经自带了。

fcgi服务类似一个简装版的httpd服务。httpd将用户请求通过fcgi协议发送给php,php从本地文件系统读取用户的url资源。

客户端与httpd服务器之间走的是http协议,httpd服务器与php动态资源服务器之间走的是FastCGI协议。

正向代理是面向有限的客户端请求,发送给任意服务器—服务于请求方 反向代理是代表有限几台服务器,可以响应所有用户请求。—服务于请求方

可以实现 三台服务实现

httpd一台服务器
php一台服务器
mysql一台服务器

还可以是实现扩展

实现多台httpd服务器提供静态资源服务器
实现多台php服务器提高动态资源

httpd 对多台php服务器,httpd相当于一个调度器,分发器
需要面对一个session的问题。需要在php服务器后端放置一个session-server

    1、实现机制,识别同一个用户,固定到一个php服务器上
    2、基于cookie绑定用户,缺点服务器挂了,此服务器上的用户也都挂掉
    3、同步所有用户的session到每一台服务器。但是不是合适大规模使用。
    4、使用共享存储,sessionsever实现,单独服务器实现。
        一般使用redis数据库实现,简单的键值数据库。
            使用多台session服务器,做主从,读写分离。
        session服务器一般使用redis数据。redis并发能力大,

httpd只是个代理他不负责用户与php服务之间的session。php需要自己保持会话。 比如用户登录淘宝,下一次访问被httpd调度到另一台php服务上,用户就需要重新登录淘宝。所以php服务器集群需要session服务器来保持用户的会话为全局可以用。 要么httpd基于cooki同一以用户不调度,stick。

session服务器要与php加速器区分开。session是为php追踪用户使用的,加速器是为httpd服务使其访问相同资源可以使用之前缓存下来的opcode。

css,js部署到静态服务器上图片也存放于专用服务器。

平滑实现版本迭代。

FastCGI

FastCGI Process Manager, an alternative PHP FastCGI implementation with some additional features useful for sites of any size, especially busier sites.

php与httpd结合不能多种方式并存,只能满足一个

要么安装 php 要么安装 php-fpm

centos7中 httpd需要的反代模块和php-fpm都有rpm包 centos6中 都没有rpm包,又需要去epel源中去找。

安装方式:

centos7上 yum install httpd php-fpm php-mysql php-mbstring mariadb php-xcache -y

# yum install php-fpm 

主程序:/usr/sbin/php-fpm
Unit File:/usr/lib/systemd/system/php-fpm.service

配置文件:
    ini:配置php解释器工作环境;
        /etc/php.ini, /etc/php.d/*.ini

    conf:配置fpm守护进程的工作模式;怎么与客户端交互的(httpd)
        /etc/php-fpm.conf, /etc/php-fpm.d/*.conf

配置:

/etc/php-fpm.conf

[global]  ##全局配置

daemonize=no  ###是否运行为守护进程,在centos7上为no,centos7上使用systemd管理系统进程,不需要以守护进程方式运行,而是由systemd托管。centos6上的值都为yes

/etc/php-fpm/www.conf

[pool-id]  ###配置连接池
listen = 127.0.0.1:9000
listen.backlog = -1 超出请求最大值的队列长度,-1表示没有上限
listen.allowed_clients = 127.0.0.1
user = apache  ##运行子进程的身份属主
group = apache ##运行子进程的属组
pm = dynamic  ###进程管理器定义是动态还是静态。
    定义
        process管理机制:static, dynamic
        static:服务启动时创建出所有子进程;
        dynamic:根据用户请求量的变化来维护子进程数量;

pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500

pm.status_path = /status  ###php的内建状态页面,于httpd的内建页面重名,要同时使用需要修改。
rlimit_files = 1024  ##用户所能打开的文件数
rlimit_core = 0      ##核心可以占据多少空间,不会被内存管理交换出去
php_value[session.save_handler] = yes
php_value[session.save_path] = /var/lib/php/session

要使用session会话功能需要创建/var/lib/php/session/这个目录并授权给apache用户


回顾:

php:php core + php extensions
    php core:
        httptd modules(php):libphp5.so
            配置文件:/etc/php.ini, /etc/php.d/*.ini 
            restart|reload httpd
        fastcgi(php-fpm):php-fpm daemon 
            守护进程的配置文件:/etc/php-fpm.conf, /etc/php-fpm.d/*.conf
            配置文件:/etc/php.ini, /etc/php.d/*.ini 
            restart|reload php-fpm 

    php extensions:
        php-mysql, php-redis, php-mongodb
        php-mbstring 
        php-xcache
        php-mcrypt
        ...

    fcgi协议协议:
        httpd:proxy_module, proxy_fcgi_module
            ProxyRequests Off
            ProxyPass
            ProxyPassMatch ^(URL-PATTERN)$ fcgi://FCGI-SERVER:PORT/PATH/TO/DIR/$1

fpm:
    pm=static|dynamic
    pm.max_children
    pm.min_spare_servers
    pm.max_spare_servers


fpm配置:

fpm配置虚拟主机反代配置示例1:

<VirtualHost *:80>
ServerName www.magedu.com
DocumentRoot "/vhosts/www"

<Directory "/vhosts/www">
Options None
AllowOverride None
Require all granted
</Directory>

ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/vhosts/www/$1
DirectoryIndex index.php index.html
</VirtualHost>

fpm配置虚拟主机反代配置示例2:

<VirtualHost *:80>
ServerName www.magedu.com
DocumentRoot "/vhosts/www"

<Directory "/vhosts/www">
Options None
AllowOverride None
Require all granted
</Directory>

ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/vhosts/www/$1
ProxyPassMatch ^/(pm-status|ping)$ fcgi://127.0.0.1:9000/$1
DirectoryIndex index.php index.html
</VirtualHost>

http://WEB_SERVER:PORT/pm-status
    pool:                 www    # 连接池名称
    process manager:      dynamic    # 进程管理器类型
    start time:           26/Sep/2016:15:10:26 +0800    # 启动时间
    start since:          7437    # 运行时长
    accepted conn:        6    # 连接池已经处理过的总请求数
    listen queue:         0    # 队列的长度
    max listen queue:     0     #  请求队列的最大长度
    listen queue len:     128     # socket等待队列的最大长度;
    idle processes:       4    # 空闲的进程数;
    active processes:     1    # 活跃的进程数量;
    total processes:      5     # 总进程数;
    max active processes: 1     # 连接池当中过去最大活跃进程度;
    max children reached: 0     # 进程数量达到连接池上限的次数;
    slow requests:        0 # 慢请求的数量;

其它格式的输出:
    /pm-status?json
    /pm-status?xml
    /pm-status?html
    /pm-status?full

full格式的输出:
    pid:                  33095
    state:                Idle    # 当前进程的状态,idle, running, ...
    start time:           26/Sep/2016:15:10:26 +0800    # 进程启动的日期时间 
    start since:          7968  # 运行时长
    requests:             2    # 处理过的请求数量
    request duration:     112     # 请求处理过程的时长
    request method:       GET    # 请求方法
    request URI:          /pm-status?html     # 请求的URL
    content length:       0    # 请求内容的长度,POST方法才有意义
    user:                 -     # 用户
    script:               -     # php脚本;
    last request cpu:     0.00    # 最近一次请求消耗CPU
    last request memory:  262144    # 最近一次请求消耗的内存量

注意:

httpd-2.2默认没有自带fcgi模块;php-5.3.3-默认不支持fpm,需要打补丁方可;

CentOS 6.X:部署;amp –fpm

    # yum install httpd mod_proxy_fcgi php-fpm php-mysql mysqld-server

编译安装amp:

(1) 系统环境:

        CentOS 6:apr, apr-util的版本为1.3.9,不适用于httpd-2.4;
        CentOS 7:apr, apr-util的版本为1.4+,
    (2) 开发环境:
        Development Tools, Server Platform Development
    (3) 各程序版本
        httpd: 2.2, 2.4
        php:5.3.x 5.4.x, 5.6.x
        mysql:5.1, 5.5, 5.6, 5.7, 5.8, 8.0
        mariadb:5.x, 10.x
    (4) httpd+php
        php的编译选项:
            Modules:--with-apxs
                httpd MPM:
                    prefork:
                    worker, event:专用选项--enable-maintainer-zts
            ftm:--enable-fpm

CentOS 7:httpd-2.4, mariadb, php-5.4

安装次序:httpd, mariadb, php

安装MariaDB:

预制的包管理器格式的程序包:
    rpm包:
    os vendor:mariadb-devel 
    MariaDB官方
通用二进制格式的程序包:
源码包编译:项目构建工具为cmake, 而非流行的make;

通用二进制格式包的安装配置步骤:

# useradd -r mysql
# tar xf mariadb-VERSION-linux-x86_64.tar.gz -C /usr/local/
# cd /usr/local/
# ln -sv mariadb-VERSION-linux-x86_64 mysql
# cd mysql
# chown -R root:mysql ./*

# mkdir -pv /mydata/data 
# chown -R mysql.mysql /mydata/data

# scripts/mysql_install_db  --user=mysql  --datadir=/mydata/data --skip_name_resolve

# cp support-files/my-large.cnf  /etc/my.cnf 

    [mysqld]
        .......
    datadir = /mydata/data
    skip_name_resolve = ON
    innodb_file_per_table = ON

# cp support-files/mysql.server  /etc/rc.d/init.d/mysqld
# chkconfig --add mysqld

httpd-2.4:

~]# yum install pcre-devel openssl-devel libevent-devel apr-devel apr-util-devel -y

# ./configure --prefix=/usr/local/apache2 --sysconfdir=/etc/httpd --enable-so --enable-ssl --enable-cgi --enable-rewrite --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork --with-pcre --with-zlib --with-apr=/usr --with-apr-util=/usr
# make -j #
# make install 

# echo 'export PATH=/usr/local/apache2/bin:$PATH' > /etc/profile.d/httpd.sh
# . /etc/profile.d/httpd.sh
# apachectl start

安装php5:

(1) 作为httpd的模块安装:
    # ./configure --prefix=/usr/local/php5 --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-openssl --enable-mbstring --enable-xml --enable-sockets --with-freetype-dir --with-gd --with-libxml-dir=/usr --with-zlib --with-jpeg-dir --with-png-dir --with-mcrypt --with-apxs2=/usr/local/apache2/bin/apxs --with-config-file-path=/etc/php.ini --with-config-file-scan-dir=/etc/php.d/
    # make -j # && make install

注意:如果mpm为线程模型,则需要额外使用--enable-maintainer-zts

(2) 安装为fpm:
    # ./configure --prefix=/usr/local/php5 --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-openssl --enable-mbstring --enable-xml --enable-sockets --with-freetype-dir --with-gd --with-libxml-dir=/usr --with-zlib --with-jpeg-dir --with-png-dir --with-mcrypt --enable-fpm --with-config-file-path=/etc/php.ini --with-config-file-scan-dir=/etc/php.d/
    # make -j # && make install

复制配置文件:
        cp php.ini-production  /etc/php.ini 

编译php为httpd的模块后,整合php至httpd:
    编译httpd.conf,添加:
        DirectoryIndex index.php index.html
        AddType application/x-httpd-php .php


练习1:

(1) 模块化的php编译amp,fpm化的php编译amp;
(2) 两个虚拟主机;
    (a) https, 部署pma;
    (b) 部署discuzX;
练习2:
    脚本实现编译安装过程,要求安装于/usr/local/lamp/目录中;

php-xcache 有图形话的管理工具

xcache-admin使用有rpm包可以使用

需要配置php-xcache的配置文件

/etc/php.d/xcache.ini

[xcache.admin]
xcache.admin.enable_auth = On

; use http://xcache.lighttpd.net/demo/cacher/mkpassword.php to generate your encrypted password
xcache.admin.user = "yang"
xcache.admin.pass = "46f94c8de14fb36680850768ff1b7f2a"  ####必须使用MD5加密的密码,32为的MD5密码

用户名yang
密码123qwe

安装上xcache-admin

此web服务需要使用https连接,所以需要配置ssl服务,不配置可以使用。

需要修改其配置文件为如下,默认的配置文件是为httpd2.2准备的。 没有对目录授权 默认使用本地访问

# Configure XCache Administration
Alias /xcache /usr/share/xcache

<Directory /usr/share/xcache>
   <IfModule mod_authz_core.c>
     # Apache 2.4
     Require local
   </IfModule>
   <IfModule !mod_authz_core.c>
     # Apache 2.2
     Order Allow,Deny
     Allow from All
   </IfModule>
    Options Indexes
    AllowOverride None
    Require all granted
</Directory>

 

原创文章,作者:yyw,如若转载,请注明出处:http://www.178linux.com/56554

(0)
yywyyw
上一篇 2016-11-01
下一篇 2016-11-01

相关推荐

  • grep命令

    alias命令 直接输入 alias 命令会列出当前系统中所有已经定义的命令别名。 例一:列出当前系统中所有已经定义的命令别名。 [root@localhost ~]# alias alias cp=’cp -i’ alias egrep=’egrep –color=auto’ alias fgrep=’fgrep –color=auto’ alias …

    Linux干货 2016-01-09
  • 网卡别名与bonding配置

    我们知道,一般来说,一个硬件地址对应与一个IP地址。但在一些情况下,我们可以通过一些方法打破硬件地址与IP地址的一一对应关系。下面就来说一下网卡别名与bonding配置。 网卡别名就是将多个IP地址绑定到一个网络接口上,其命名方式为IFACE:num,如eth0:1等。需要注意的是,网卡别名仅对虚拟主机有效。创建网卡别名有两种方式: 1、ifconfig命令…

    Linux干货 2016-09-05
  • linux终端的类型与linux发展历史

    一、linux console的类型与说明 说明:        1 由于虚拟终端的实现,人们可以多用户多任务的在一台计算机操作系统上工作             2 在80或90年代的旧电脑上,人们只能用分屏这样的方法来实现多用户,多任务的工作  …

    Linux干货 2013-07-03
  • centos7上实现LAMP,并搭建wordpress

    实验:LAMP的架构,并搭建wordpress              1、准备环境,                      #mkdir src    …

    2017-08-07
  • CIDR,子网掩码以及划分子网超网

    对于中小企业,假如有两千台机器,给他分个B类地址,6万多个,太浪费了,分个C类地址,一个C类地址254个,又不够,又得多申请几个,所以A,B,C类IP地址划分太过僵硬,很不灵活,因此又提出无类域间路(CIDR)由划分IP地址的方法。 无类域间路由(CIDR) 传统划分IP地址的方法都是8位划分的,要不就是前8位网络ID,后24位主机ID;或前16位网络ID,…

    2017-09-16
  • Linux 入门(二)

    又一个周的时间过去了,觉得时间过的好快的呢,大概是因为沉迷于学习吧(害羞脸),在这一周里学习了不少东西呢,下面就来总结一下吧 (1)    cp 复制 如果只是单纯的敲cp复制文件而不加任何选项的时候,如果目的目录文件已经存在,就会直接覆盖,而不会出现任何提示信息,而当在实际操作时,就算不加 –i选项,也会提示要不要覆盖文件 原…

    2017-07-22