Lamp:Linux+apache(httpd)+mysql(mariadb)+php

 LAMP

A:apache

M:mariadb,mysql

P:php,perl,python

LAMMP:memcache

 

请求流程:

Client --> (http协议) --> httpd --> (cgi协议) --> application server(program file) --> (mysql协议) --> mysqld(mariadb)


这里我们一一讨论:

先讲apache(httpd)

一次完整的http请求过程:

(1)建立连接或处理连接:接收请求或拒绝请求

(2)接收请求

(3)处理请求

(4)服务器访问资源

(5)构建响应报文

(6)发送响应报文

(7)记录日志

 

 

http的特性:

模块化:DSO(Dynamic Shared Object) 动态共享对象  core+module,动态接入或移除。

查看模块列表:

查看静态编译的模块:httpd -l

查看静态编译及动态装载的模块:httpd -M

 

MPM:Multipath Processing Modules 多道处理模块

prefork:多进程模型:每个进程响应一个请求;一个主进程(只负责接收发送,处理请求由子进程)生成n个子进程,每个子进程处理一个用户请求,即使没有用户请求,也会预先生成多个空闲进程,随时等待请求到达,最大不超过1024个。(默认)

worker:多线程模型:每个线程响应一个请求,一个主进程生成多个子进程,每个子进程负责生成多个线程,每个线程响应一个请求

但是linux进程和线程效果差不多。

event:事件驱动,一个线程响应n个请求;一个主进程,生成m个子进程,每个进程直接响应n个请求


更改httpd程序MPM:

vim /etc/sysconfig/httpd

HTTPD=...(重启服务生效)

 

Prefork的配置:

<IfModule prefork.c>

...

</IfModule>


功能特性:

(1)支持虚拟主机

(2)CGI:Common GateWay Interface,通用网关接口

(3)反向代理

(4)负载均衡

(5)路径别名

(6)丰富的用户认证机制(basic,digest)

(7)支持第三方模块

 

配置文件:

