官方网站:apache.org
http://www.taobao.com/index.html为例
1.http请求的内容
请求行
请求方法:get(获取):请求方法,其他常见方法:post(提交表单、单选、端选...)、put(提交评价)、delete(删除服务器上的某个内容(商家))
index.html:请求的文件
http/1.1版:请求的协议
请求头
host:请求的主机(源IP)
accept:是否接受请求
accept-language:请求内容的语言表示,zh_CN
accept-charset:请求内容的字符编码
accept-encoding:是否启用压缩
referer:http://www.tmall.com/apple/s01.php(请求的地址(服务器端))
User-agent:浏览器的类型和版本
Connection:keepalive(保持活的连接)
date:访问的日期和时间
请求的实际文件内容
welcome to access my website!!
2.http响应的内容
1.根据客户端请求的信息进行响应
2.状态码
100-199:服务器成功接收客户端的请求,有时需要客户机继续发送请求信息,完成整个请求的过程(如输入用户名和密码)
200-299:表示成功处理客户端请求
300-399:找其它服务器(代理服务器找不到,向服务器发送请求),302:找其它的服务器,需要在响应头中有location信息;304,307:找缓存
400-499:错误信息;403:页面存在,但没有权限访问;404:页面不存在
500:服务器内部错误
代理服务器(前端代理和后端代理)
IIS APACHE NGNIX TOMCAT+APACHE WEBSPHERE
安装LAMP环境(Linux+apache+MySQL+PHP)
apache:重量级(功能比较全)
ngnix:轻量级(功能较少,但在某方面反应速度更快,占用资源比较少,在集群方面,性能比较高)
要求将httpd安装到/usr/local/httpd目录下
安装编译环境 yum install gcc gcc-c++
1.安装apr(提供优化,提供接口,增强并发)
# ./configure --prefix=/usr/local/apr --enable-profile --enable-threads
# make(当CPU是多核的话,可以使用make -j n,可以提高编译效率) && make install
2.安装apr-iconv(提供转码功能)
# ./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr/
# make && make install
3.安装apr-util(提供优化)
# ./configure --prefix=/usr/local/apr-util --with-iconv=/usr/local/apr-iconv --with-apr=/usr/local/apr
# make && make install
4.安装pcre(提供正则表达式扩展功能)
# ./configure --prefix=/usr/local/pcre --enable-utf8 --enable-jit
# make && make install
5.安装httpd(apache是以模块运行的,安装层次:模块(modules)--认证(auth)--缓存(cache)--代理(proxy))
# ./configure --prefix=/usr/local/httpd --enable-cache --enable-cache-disk --enable-cache-socache --enable-so --enable-modules=all --enable-mods-shared=all --enable-ssl --enable-echo --enable-data --enable-include --enable-sed --enable-proxy --enable-proxy-connect --enable-proxy-http --enable-proxy-fcgi --enable-proxy-scgi --enable-proxy-ajp --enable-proxy-balancer --enable-session --enable-session-cookie --enable-info --enable-rewrite --enable-deflate --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --with-pcre=/usr/local/pcre --enable-mpms-shared=all --enable-userdir
另外一种方法(把apr和apr-util放到httpd目录下面的srclib目录下面,不要带版本号,vim httpd/INSTALL,查找srclib,可以看到相应的解释)
mv apr-1.5.2 httpd/srclib/apr
mv apr-util-x httpd/srclib/apr-util
安装httpd(apache是以模块)
# ./configure --prefix=/usr/local/httpd --enable-cache --enable-cache-disk --enable-cache-socache --enable-so --enable-modules=all --enable-mods-shared=all --enable-ssl --enable-echo --enable-data --enable-include --enable-sed --enable-proxy --enable-proxy-connect --enable-proxy-http --enable-proxy-fcgi --enable-proxy-scgi --enable-proxy-ajp --enable-proxy-balancer --enable-session --enable-session-cookie --enable-info --enable-rewrite --enable-deflate --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --with-pcre=/usr/local/pcre --enable-mpms-shared=all --enable-userdir
三种模块都有它自身的最大并发量,如果要修改的话,需要在编译之前就要对源文件进行操作(/httpd/server/mpm/event),修改#define MAX_SERVER_LIMIT 20000
修改APACHE的版本,可以提高安全性
模块的工作方式
prefork 进程 稳定性较高,消耗内存较大,一个进程崩溃,不会影响其他进程
worker 进程和线程 稳定性较低,一个线程崩溃,可能会影响其他线程,消耗内存较小(长连接和短连接)
event 进程和线程 最好,可以把固定的socket转发到其他的服务器,并不固定
cd /usr/local/httpd
bin:命令
build:编译工具
cgi-bin:公共网关协议脚本的命令
conf:配置文件
error:报错文档
htdocs:web服务器的根目录
icons:图标文件
include:头文件
lib:库文件
logs:日志文件
man:web文档
manual:manual手册页
modules:模块文件
安装第三方模块
解压缩模块文件
进入解压缩文件夹
cd apache2
有configure文件,则可以直接进行编译安装
没有configure文件,则执行/usr/local/httpd/bin/apxs -i -a -c(编译) mod_rpaf-2.0.c(模块的c文件),添加该模块
主配置文件(/usr/local/httpd/conf/httpd.conf)
从配置文件:在主配置文件里面添加:Include 路径(/目录是安装目录)
ServerRoot(安装目录并不是Web根目录) "/usr/local/httpd"
Listen(监听) 80
LoadMoudule(加载模块) unixd_module(模块名) module/unixd_module.so(模块路径)
<IfMoudule unixd_module> --- 局部配置
User demon --- 使用demon用户运行
Group demon
</IfModule>
ServerAdmin(管理员邮箱) admin@sjjy.com
ServerName www.sjjy.com:80 --- 和DNS没有关系,不设置,默认为localhost
<Directory /> --- Web站点的根的配置,也可对其他目录
AllowOverride
</Directory>
DocumentRoot "/usr/local/httpd/htdocs" --- Web站点的根
<IfModule dir_module>
DirectoryIndex index.html --- web站点的默认文档
</IfModule>
<Files ".ht*"> --- 对文件进行设置
</Files>
ErrorLog "logs/error_log" --- 错误日志的保存路径
LogLevel warn --- 记录高于等于warn级别的日志
LogFormat " %h %l %u ... "--- 定义访问日志的格式
CustomLog "logs/access_log" common(定义的几种日志格式文件的一种) --- 记录访问日志的路径
AddType 程序名 .Z(后缀名) --- 当遇到这种文件的后缀,由那个应用程序控制
Include extra/http-default.conf
编辑基本配置文件
vim extra/http-default.conf
Timeout 60 --- 超时时间,客户端连接到服务器后,在超时时间内没有发送信息,则超时
KeepAlive On --- 长连接(静态站点常用) Off为短连接(动态站点常用)
MaxKeepAliveRequests 100 --- 最大请求长连接次数(长连接失效次数)
KeepAliveTimeout 5 --- 长连接失效时间5s
UseCanonicalName Off --- 不需要对客户端进行反向解析
vim extra/httpd-mpm.conf
<IfModule mpm_prefork_module> --- prefork模块
StartServbers 5 --- 除了一个父进程,再启动5个空闲子进程(提高访问速度)
MinSpareServers 5 --- 最小的空闲进程数量
MaxSpareServers 10 --- 最大的空闲进程数量
MaxRequestWorkers 250 --- 最大并发客户数(取决于内存,设置的最大值)
MaxConnectionsPerChild 0 --- 每个子进程最大响应客户端请求数,无限制
</IfModule>
<IfModule mpm_event_module> --- 不支持HTTPS协议
StartServers --- 开启的进程数
MinSpareThreads --- 最小的空闲线程数量
MaxSpareThreads --- 最大的空闲线程数量
ThreadsPerChild --- 每个进程产生的线程数
MaxRequestWorkers --- 最大并发连接数
MaxConnectionsPerChild --- 每个子进程最大响应客户端数
</IfModule>
event模块在2.4版才正式启用
vim extra/httpd-info.conf --- httpd的基本信息
<Location /server-status>
启动httpd服务
cd /usr/local/httpd/bin
./apachectl -t --- 主配置文件,语法检查
./apachectl start --- 启动httpd服务
或者
cp apachectl /etc/init.d/httpd
vim /etc/init.d/httpd
在前面添加 # chkconfig: -(启动级别,0-6) 85(启动顺序) 15(关闭顺序)
chkconfig --add httpd
service httpd start
错误集:
apache AH01630: client denied by server configuration错误解决方法
ServerName zlj.com
DocumentRoot "/zlj/web"
DirectoryIndex index.html index.php
<Directory "/zlj/web">
Options -Indexes +FollowSymlinks
AllowOverride All
Allow all
</Directory>
练习:
写一个安装脚本,要求运行完后apache服务器就已经启动,并能在其他服务器上使用(只需少量改变),要求功能如下:
1.挂载光盘并检查是否已经挂载,能给出基本信息
2.安装几个必须的软件包(gcc,gcc-c++,lynx,openssl)等,如果已经安装了rpm包软件则要卸载
3.配置、编译和安装apache,屏幕上不要出现多余信息,安装成功则提示安装成功,失败则提示安装失败
4.将基本内容配置好(sed完成)
5.准备好并使用启动脚本
6.httpd服务启动,能启动则提示启动成功,失败则提示启动失败,并显示最后10行错误日志
apache的Alias(适用于目录),ScriptAlias,options FollowSymLinks(允许使用符号链接,适用于文件),options Indexs配置
作用:访问不在web目录下的文件和列出目录下的内容,但是不能下载
Alias /meizu "/usr/local/httpd/meizu"
ScriptAlias /cgi-bin/ "/usr/local/httpd/cgi-bin/"
<Directory "/usr/local/httpd/meizu">
Require all denied
Require ip 172.16.0.0/16
</Directory>
<Directory />
options FollowSymLinks
</ Directory>
定义一个文件的符号链接到WEB站点的根目录(/usr/local/httpd/htdocs),并且在index.html文件里面增加连接
options Indexs(建议禁用,当没找到默认页面,会把WEB站点的根目录下面的所有文件列出来)
定义错误提示
cd /usr/local/httpd/error
vim my404.html
里面添加错误提示
vim ../conf/httpd.conf
找到并修改 ErrorDocument 404 /error/my404.html
apache的段配置
<Diretory "/web">*</Directory> --- 访问指定目录的访问规则
<Files ".ht*">*</Files> --- 设置特定文件的访问规则
<Location /server-status>*</Location> --- 设置URL包含特殊信息的访问规则
<IfModule dir_module>*</Ifmodule> --- 判定模块是否加载,如果加载则使用指定的配置项
访问控制、认证和授权
访问控制(需要加载mod_authz_user.so mod_authz_host.so)
Require all granted --- 允许所有用户访问
Require all denied --- 拒绝所有用户访问
示例:
apache 2.4版
<Directory "/mmeizu">
<RequieAll> --- 先允许,后拒绝
Require all granted
Require not ip 192.168.0.7
</RequireAll>
</Directory>
apache 2.2版
<Directory "/meizu">
Order deny,allw --- 先拒绝,后允许
Deny from 192.168.0.7
Allow from all
</Directory>
或者
<Directory "/meizu"> --- 先拒绝,后允许,不需要<Require>
Require all denied
Allow from 192.168.0.7
</Directory>
认证和授权
<Directory "/usr/local/httpd/meizu">
Require all denied
Require ip 10.0.10.178
AuthType Basic digest(更安全)
AuthName "Restricted Files" (自定义)
AuthBasicProvider file 文件认证|数据库认证
AuthUserFile "/usr/local/httpd/passwd/password" 认证的文件路径(包含用户名和密码)
Require valid-user 认证限制(只有存在与认证文件的用户才能通过认证)
satisfy any(满足其中一个) | all(满足全部)
</Directory>
生成认证文件
/usr/local/httpd/bin/htpasswd -c /usr/local/httpd/passwd/password user01 ---第一次的话要加-c选项
-Index(表示禁用Index功能)
组认证(先生成文件认证) --- 文件自己生成,有格式限制
AuthGroupFile "/usr/local/httpd/passwd/groups"
GroupName:
实验结果
Require all granted
# Require all denied
# Require ip 10.0.10.178
AuthType Basic
AuthName "Restricted Files"
AuthBasicProvider file
AuthUserFile "/usr/local/httpd/passwd/password"
Require valid-user
satisfy all
当先允许全部,在要求认证的时候是全部生效,但是认证文件不会生效,当先拒绝全部,在要求认证的时候是全部生效,认证文件会生效
当先决绝全部,允许部分ip的时候,在要求认证的时候是全部生效,认证文件不会生效,但是不在允许的ip范围内的,认证文件会生效
Server version: Apache/2.4.20 (Unix)
当几个Web站点的时候,不可能就要配置相应数量的服务器,可以使用虚拟主机来实现,不是虚拟化
虚拟主机的作用:在同一个系统里面,可以搭建多个Web站点
虚拟主机的类型:
基于域名的虚拟主机(大多数)
基于端口的虚拟主机
基于ip的虚拟主机(服务器上必须配有多个ip地址,一个ip对应一个Web站点)
配置基于域名的虚拟主机
配置域名服务器,将相关的域名解析为同一个ip
mkdir /web
vim httpd.conf
开启vhost的子配置文件
vim httpd-vhosts.conf
<Directory /web>
Require all granted
</Directory>
<VirtualHost *:80>
DocumentRoot "/web/blog" --- 必须有
ServerName www.blog.com --- 必须有
</VirtualHost>
配置了虚拟主机后,所有的web站点都必须配置为虚拟主机
基于域名的虚拟主机不能直接使用ip地址访问,使用ip地址只能访问到第一个虚拟主机
安装php
首先安装gd库,给php模块提供一些图形化的功能
./configure --prefix=/usr/local/gd
make && make install
安装php
./configure --prefix=/usr/local/php --with-apxs2=/usr/local/httpd/bin/apxs --with-config-file-path=/usr/local/php/etc --with-gd=/usr/local/gd --enable-gd-native-ttf --enable-gd-jis-conv --enable-mbstring --enable-bcmath --enable-sockets --enable-zip --with-xpm-dir=/usr/lib64
make && make install
注意:不用加上gd的安装路径,否则会报错:png.h文件找不到
If configure fails try --with-vpx-dir=<DIR>
If configure fails try --with-jpeg-dir=<DIR>
configure: error: png.h not found.
[root@www php-5.5.10]# yum install libpng*
make时可能报如下错误:
/usr/local/src/php-5.5.6/ext/gd/gd.c:57:22: error: X11/xpm.h: No such file or directory
make: *** [ext/gd/gd.lo] Error 1
问题说明:这是提示gd库不支持xpm
解决方法:
安装libxpm
yum install libXpm-devel.x86_64
rpm -ql libXpm :查询出libXpm的安装位置,发现在/usr/lib64/ 下
重新编译php,./configure中增加 --with-xpm-dir=/usr/lib64/
make && make install 成功!
验证是否安装成功
查看httpd.conf文件是否加载libphp5.so
配置主配置文件
cp php.ini-production(生产文件,位于php的解压包里面) /usr/loca/php/etc/php.ini
编辑httpd.conf文件,配置php文件的应用处理程序
AddType Application/x-httpd-php .php
AddType Application/x-httpd-php-source .php
编辑一个php测试文件,存放于站点根目录下
vim index.php
<?php
phpinfo();
?>
[Sat Sep 03 16:09:08.592931 2016] [:crit] [pid 15966:tid 140126261696256] Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You need to recompile PHP.
AH00013: Pre-configuration failed
解决方法:
编辑httpd.conf配置文件
将event模式改为prefork模式 或者
重编 PHP 的时候加了 --with-openssl 把openssl 模块加进去了的缘故,去掉这个模块就又可以正常与 worker MPM 搭配了。
错误导致原因:以多线程的 worker 模式运行了 Apache,并且使用了非线程安全的 php 和其 apache 模块。
使用 prefork 模式运行 Apache 或换用线程安全版本的 php 及对应的 apache 模块
注意:线上环境,建议编译为线程安全
压力测试 --- 压力测试时间 联动(数据库等等)--- 做最坏的打算
一个进程占多少内存(ps aux | grep httpd)
最大进程数(free -m找free)
启动的进程数为多少比较合适?考虑内存、突发并发量
http_load常用选项 --- 参数是文件(里面存放具体的网站页面),不建议用
-p 并发的进程数量
-r 每秒的访问频率
-f 访问的总数
-s 持续访问的时间
webbench的常用选项
-c 并发数量
-t 持续访问时间
ab -n(测试次数) 1000 -c(并发数) 1000 http://10.0.10.178/index.html --- 只能测试某个页面
报错
socket: Too many open files (24)
解决办法
ulimit -n 10000
或者
vim /etc/security/limits.conf
webbench -t 180 -c 100 http://10.0.10.178/index.html
总结:
1.安装前要注意的问题
隐藏apache的版本号--- 在源码包里面的include文件夹下的ap_release.conf文件,找到主版本号之类的
考虑是否修改最大并发连接数--- 编辑event.c文件和其他工作模式的.c文件,找到DEFAULT_SEVER_LIMIT之类的
相关的依赖软件包是否安装
需要考虑使用那些模块
考虑使用那种mpm进行工作(prefork,worker,event)
2.基本配置
3.apache的相关段配置
4.访问不在WEB根目录的内容(alias,scriptalias,options FollowSymlinks)
5.访问控制、认证和授权
6.虚拟主机的配置
7.lamp架构搭建
架设安全的ssl站点 --- 对传输的数据进行加密,对应于OSI的表示层,对应于TCP/IP的应用层
1.安装openssl加密软件包
yum install openssl openssl-devel
2.创建私钥用于签署证书---生成一个章
mkdir /usr/local/httpd/conf/private
cd /usr/local/httpd/conf/private
openssl genrsa -out server.key 1024
3.使用私钥server.key文件生成证书签署请求的csr文件---生成需要盖章的文件
openssl req -new -key server.key -out server.csr
4.生成证书文件crt---已经盖好章的文件
openssl x509 -days 3650 -req -in server.csr -signkey server.key -out server.crt
5.编辑httpd-ssl.conf,设置加密虚拟站点
vim /usr/local/httpd/conf/extra/httpd-ssl.conf
DocumentRoot "/website/ssl/web"
ServerName www.example.com:443
ServerAdmin admin@example.com
ErrorLog
TransferLog
SSLEngine on
SSLCertificateFile "/usr/local/httpd/conf/private/server.crt"
SSLCertificateKeyFile "/usr/local/httpd/conf/private/server.key"
6.编辑httpd.conf文件
Include conf/extra/httpd-ssl.conf
LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
添加mod_ssl
进入源码包
cd /modules/ssl
/usr/local/httpd/bin/apxs -a -i -c mod_ssl.c
如果添加之后还会提示报错,则使用如下命令添加模块
# /usr/local/httpd/bin/apxs -a -i -c -L/usr/lib/openssl/engines/lib -c *.c -lcrypto -lssl -ldl
本文出自 “天晴了要下雨” 博客,请务必保留此出处http://8776055.blog.51cto.com/8766055/1846073
原文地址:http://8776055.blog.51cto.com/8766055/1846073