Apche 服务器
Apache 编译安装
http://httpd.apache.org/download.cgi \\ 下载三个包
apr-1.7.0.tar.gz
apr-util-1.6.1.tar.gz
httpd-2.4.41.tar.gz
# yum install zlib-devel expat-devel openssl-devel pcre-devel gcc gcc++ \\ expat-devel开发库
# groupadd apache
# useradd -g apache apache -s /sbin/nologin
# tar zxf apr-1.7.0.tar.gz
# cd apr-1.7.0
# ./configure --prefix=/usr/local/apr
# make && make install
# tar zxf apr-util-1.6.1.tar.gz
# cd apr-util-1.6.1
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr \\ 需要依赖apr包
# make && make install
# tar zxf httpd-2.4.41.tar.gz
# cd httpd-2.4.41
# ./configure --prefix=/usr/local/apache --sysconf=/etc/httpd --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=prefork
# make && make install
# /usr/local/apache/bin/apachectl -t \\ 检测语法
# ./apachectl -V \\ 查看版本等信息 可以查看到当前使用MPM 对于编译安装修改MPM模式只在编译的时候修改
# ./apachectl -M \\ 查看所有的模块
# ./apachectl -l \\ 查看所
# vim /etc/httpd/httpd.conf \\ 编译安装的主配置文件 位置
ServerName localhost:80 \\ 添加此行 localhost为主机名 否则会有警告httpd: Could not reliably determine the
# ./apachectl start \\ 以下 省略了目录 ↑ server's fully qualified domain name
# ss -tnl \\ 80端口被监控
# ./apachectl stop
# vim /etc/init.d/httpd \\ 创建启动脚本
#!/bin/bash
# chkconfig: 12345 80 90
function start_http()
{
/usr/local/apache/bin/apachectl start
}
function stop_http()
{
/usr/local/apache/bin/apachectl stop
}
case "$1" in
start)
start_http
;;
stop)
stop_http
;;
restart)
stop_http
start_http
;;
*)
echo "Usage : start | stop | restart"
;;
esac
# chmod +x /etc/init.d/httpd
# chkconfig --add httpd
# chkconfig httpd on
# systemctl restart httpd
# ss -tnl
# cat /usr/local/apache/build/config.nice \\ 查看编译安装时候的参数
实例配置
❶ 站点基本配置 使用中心主机 创建站点
# vim /etc/httpd/httpd.conf \\ 主配置文件 编译安装的目录
DocumentRoot "/data/www/www.teo1.com" \\ 站点目录 中心主机只有一个站点使用 多个站点注释掉 使用虚拟机
<Directory "/data/www/www.teo1.com"> \\ 对/data/www/www.teo1.com/目录的一个权限的设置 指设置web目录的属性
Options Indexes FollowSymLinks \\ Options使用哪些特性 Indexes FollowSymLinks等 见注释1
AllowOverride None \\ 表示禁止用户对目录配置文件(.htaccess进行修改)重载 普通站点不建议开启 All 为允许
Require all granted \\ 允许所有访问 如果要拒绝 详见注解1
</Directory>
<IfModule dir_module>
DirectoryIndex index.html \\ 默认首页文件名为 index.html
</IfModule>
❷ 做下载站 \\ 上一条基础上
# mkdir /data/download
# touch /data/download/{a,b}.txt \\ 测试使用 访问 http://192.168.10.14/download
# vim /etc/httpd/httpd.conf
<Directory "/data/download"> \\ 给权限
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
<IfModule alias_module> \\ 对所有的虚拟主机都会生效
Alias /download "/data/download/" \\ 别名 添加一条配置 也可以写在外面 如DocumentRoot下一行也行 注意后面的"/""
</IfModule> \\ ↑ /download/为相对路径 相对于DocumentRoot. /data/download/为绝对路径
❸ 虚拟主机
① 虚拟主机 https 基础配置
# vim /etc/httpd/httpd.conf
#DocumentRoot "/usr/local/apache/htdocs" \\ 注释 掉中心主机
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so \\ 开启此项 配置证书使用
LoadModule ssl_module modules/mod_ssl.so \\ 开启此项 配置证书使用
LoadModule rewrite_module modules/mod_rewrite.so \\ 开启 跳转模块
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so \\ 此模块开启负载均衡 但开启报错 所以实验五未做
<VirtualHost *:80> \\ 拒绝ip访问和拒绝未绑定的网址访问 此为默认虚拟机 要放到第一个
<Location /> \\ 拒绝所有ip访问 及 拒绝未绑定的网址访问
Require all denied \\ 默认拒绝
</Location>
<Location /server-status> \\ 开启status页面 如不需要 可删除此段代码
SetHandler server-status
Require ip 192.168.10.1
</Location>
</VirtualHost>
<VirtualHost *:443> \\ 默认https虚拟机 匹配不到网址的会配置到此 返回错误页面
SSLEngine on \\ 开启 ssl
SSLCertificateFile "/usr/local/apache/ssl/www.teo1.com.crt" \\ 随便一个 证书即可
SSLCertificateKeyFile "/usr/local/apache/ssl/www.teo1.com.key"
</VirtualHost> \\ 此虚拟机 要放到第一个
#ExtendedStatus On \\ 开启状态页面的所有信息 但是好像没有什么用 可以删除
Listen 443
SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
SSLHonorCipherOrder on
SSLProtocol all -SSLv3
SSLProxyProtocol all -SSLv3
SSLPassPhraseDialog builtin
SSLSessionCache "shmcb:/usr/local/apache/logs/ssl_scache(512000)"
SSLSessionCacheTimeout 300
Include /etc/httpd/sites/*.conf \\ 载入虚拟机配置文件 以上代码 在最后一行加入
② 此虚拟主机实现 https 不强制跳转
# mkdir /etc/httpd/sites \\ 创建的 虚拟机 配置文件夹
# vim /etc/httpd/sites/www.teo1.com \\ 第一个虚拟主机配置文件
<VirtualHost *:80> \\ 监听地址
#ServerAdmin www.teo1.com@gmail.com \\ 设置管理员的邮箱 可删除
DocumentRoot "/data/www/www.teo1.com" \\ 网址的根目录
ServerName www.teo1.com \\ 配置域名
ServerAlias teo1.com ce.teo1.com \\ 设置别名 同ServerName一样功能 多个使用空格隔开
ErrorLog "logs/www.teo1.com-error_log" \\ 错误日志
CustomLog "logs/www.teo1.com-access_log" common \\ 访问日志
<Directory "/data/www/www.teo1.com">
Options FollowSymLinks
AllowOverride None
Require all granted
</Directory> \\ 此为不强制跳转到https
</VirtualHost>
<VirtualHost *:443> \\ https
DocumentRoot "/data/www/www.teo1.com/"
ServerName www.teo1.com:443
ServerAlias teo1.com ce.teo1.com \\ 在此 不能加 :443
ErrorLog "/usr/local/apache/logs/www.teo1.com_error_log"
TransferLog "/usr/local/apache/logs/www.teo1.com_access_log"
SSLEngine on
SSLCertificateFile "/usr/local/apache/ssl/www.teo1.com.crt"
SSLCertificateKeyFile "/usr/local/apache/ssl/www.teo1.com.key"
BrowserMatch "MSIE [2-5]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog "/usr/local/apache/logs/ssl_request_log" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
③ 此虚拟主机实现 强制跳转https
# vim /etc/httpd/sites/www.teo2.com
<VirtualHost *:80> \\ 只实现80端口的跳转
ServerName www.teo2.com
ServerAlias teo2.com ce.teo2.com \\ 定义多个域名
RewriteEngine On \\ 开启跳转
RewriteRule ^(.*)$ https://%{SERVER_NAME}$1 [R=301,L] \\ 强制跳转到https
#RewriteRule ^(.*)$ https://www.teo2.com$1 [R=301,L] \\ 强制跳转到https 或者使用此语句
</VirtualHost>
<VirtualHost *:443> \\
DocumentRoot "/data/www/www.teo2.com/"
ServerName www.teo2.com:443
ServerAlias teo2.com ce.teo2.com \\ 不加:443
ErrorLog "/usr/local/apache/logs/www.teo2.com_error_log"
TransferLog "/usr/local/apache/logs/www.teo12.com_access_log"
SSLEngine on
SSLCertificateFile "/usr/local/apache/ssl/www.teo2.com.crt"
SSLCertificateKeyFile "/usr/local/apache/ssl/www.teo2.com.key"
BrowserMatch "MSIE [2-5]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog "/usr/local/apache/logs/ssl_request_log" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
④ 此虚拟主机实现 80端口301重定向 443端口未重定向
# vim /etc/httpd/sites/www.teo3.com
<VirtualHost *:80> \\ 实现301重定向
ServerName www.teo3.com
RewriteEngine On
RewriteRule ^(.*)$ https://www.syk.my$1 [R=301,L]
</VirtualHost>
<VirtualHost *:443>
ServerName www.teo3.com:443
ErrorLog "/usr/local/apache/logs/www.teo3.com_error_log"
TransferLog "/usr/local/apache/logs/www.teo3.com_access_log"
SSLEngine on
SSLCertificateFile "/usr/local/apache/ssl/www.teo1.com.crt"
SSLCertificateKeyFile "/usr/local/apache/ssl/www.teo1.com.key"
RewriteEngine On
RewriteRule ^(.*)$ https://www.syk.my$1 [R=301,L]
</VirtualHost>
⑤ 此虚拟主机实现 反向代理
# vim /etc/httpd/sites/www.teo4.com
<VirtualHost *:80>
ServerName www.teo4.com \\ 虚拟主机名字
ProxyVia On \\ 加首部 说明由此主机反向代理过去的 可以不添加为Off
ProxyRequests Off \\ 同时支持正想代理 使用反向 必须要显示关闭正向代理
ProxyPreserveHost On \\ 基于主机名的虚拟主机 把主机名会带到后端
<Proxy *> \\ 代理模块 允许哪些用户使用
Require all granted \\ 允许所有人访问
</proxy>
#ProxyPass /status ! \\ 可以使status页面不代理到后端 由本机httpd响应 也可以去掉
ProxyPass / http://47.91.219.64/ \\ 反向代理 /根的所有请求 到 此代理为基于http协议
</VirtualHost>
⑥ 此虚拟主机实现 反向代理+负载均衡 主要代码 由于启用模块报错 此实验未做 负载均衡可以使用Nginx
# vim /etc/httpd/sites/www.teo4.com
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED \\ session绑定需加
<proxy balancer://syk.my>
BalancerMember http://192.168.10.10:80 loadfactor=10
BalancerMember http://192.168.10.13:80 loadfactor=10
ProxySet stickysession=ROUTEID \\ 基于session绑定需要加
</proxy>
<VirtualHost *:80>
ServerName www.teo4.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</proxy>
ProxyPass / balancer://syk.my/
ProxyPassReverse / balancer://syk.my/
<Location />
Require all granted
</location>
</virtualHost>
注:
❶ 访问控制
Options 使用哪些特性
Indexes 索引 访问该目录时 如找不到DirectoryIndex的主页文件 则返回该目录下的文件列表给用户 做下载站使用
FollowSymLinks 允许跟踪符号 链接文件 是否允许链接文件 追踪到源目录进行访问 表示允许使用符号链接 默认为禁用
SymLinksifOwnerMatch 源文件和符号链接的属主匹配的时候 允许
MultiViews 允许多视图 内容协商机制 一般都不开 有风险
AllowOverride None
Require all granted 允许所有访问
Require all denied 拒绝所有访问
Require host google.com 只允许来自特定域名主机的访问请求 其他请求将被拒绝
Require ip 192.120 192.168.100 192.168.1.1 只允许来自特定IP或IP段的访问请求 其他请求将被拒绝
<RequireAll> 可以在<Directory> 下嵌套
Require all granted 允许所有访问请求 但拒绝来自特定IP或IP段的访问请求(阻止恶意IP或恶意爬虫网段的访问)
Require not ip 192.168.1.1
Require not ip 192.120 192.168.1234500
</RequireAll>
例 ①:允许所有访问请求,但拒绝某些User-Agent的访问请求(通过User-Agent屏蔽垃圾网络爬虫)
使用mod_setenvif通过正则表达式匹配来访请求的User-Agent,并设置内部环境变量BADBOT,最后拒绝BADBOT的访问请求。
<Directory xxx/www/yoursite>
SetEnvIfNoCase User-Agent ".*(FeedDemon|JikeSpider|AskTbFXTV|CrawlDaddy|Feedly|Swiftbot|ZmEu|oBot).*" BADBOT
SetEnvIfNoCase User-Agent "brandwatch" BADBOT
SetEnvIfNoCase User-Agent "rogerbot" BADBOT
<RequireAll>
Require all granted
Require not env BADBOT
Require not ip 192.168.100.1
</RequireAll>
</Directory>
其它require访问控制指令用法如下:
Require all granted #允许所有
Require all denied #拒绝所有
Require env env-var [env-var] ... #允许匹配环境变量中任意一个
Require method http-method [http-method] ... #允许特定的HTTP方法(GET/POST/HEAD/OPTIONS)
Require expr expression #允许,表达式为true
Require user userid [ userid ] ... #允许特定用户
Require group group-name [group-name] ... #允许特定用户组
Require valid-user # #允许,有效用户
Require ip 192.100 192.168.100 192.168.100.5 #允许特定IP或IP段,多个IP或IP段间使用空格分隔
<Directory> \\ 对目录进行访问控制
<RequireAll> \\ 嵌套在<Directory>下有Require访问控制语句
<Files> \\ 对任何目录匹配文件的形式做访问控制 可嵌套在<Directory>下对目录下的文件单独做访问控制
配置文件详解 \\ 仅仅 用于说明参数详解
ServerRoot "/usr/local/apache" \\ 主程序目录
Listen 80 \\ 监听端口
<Directory /> \\ 对于根目录访问控制
AllowOverride none \\ 表示禁止用户对目录配置文件(.htaccess进行修改)重载 普通站点不建议开启 All 为允许
Require all denied \\ 拒绝所有访问
</Directory>
DocumentRoot "/data/www/www.teo1.com" \\ 站点目录 中心主机只有一个站点使用 多个站点注释掉 使用虚拟机
<Directory "/data/www/www.teo1.com"> \\ 对/data/www/www.teo1.com/目录的一个权限的设置 指设置web目录的属性
Options Indexes FollowSymLinks \\ 以下几条具体参见上 注解1
AllowOverride None
Require all granted
<RequireAll> 可以在<Directory> 下嵌套
Require all granted 允许所有访问请求 但拒绝来自特定IP或IP段的访问请求(阻止恶意IP或恶意爬虫网段的访问)
Require not ip 192.168.1.1
Require not ip 192.120 192.168.100
</RequireAll>
</Directory>
<IfModule dir_module> \\ IfModule为模块 dir_module为模块名称
DirectoryIndex index.html \\ 默认首页文件名为 index.html
</IfModule> \\ 配置段中的指令仅当模块名称为真的时候才进行处理 如果为假 所有其间的指令都将被忽略
<Files ".ht*"> \\ 会拒绝对任何目录下 以 .ht 类型开头的文件
Require all denied
</Files> \\ <Files> 可以嵌套在<Directory>下对指定目录进行访问控制
<Files "*.html"> \\ 会拒绝对任何目录下 以 .html类型结尾的文件
Require all denied
</Files>
ErrorLog "logs/error_log" \\ 错误日志存放的位置 相对路径 相对ServerRoot主程序目录
LogLevel warn \\ 日志的级别 从低到高 debug < info < notice < warn < error < crit < alert < emerg
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined \\ 定义日志格式 并用combined表示
LogFormat "%h %l %u %t \"%r\" %>s %b" common \\ 定义日志的格式 并用common代号表示
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access_log" common \\ 访问日志配置路径 (生产环境我们用combined格式代替common格式)
</IfModule>
%h 客户端IP地址
%l 远程登录的用户名 大多数为空 用 - 表示 不重要
%u 用户认证时的用户名
%t 服务器收到请求时的 时间
%r 请求报文的首行信息
%>s 响应状态码 如403 301
%b 响应报文的大小 单位是字节 不包括响应报文首部
%{Referer}i 请求报文当中"referer"首部的值 referer: 当前资源的访问入口 即从哪个页面中的超链接跳转而来
%{User-Agent}i 请求报文当中"User-Agent"首部的值: 即发出请求用到的应用程序 通常是浏览器 压力测试工具AB 爬虫也是一种Agent
<IfModule alias_module>
Alias /download/ "/data/download/" \\ 别名 必须以/结尾 /download/为相对路径 相对于DocumentRoot 后一个路径为绝对路径
ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/" \\ 对CGI模块儿的别名 与Alias相似 ↑ 可做下载站使用
</IfModule>
<IfModule cgid_module>
</IfModule>
<IfModule headers_module>
RequestHeader unset Proxy early \\ httpoxy漏洞检测与处理 可以使用mod_headers来修复这个漏洞 阻止请求头中"Proxy:"字段
</IfModule>
<IfModule mime_module>
TypesConfig /etc/httpd/mime.types \\ 用于设置保存有不同MIME类型数据的文件名
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
</IfModule>
<IfModule proxy_html_module>
Include /etc/httpd/extra/proxy-html.conf \\
</IfModule>
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>