/etc/httpd/conf/httpd.conf(主配置文件

/etc/httpd/conf.d/*.conf

 

服务脚本:

/etc/rc.d/init.d/httpd

配置文件:/etc/sysconfig/httpd

 

主程序文件:

/usr/sbin/httpd(prefork)

/usr/sbin/httpd.event

/usr/sbin/httpd.worker

 

日志文件目录:

/var/log/httpd

access_log:访问日志

error_log:错误日志

 

站点文档目录:

/var/www/html

 

模块文件路径:

/usr/lib64/httpd/modules

 

配置文件的组成:

grep “Section” /etc/httpd/conf/httpd.conf

        Section 1:Globel Environment

        Section 2:'Main' server configuration

        Section 3:Virtual Hosts

        注意:Section2和Section3不能同时使用。

 

常用配置选项:

(1)修改监听的IP和Port

         a) Listen [IP:]PORT (端口要重启服务)

         省略IP,使用*,即为本机所有地址,监听所有IP。

         Listen可以出现多次。

(2)持久连接

          a) 每个页面请求有长连接和短连接

              一个页面有多个资源,每个资源都需要请求

             Persistent connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其他的请求完成。

             数量限制:100个资源后断开

             时间限制:可配置(秒)

             并发场景:配置好

             副作用:对并发访问量较大的服务器,持久连接功能会使有些请求得不到相应。

             折中:使用较短的持久连接时间,httpd-2.4支持毫秒级别持久时间

         格式:

             KeepAlive on|off

             MaxKeepAliveRequests num

             KeepAliveTimeout num

 

(3)DSO动态共享对象模块文件

           配置指令实现模块加载

                 LoadModule <mod_name> <mod_path>

           模块路径可使用相对地址

                  相对于ServerRoot(/etc/httpd)指向的路径而言  /etc/httpd/modules/

            httpd -M:已装载模块

            配置此文件:vim /etc/httpd/conf/httpd.conf

                    LoadModule

            service httpd reload 重载有效


(4)定义'Main' Server 提供一个站点的文档页面路径

            DocumentRoot

           文档路径映射:

           DocumentRoot指向路径为URL路径的起始位置。

            DocumentRoot  “/var/www/html”

            /var/www/html/test/index.html --> http://Host:Port/test/index.html


(5)站点访问控制

可基于两种类型的路径指明对哪些资源进行访问控制。

a)文件系统路径:

         <Directory “”></Directory>

         <File “”></File>

         <FileMatch “”></FileMatch> 使用正则表达式

b)URL路径:

         <Location “”></Location>

         <LocationMatch “”></LocationMatch>

访问控制机制

基于来源IP地址

基于账号

(6)Directory中实现访问控制

 

(7)定义默认主页面

               DirectoryIndex index.html index.html.var

(8)日志设置

               错误日志:ErrorLog logs/error_log指向/var/log/httpd/error_log

                      /etc/httpd/logs指向/var/log/httpd/

                      日志级别:LogLevel 低-->高:debug,info,notice,warn,error,crit,alert,emerg

               访问日志:CustomLog logs/access_log combined  日志格式,在LogFormat定义,查表。

 LogFormat “%h %l %u %t \”%r\” %>s  %b \ “%{Referer}i\”  \”%{User-Agent}i\” “ combind

%h:客户端IP地址  %l:Remote logname;-表示为空 %u:Remote user,-表示为空

%t:收到请求时的时间  %r:请求报文首行信息  %>s:响应状态码

%b:响应报文的大小,字节,不包括响应报文首部

%{Referer}i:请求报文当中”referer“首部的值及当前资源的访问入口,即从哪个页面中的超链接跳转而来。

%{User-Agent}i:请求报文当中”User-Agent”首部的值,即发出请求用到的应用程序。


(9)路径别名

             Alias /URL/  “/PATH/TO/Somedir/”

           例如:

                   Alias /bbs/  “/bbs/htdocs/”

                   http://www.magedu.com/bbs/index.html  --> /bbs/htdocs/bbs/index.html

                   把URL映射到一个路径

(10)设定默认字符集

              AddDefaultCharset UTF-8

              常用字符集:GBK GB2312 GB18030

(11)基于用户的访问控制  admin页面

              认证质询:www-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户提供账号和密码;

              认证:Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过,则服务器发送响应的资源。

              认证类型:

                     basic:明文

                     Digest:消息摘要md5

              安全域:需要用户认证后方能访问的路径。

              应该通过名称对其进行标识,并用于告知用户认证的原因,用户的账号和密码存储于何处?

              虚拟账号:仅用于访问某服务时用到的认证标识;

              存储媒介:文本文件,SQL数据库,ldap,nis

实现basic认证:

a)定义安全域<Directory “”>

               Options None

               AllowOverride None

               AuthType Basic

               AuthName “STRING”

               AuthUserFile “/PATH/TO/HTTPD_USER_PASSWD_FILE”

               Require user username1 username2 ...

               Require valid-user (全部有效用户)

b)提供账号和密码存储(文本文件)

               使用htpasswd命令进行管理。

               htpasswd [OPTIONS] passwdfile username

选项:

                -c:自动创建passwdfile,仅第一个用户添加时使用

                -m:MD5加密用户密码

                -s:sha1加密用户密码

                -D:删除指定用户

               实现基于组进行认证

                     同上,添加AuthGroupFile “/PATH/TO/HTTPD_GROUP_FILE”

                     把Require user改为Require group group1 group2 ...

                     要提供用户账号文件和组文件

               组文件:每一行定义一个组

                      GRP_NAME:user1 user2 user3 ...

 

(12)虚拟主机

             一个物理服务器服务多个站点

             有三种实现方案:

                     A)基于IP:为每个虚拟主机准备至少一个IP地址

                     B)基于PORT:为每个虚拟主机准备至少一个专用PORT

                     C)基于hostname:为每个虚拟主机准备至少一个专用Hostname

                     可混合使用上述三种方式中任意方式

                      注意:一般虚拟主机莫与中心主机混用,注释DocumentRoot

            每个虚拟主机都有参考配置:

                 <VirtualHost “IP:PORT”>

                               ServerName

                               DocumentRoot “”

                  </VirtualHost>

                  ServerAlias:虚拟主机的别名

                  ErrorLog、CustomLog、<Directory “”>

                  检查语法 service httpd configtest 或者httpd -t

                  示例1:基于IP

                       <VirtualHost 192.168.1.136:80>

                             serverName web1.magedu.com

                             DocumnetRoot  “/vhosts/web1/htdocs”

                       </VirtualHost>

                        ip addr add 192.168.1.136/24 dev eth0(并且添加相应ip地址)


                   示例2:基于PORT

                        <VirtualHost 192.168.1.136:8080>

                                    serverName web2.magedu.com

                                    DocumentRoot “/vhosts/web2/htdocs”

                        </VirtualHost>

                         Listen 8080 =>service httpd restart

                     示例3:基于主机名

                             NameVirtualHost *:80  (在2.2要把*改为192.168.1.136 在2.4则不用)

                             <VirtualHost 192.168.1.136:80>

                                      ServerName web1.magedu.com

                             </VirtualHost>

                             <VirtualHost 192.168.1.136:80>

                                       ServerName web2.magedu.com

                             </VirtualHost>

                              修改hosts文件,并使用curl命令访问

 

(13)内置的status页面

# Allow server status reports generated by mod_status,

# with the URL of http://servername/server-status

# Change the ".example.com" to match your domain to enable.

#

#<Location /server-status>

#    SetHandler server-status

ExtendedStatus On

实现基于账号实现访问控制


(14)Curl命令

 

httpd自带的工具程序

htpasswd:basic认证基于文件实现时,用到的账号密码文件生成工具

apachectl:httpd自带的服务控制脚本,支持start,stop,restart,status

apxs:由httpd-devel包提供的,扩展httpd使用第三方模块的工具

rotatelogs:日志滚动工具(切割日志)

suexec:访问某些有特殊权限配置的资源时,临时切换至指定用户运行。

ab:apache benchmark 压力测试工具

 

http压力测试工具

ab(单进程)

webbench

http_load(多进程)

专用级别:

jmeter

loadrunner

 

ab [OPTIONS] URL

-n:总的请求数

-c:模拟的并发数

-k:以持久连接模式测试,解析报表

ulimit -n#:调整当前用户能同时打开的文件书。一个用户默认同时可以打开1024个文件。

 

Httpd-2.4

新特性:

(1)MPM支持运行DSO机制,以 模块形式按需加载

(2)支持event MPM

(3)支持异步读写

(4)支持每模块及每个目录分别使用各自的日志级别

(5)每请求配置<If>

(6)增强版的表达式分析器

(7)支持毫秒级的keepalive timeout

(8)基于FQDN的虚拟主机不再需要NameVirtualHost指令

(9)支持用户自定义变量

新模块:

(1)mod_proxy_fcgi

(2)mod_ratelimit

(3)mod_remoteip

修改了一些配置机制:

不再支持使用Order,Deny,Allow来做基于IP的访问控制


配置:

(1)切换使用MPM

LoadModule mpm_NAME_module modules/mod_mpm_NAME.so

NAME:prefork、event、worker


(2)修改'Main' server的DocumentRoot

如需要虚拟主机

vim conf.d/vhosts.conf

        <VirtualHost *:80>

                      ServerAdmin

                      DocumentRoot

                      ServerName

                      ServerAlias

                      ErrorLog

                      CustomLog

           </VirtualHost>


(3)基于IP的访问控制法则

允许所有主机访问:Require all granted

拒绝所有主机访问:Require all deny


控制特定IP访问:

Require ip IPADDR:授权指定来源地址的主机访问

Require not ip IPADDR:拒绝指定来源地址的主机访问

IPADDR:IP、Network/mask、Network/Length、Net:192.168


控制特定主机(hostname)访问:

Require host HOSTNAME

Require not host HOSTNAME

HOSTNAME:

                   FQDN:特定主机

                   DOMAIN:指定域内所有主机


(4)虚拟主机

基于IP、Port和FQDN都支持

基于FQDN的不再需要NameVirtualHost指令


(5)ssl

启动模块:

LoadModule ssl_module modules/mod_ssl.so

(6)服务脚本

cd /etc/rc.d/init.d

cp httpd httpd24

vim httpd24

chkconfig --add httpd24

chkconfig --list httpd24

chkconfig httpd24 on

cgi:Common GateWay Interface

httpd -M | grep cgi


CentOS7:

yum install php php-mysql mariadb (CentOS6:mysql)

httpd + php:

php的形式:modules:作为httpd的模块,不需要子进程

cgi:不常有

fastcgi:(fpm)


yum install -y mariadb-server

systemctl start mariadb.service

ss -tnl

systemctl restart httpd.service


程序包

CentOS 7:httpd php php-mysql mariadb-server

注意:php要求httpd使用prefork;MPM如要别的模式,需要别的php包支持。

CentOS 6:httpd php php-mysql mysql-server

 

测试:

php程序执行环境:

test.php

<?php

          phpinfo();

?>

php程序与mysql通信

<?php

           $conn = mysql_connect(‘HOST’,’USERNAME’,’PASSWORD’);

           if($conn)

                    echo “OK”;

           else

                    echo “Failure”;

           mysql_close();

?>

 

关于php

超文本预处理器

扫描--> 分析 --> 编译 --> 执行

Scanning:将php代码转换为语言片段(Tokens)

Parsing:将Tokens转换成简单而有意义的表达式

Comilation:将表达式编译成Opcodes

Execution:顺序执行Opcodes,每次一条,从而实现php脚本的功能。

 

php加速器:XCache

 

http+php:

php modules:

         httpd:prefork:libphp5.so

         httpd:event or worker:libphp5-zts.so

 

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

ini:

[SECTION]

directive = value

php.ini核心配置选项:php.net/manual/zh/ini.core.php

                                   php.net/manual/zh/ini.list.php

modules:仅在web服务器启动时读取一次,而对于cgi和cli版本,每次调用都会读取。

 

关于mariadb:

CentOS 7直接提供

CentOS 6:通过二进制格式安装

1.存在mysql组和用户

           groupadd -r mysql;useradd mysql

2.解压文件

           tar xf mariadb-VERSION -C/usr/local

3.创建软连接

           ln -sv mariadb-Version mysql

4.进入文件

           cd mysql

5.修改文件和目录权限

           chown -R root:mysql ./*

6.安装mysql

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

           cp super-files/mysql.server /ect/rc.d/init.d/mysql

           chkconfig --add mysql

7.准备配置文件

配置文件:类ini格式,为各程序均通过单个配置文件提供配置项;

配置文件查找次序:

         /etc/my.cnf-->/ect/mysql/my.cnf-->--default-extra-file=/PATH/TO/CONFILE -->~/.my.cnf

       

        mkdir /etc/mysql/

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

        添加:datadir = /mydata/data

                   innodb_file_per_table = on

                   skip_name_resolve = on

8.安全初始化

/usr/local/mysql/bin/mysql_secure_installation

        删除匿名用户

        设置密码

        禁止root远程登陆

        重载授权表

 

客户端与服务器交互:

服务器监听的两种socket地址:

ip socket:监听在tcp/3306端口。支持远程通信

Unix socket:监听在sock文件上(/tmp/mysql.sock,/var/lib/mysql/mysql.sock),仅支持本地通信。

命令行交互客户端程序:mysql

mysql -uUSERNAME -hHOST -pPASSWORD

注意:mysql用户账号由两部分组成:'USERNAME'@'HOST';其中HOST用于限制用户可以通过哪些主机远程连接mysql服务

       支持使用的通配符:

            %:匹配任意长度的任意字符

            192.168.%.%

            _:匹配任意单个字符

        SQL语句:

               DDL:Data Defination Language

                     create drop alter

               DML:Data Manipulation Language

                      insert delete update select

               DCL:Data Control Language

                       GANT,REVOKE


LAMP组合的编译安装

htpd + php:

php的形式:

         modules模式:把PHP编译成httpd的DSO对象作为httpd的模块,不需要子进程

prefork:libphp5

event,worker:libphp5-zts

cgi:不常有

fpm:(fastcgi):php 作为独立的服务

httpd对fastcgi协议的支持:

httpd-2.2:需要额外安装fcgi模块

httpd-2.4:自带fcgi模块

 

CentOS 6安装次序:

httpd-->mariaDB-->PHP

yum -y install pcre-devel

tar xf apr-VERSION

cd apr-VERSION

./configure --prefix=/usr/local/apr

make && make install

 

tar xf apr-util-VERSION

cd apr-util-VERSION

./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr

make && make install


httpd:

tar xf httpd-VERSION

cd httpd-VERSION

./configure  \

--prefix=/usr/local/apache \

--sysconfdir=/etc/httpd24 \

--enable-so \

--enable-ssl \

--enable-cgi \

--enable-rewrite \

--with-zlib \

--with-pcre \

--with-apr=/usr/local/apr \

--with-apr-util=/usr/local/apr-util \

--enable-modules=most \

--enable-mpms-shared=all \

--with-mpm=event

make && make install


cd /etc/rc.d/init.d/

cp httpd httpd24

vim httpd24

          apachectl=/usr/local/apache/bin/apachectl

          httpd=${HTTPD-/usr/local/apache/bin/httpd}

          pidfile=${PIDFILE-/var/run/httpd/httpd24.pid}

          lockfile=${LOCKFILE-/var/lock/subsys/httpd24}

chkconfig --add httpd24

chkconfig --list httpd24

vim /etc/profile.d/httpd.sh

          export PATH=/usr/local/apache/bin:$PATH

hash -r

. /etc/profile.d/httpd.sh

service httpd24 start

cd /etc/httpd24

vim httpd.conf


Mariadb:

CentOS 7直接提供

CentOS 6:通过二进制格式安装

9.创建mysql组和用户

      groupadd -r mysql;useradd mysql

10.解压文件

      tar xf mariadb-VERSION -C/usr/local

11.创建软连接

      ln -sv mariadb-Version mysql

12.进入文件

     cd mysql

13.修改文件和目录权限

     chown -R mysql:mysql ./*

14.安装mysql

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

     cp super-files/mysql.server /etc/rc.d/init.d/mysqld

     chkconfig --add mysql

15.准备配置文件

配置文件:类ini格式,为各程序均通过单个配置文件提供配置项;

配置文件查找次序:

     /etc/my.cnf-->/etc/mysql/my.cnf-->--default-extra-file=/PATH/TO/CONFILE --> ~/.my.cnf

    mkdir /etc/mysql/

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

    添加:datadir = /mydata/data

              innodb_file_per_table = on

              skip_name_resolve = on

16.安全初始化

          /usr/local/mysql/bin/mysql_secure_installation

         删除匿名用户

         设置密码

         禁止root远程登陆

         重载授权表


PHP安装

tar xf php-VERSION

cd php-VERSION

设置epel

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm

或者:

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak

wget -O /etc/yum.repos.d/CentOS-Base.repohttp://mirrors.aliyum.com/repo/CentOS-6.repo

yum clean all

yum makecache


module模式:

yum -y install bzip2-devel libmcrypt-devel libxml2-devel

./configure --prefix=/usr/local/php \

--with-mysql=/usr/local/mysql \

--with-openssl \

--with-mysqli=/usr/local/mysql/bin/mysql_config \

--enable-sockets \

--enable-mbstring \

--with-freetype-dir \

--with-jpeg-dir \

--with-png-dir \

--with-zlib \

--with-libxml-dir=/usr \

--enable-xml \

--with-apxs2=/usr/local/apache/bin/apxs \

--with-mcrypt \

--with-config-file-path=/etc \

--with-config-file-scan-dir=/etc/php.d \

--with-bz2 --enable-maintainer-zts

make && make install

httpd支持php

vim /etc/http24/httpd.conf

1.添加如下两行:

    AddType application/x-httpd-php .php

    AddType application/x-httpd-php-source .phps

2.定位至DirectoryIndex index.html修改为DirectoryIndex index.php index.html

3.然后重启httpd

4.为php提供配置文件 cd  /php-5.4.26

      cp php.ini-production /etc/php.ini

5.修改vim /etc/rc.d/init.d/httpd24

      pidfile=${PIDFILE-/usr/local/apache/logs/httpd.pid}

      service httpd24 restart

      http -M | grep php5

测试:

      cd /usr/local/apache/htdocs

      mv index.html index.php

<?php

        phpinfo();

?>


6.安装xcache,为php加速

tar xf xchache-VERSION

cd xchache-VERSION

/usr/local/php/bin/phpize

./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config

make && make install

cp xcache.ini /etc/php.d/

vim /etc/php.d/xchache.ini

修改extension=/usr/local.../xchche.so(在make install 最后出现的目录)

 

fpm模式:

./configure --prefix=/usr/local/php5 \

--with-mysql=/usr/local/mysql \

--with-openssl \

--with-mysqli=/usr/local/mysql/bin/mysql_config \

--enable-mbstring \

--with-mfreetype-dir \

--with-jpge-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

make && make install

mkdir /etc/php5


cp php.ini-production /etc/php5/php.ini

cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm

chmod +x /etc/rc.d/init.d/php-fpm

chkconfig --add php-fpm

chkconfig php-fpm on
cp /usr/local/php5/etc/php-fpm.conf.default /usr/local/php5/etc/php-fpm.conf

vim php-fpm.conf

pm.max_children = 50

pm.start_servers = 5

pm.min_spare_servers = 2

pm.max_spare_servers = 8

pid = /usr/local/php5/var/run/php-fpm.pid

service php-fpm start

ps aux | grep fpm


1.修改httpd.conf配置文件

vim /etc/httpd24/httpd.conf

       AddType application/x-httpd-php .php

       AddType application/x-httpd-php-source .phps

修改DirectoryIndex index.html改为DirectoryIndex index.php index.html

2.添加模块

      LoadModule proxy_module modules/mod_proxy.so

      LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so


3.配置虚拟主机支持使用fcgi

注释掉公共的访问www目录

#DocumentRoot "/usr/local/apache/htdocs"

打开虚拟主机配置文件(去注释)

Include /etc/httpd/extra/httpd-vhosts.conf

打开虚拟主机配置文件

Include /etc/httpd/extra/httpd-vhosts.conf

在相应的虚拟主机中添加类似如下两行

 

<VirtualHost *:80>

ProxyRequests Off :关闭正向代理

ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/PATH/TO/DOCUMENT_ROOT/$1

(/PATH/TO/DOCUMENT_ROOT/改为你php文件存放路径)

</VirtualHost >

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值