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 >