开发者社区> 技术小甜> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

httpd之apache服务器配置

简介:
+关注继续查看

centos6.9默认httpd软件为2.2版本,centos7默认为httpd-2.4,二者之间配置基本相同,但是还有部分差别。那么阿拉就先从http2.2的相关配置说起。


httpd-2.2相关文件

配置文件

    /etc/httpd/conf/httpd.conf

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

检查配置语法:

    httpd -t

    service httpd configtest

服务脚本:/etc/rc.d/init.d/httpd

脚本配置文件:/etc/sysconfig/httpd

脚本控制和启动:

    chkconfig httpd on/off (开机启动)

    service {start|stop|restart|status|configtest|reload} httpd

站点网页文档根目录:/var/www/html

模块文件路径:

    /etc/httpd/modules

    /usr/lib64/httpd/modules(两者为硬链接)

主程序文件:

    /usr/sbin/httpd

    /usr/sbin/httpd.worker

    /usr/sbin/httpd.event

主进程文件:/etc/httpd/run/httpd.pid (httpd服务没启动时,此文件是不存在的)

日志文件目录:/var/log/httpd/

        access_log:访问日志

        error_log:错误日志

帮助文档包:http-manual

httpd配置文件的组成:

    [root@CentOS6 ~]# grep Section /etc/httpd/conf/httpd.conf

    ### Section 1: Global Environment

    ### Section 2: 'Main' server configuration

    ### Section 3: Virtual Hosts

    配置格式:directive value(value根据文件系统不同有时会区分大小写)


httpd2.2功能配置

1.显示服务器版本信息

vim /etc/httpd/conf/httpd.conf,定位到ServerTokens开头的行

ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full

ServerTokens Prod[uctOnly] :Server: Apache

ServerTokens Major: Server: Apache/2

ServerTokens Minor: Server: Apache/2.0

ServerTokens Min[imal]: Server: Apache/2.0.41

ServerTokens OS: Server: Apache/2.0.41 (Unix)

ServerTokens Full (or not specified): Server: Apache/2.0.41

(Unix) PHP/4.2.2 MyMod/1.2

This setting applies to the entire server and cannot be enabled or disabled on a virtualhost-by-virtualhost basis.

After version 2.0.44, this directive also controls the information presented by the ServerSignature directive.

建议使用:ServerTokens Prod

默认地,服务器HTTP响应头会包含apache和php版本号。这会让黑客通过知道详细的版本号而发起已知该版本的漏洞攻击。

为了阻止这个,需要在httpd.conf设置ServerTokens为Prod,这会在响应头中显示“Server:Apache”而不包含任何的版本信息。

2.修改监听的IP和Port

vim /etc/httpd/conf/httpd.conf,定位到Listen开头的行

Listen [IP:]PORT

(1) 省略IP表示为本机所有IP

(2) Listen指令至少一个,可重复出现多次

Listen 80

Listen 8080

示例:

Listen 192.168.1.100:8080

Lsten 80

3.持久连接

Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认关闭持久连接

断开条件:数量限制:100

时间限制:以秒为单位, httpd-2.4 支持毫秒级

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

折衷:使用较短的持久连接时间

设置: KeepAlive On|Off

KeepAliveTimeout 15

MaxKeepAliveRequests 100

测试: telnet WEB_SERVER_IP PORT

GET /URL HTTP/1.1

Host: WEB_SERVER_IP

4.MPM( Multi-Processing Module)多路处理模块

prefork, worker, event(试验阶段)

httpd-2.2不支持同时编译多个模块,所以只能编译时选定一个;rpm安装的包提供三个二进制程序文件,分别用于实现对不同MPM机制的支持。默认为/usr/sbin/httpd, 即prefork模式

确认方法:ps aux | grep httpd

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

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

动态模块加载:不需重启即生效

动态模块路径:/usr/lib64/httpd/modules/

更换使用的httpd程序:

vim /etc/sysconfig/httpd

HTTPD=/usr/sbin/httpd.worker 重启服务生效

查看进程和线程 pstree -p|grep httpd 

Httpd 2.4 与之不同

以动态模块方式提供

配置文件:/etc/httpd/conf.modules.d/00-mpm.conf

httpd –M |grep mpm

重启服务生效

pstree -p|grep httpd 查看进程和线程

prefork的默认配置:

<IfModule prefork.c>

StartServers 8

MinSpareServers 5

MaxSpareServers 20Ser

verLimit 256 最多进程数,最大20000

MaxClients 256 最大并发

MaxRequestsPerChild 4000 子进程最多能处理的请求数量。在处理MaxRequestsPerChild 个请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放(为0时永远不释放)

</IfModule>

worker的默认配置:

<IfModule worker.c>

StartServers 4

MaxClients 300

MinSpareThreads 25

MaxSpareThreads 75

ThreadsPerChild 25

MaxRequestsPerChild 0 无限制

</IfModule>

5.DSO: Dynamic Shared Object

加载动态模块配置

/etc/httpd/conf/httpd.conf

配置指定实现模块加载格式:

LoadModule <mod_name> <mod_path>

模块文件路径可使用相对路径:

相对于ServerRoot(默认/etc/httpd)

示例:

LoadModule auth_basic_module

modules/mod_auth_basic.so

6.定义'Main' server的文档页面路径

DocumentRoot “/path”

文档路径映射:

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

示例:

DocumentRoot "/app/data“

http://HOST:PORT/test/index.html

--> /app/data/test/index.html

注意:SELinux和iptables的状态

7.定义站点主页面

DirectoryIndex index.html index.html.var

8.站点访问控制常见机制

可基于两种机制指明对哪些资源进行何种访问控制

访问控制机制有两种:客户端来源地址,用户账号

文件系统路径:

<Directory “/path">

...

</Directory>

<File “/path/file”>

...

</File>

<FileMatch "PATTERN">

...

</FileMatch>

URL路径:

<Location "">

...

</Location>

<LocationMatch "">

...

</LocationMatch>

示例:

<FilesMatch "\.(gif|jpe?g|png)$">

<Files “?at.*”> 通配符

<Location /status>

<LocationMatch "/(extra|special)/data">

<Files "?at.*">

9.<Directory>中“基于源地址”实现访问控制

(1) Options:后跟1个或多个以空白字符分隔的选项列表

在选项前的+,- 表示增加或删除指定选项

常见选项:

Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户

FollowSymLinks:允许访问符号链接文件所指向的源文件

None:全部禁用

All: 全部允许

示例:  <Directory /web/docs>

Options Indexes FollowSymLinks

</Directory>

<Directory /web/docs/spec>

Options FollowSymLinks

</Directory>

<Directory /web/docs>

Options Indexes FollowSymLinks

</Directory>

<Directory /web/docs/spec>

Options +Includes

-Indexes

</Directory>

(2) AllowOverride

与访问控制相关的哪些指令可以放在指定目录下的.htaccess(由AccessFileName指定)文件中,覆盖之前的配置指令

只对<directory>语句有效

AllowOverride All: 所有指令都有效

AllowOverride None:.htaccess 文件无效

AllowOverride AuthConfig Indexes 除了AuthConfig

和Indexes的其它指令都无法覆盖

(3) order和allow、deny

放在directory, .htaccess中

order:定义生效次序;写在后面的表示默认法则

Order allow,deny

Order deny,allow

Allow from, Deny from

来源地址:

IP

网络: 172.16

172.16.0.0

172.16.0.0/16

172.16.0.0/255.255.0.0

示例:

<files "*.txt">

order deny,allow

deny from 172.16. 100.100

allow from 172.16

</files>

<files "*.txt">

order allow,deny

deny from 172.16.100.100

allow from 172.16

</files>

10.日志设定

日志类型:访问日志 错误日志

错误日志:

ErrorLog logs/error_log

LogLevel warn

loglevel 可选值:

debug, info, notice, warn,error

crit, alert, emerg

定义日志格式:LogFormat format strings

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

%t 服务器收到请求时的时间

%r First line of request,即表示请求报文的首行;记录了此次请求的“方法”,“URL”以及协议版本

%>s 响应状态码

%b 响应报文的大小,单位是字节;不包括响应报文http首部

%{Referer}i 请求报文中首部“referer”的值;即从哪个页面中的超链接跳转至当前页面的

%{User-Agent}i 请求报文中首部“User-Agent”的值;即发出请求的应用程序


设定默认字符集

AddDefaultCharset UTF-8

中文字符集:GBK, GB2312, GB18030


定义路径别名

vim conf.d/test.conf

alias /bbs /app/bbsdir (后面是源)


基于用户的访问控制

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

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

认证方式两种:

basic:明文

digest:消息摘要认证,兼容性差

安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因

用户的账号和密码

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

存储:文本文件,SQL数据库,ldap目录存储,nis等

basic认证配置示例:

(1) 定义安全域、

<Directory “/path">

Options None

AllowOverride None

AuthType Basic

AuthName "String“

AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE"

Require user username1 username2 ...

</Directory>

允许账号文件中的所有用户登录访问:

Require valid-user

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

使用专用命令完成此类文件的创建及用户管理

htpasswd [options] /PATH/HTTPD_PASSWD_FILE username

-c:自动创建文件,仅应该在文件不存在时使用

-m:md5格式加密,默认方式

-s: sha格式加密

-D:删除指定用户


实验:实现基于basic验证的目录访问


方法一

vim conf.d/test.conf

<directory /var/www/html/secret>

authname "Secret DIR"

authtype basic

authuserfile /etc/httpd/conf.d/.httpusers

require user http1 http2

</directory>

htpasswd 来自httpd-tools

htpasswd -c /etc/httpd/conf.d/.httpusers http1

htpasswd -s /etc/httpd/conf.d/.httpusers http2

htpasswd -m /etc/httpd/conf.d/.httpusers http3

service httpd reload

允许账号文件中的所有用户登录访问:Require valid-user

方法2

vim secret/.htaccess

authname "Secret DIR"

authtype basic

authuserfile /etc/httpd/conf.d/.httpusers

require valid-user

vim conf.d/test.conf

<directory /var/www/html/secret>

allowoverride authconfig

</directory>

service httpd reload

组帐户访问控制

vim .htgroups

httpgroup1:http1 http2

httpgroup2:http1 http3

vim .htaccess 

authgroupfile /etc/httpd/conf.d/.htgroups

require group httpgroup2


抓包tcpdump -i eth0 -nn -X port 80 > /root/http.log 


远程客户端和用户验证的控制

Satisfy ALL|Any(httpd.conf)

ALL 客户机IP和用户验证都需要通过才可以

Any客户机IP和用户验证,有一个满足即可

示例:

Require valid-user

Order allow,deny

Allow from 192.168.1

Satisfy Any


status页面

查看模块有无打开httpd -M|grep statusvim 

httpd.conf

LoadModule status_module modules/mod_status.so

<Location /server-status>

SetHandler server-status

Order allow,deny

Allow from 192.168.37.0/24

</Location>

ExtendedStatus On 显示扩展信息

访问http://192.168.37.106/server-status


cdn

curl -u http1:centos192.168.37.107/secret

-A IE20 模拟浏览器类型

-e/--refer 

curl "-H user-agent: EI" -e http://www.baidu.com 192.168.37.106

构造请求报文的首部

curl -IL 跳转重定向


SetOutputFilter DEFLATE

DeflatCompress


实验:实现虚拟主机

一个服务器创建多个站点

cd /app

mkdir sit{1,2,3}

echo /app/site1/index.html > site1/index.html

echo /app/site2/index.html > site2/index.html

cho /app/site3/index.html > site3/index.html

ip add a 192.168.37.10/24 dev eth0

ip add a 192.168.37.20/24 dev eth0

ip add a 192.168.37.30/24 dev eth0


基于IP

还需要在DNS上配置名字解析,以便对应的域名转化为相应的IP

详情见:DNS章节

本机测试可以在/etc/hosts文件下添加

192.168.37.10 www.a.com

192.168.37.20 www.b.com

192.168.37.30 www.c.com

vim /etc/httpd/conf.d/test.conf 

(参考主配置文件最下面)

<virtualhost 192.168.37.10:80>

documentroot /app/sist1

</virtualhost>

<virtualhost 192.168.37.20:80>

documentroot /app/sist2

</virtualhost>

<virtualhost 192.168.37.30:80>

documentroot /app/sist3

</virtualhost>

server httpd reload

访问http://www.a.com

http://www.b.com

http://www.c.com可看到不同的显示内容

基于PORT

vim /etc/httpd/conf.d/test.conf 

(参考主配置文件最下面)

listen 8001

listen 8002

listen 8003

<virtualhost *:8001>

documentroot /app/site1

</virtualhost>

<virtualhost *:8002>

documentroot /app/site2

</virtualhost>

<virtualhost *:8003>

documentroot /app/site3

</virtualhost>

server httpd reload

访问http://www.a.com

http://www.a.com:8001/

http://www.a.com:8002/

ttp://www.a.com:8003/为不同页面

于FQDN

实验:实现基于FQDN的虚拟主机

原理:http请求报文首部中带有要访问的域名

Vim /etc/hosts

添加 192.168.37.106 www.a.com www.b.com www.c.com

(实际环境中需要在DNS上配置)

vim /etc/httpd/conf.d/test.conf 

(参考主配置文件最下面)

按Ip访问的话最上面的为默认站点

NameVirtualHost *:80

<virtualhost *:80>

ocumentroot /app/site1

servername  www.a.com

errorlog  logs/a.com.errlog

customlog logs/a.com.accesslog combined

</virtualhost>

<virtualhost *:80>

documentroot /app/site2

servername  www.b.come

rrorlog  logs/b.com.errlog

customlog logs/b.com.accesslog combined

</virtualhost>


<virtualhost *:80>

documentroot /app/site3

servername  www.c.com

errorlog  logs/c.com.errlog

customlog logs/c.com.accesslog combined

</virtualhost>


实验:启用压缩

服务器启用压缩httpd -M |grep mod_deflate

SetOutputFilter DEFLATE

DeflateCompressionLevel 9

AddOutputFilterByType DEFLATE text/plain

AddOutputFilterByType DEFLATE text/html


实验:实现HTTPS


1 yum install mod_ssl

2 vim /etc/httpd/conf.d/ssl.conf

SSLCertificateFile /etc/httpd/conf.d/ssl/httpd.crt

SSLCertificateKeyFile /etc/httpd/conf.d/ssl/httpd.key

SSLCACertificateFile /etc/httpd/conf.d/ssl/cacert.pem


httpd2.4配置


httpd -t 检查语法

更改mpm模块:vim /etc/httpd/conf.modules.d/00-mpm.conf

测试性能:/var/www/html/m.txt(建议此文件大一些)

ab -c 100 -n 2000 http://192.168.37.107/m.txt

更改主目录

vim /ect/httpd/conf/httpd.conf

DocumentRoot "/app/website"

systemctl reload httpd

curl -I httpd://192.168.37.107

vim /ect/httpd/conf/httpd.conf

DocumentRoot "/app/website"

<directory /app/websit>

require all granted/denied 允许/拒绝所有主机

</directory>



<directory /app/websit>

require ip 192.168.37.106只允许特定Ip访问

</directory>


<directory /app/websit>

<REQUIREALL>

require all granted

require not ip 192.168.37.106只拒特定IP

</requireall>

</directory>

基于虚拟主机FQDN

cd /etc/httpd/conf.d/

客户端

vim /etc/hosts

192.168.37.107 www.a.com www.b.com www.c.com



cd /app

mkdir website{1,2,3}

cd /etc/httpd/conf.d/

vim vhosts.conf

<virtualhost *:80>

documentroot /app/website1

servername www.a.com

<directory /app/website1>

require all granted

<directory>

</virtualhost>

<virtualhost *:80>

documentroot /app/website2

servername www.b.com

</virtualhost>

<directory /app/website2>

require all granted

<directory>

<virtualhost *:80>

documentroot /app/website3

ervername www.c.com

</virtualhost>

<directory /app/website3>

require all granted

<directory>

systemctl restart httpd

创建证书,https

yum install mod_ssl

ystemctl restart httpd

cd /etc/pki/tls/certs/

make httpd.pem单个文件

head -n 28 httpd.pem > /etc/httpd/conf.d/httpd.key

vim /etc/httpd/conf.d/httpd.crt

vim /etc/httpd/conf.d/ssl.conf

SSLCert.. /etc/httpd/conf.d/httpd.crt

SSLCertifi..key /etc/httpd/conf.d/httpd.key



make httpd.crt(生成俩文件)

vim /etc/httpd/conf.d/ssl.conf

SSLCert..  /etc/pki/tls/certs/httpd.crt


查看sendfile

grep sendfile /etc/httpd/conf/httpd.conf -i


启动反向代理

107前端 调度器 反向调理服务器LVS VS virtual server

106后端LVS Real Server

107:vim test.conf

ProxyPass "/" "http://192.168.37.106/"

ProxyPassReverse "/" "http://192.168.37.106/"

systemctl restart httpd

客户端:访问107即可得到106页面

105:bbs服务器

107:vim test.conf

ProxyPass "/images" "http://192.168.37.106:8000/images/"

ProxyPassReverse "/images" "http://192.168.37.106:8000/images/"

ProxyPass "/bbs" "http://192.168.37.106/bbs"

ProxyPassReverse "/bbs" "http://192.168.37.106/bbs/"

106:下/images/下放图片。

105:下放响应内容。















本文转自阿拉杜美美51CTO博客,原文链接: http://blog.51cto.com/amelie/1974862如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Apache服务器配置与使用工作笔记
uname -m -oecho "/usr/local/apache/lib" >> /etc/ld.so.confhwclock -w #将时间写入BIOSconfig.
1135 0
《Apache Flink 案例集(2022版)》电子版地址
希望通过本手册,可以让大家了解到大量来自不同领域的公司在数据集成、数据分析、人工智能、云原生以及企业数字化转型等应用场景中使用 Apache Flink 解决实际生产问题的成功案例,其中既包含传统和新兴的互联网公司,也包含通信、证券、银行等传统企业。
0 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
《基于Apache Hudi的CDC数据入湖》
立即下载
Apache Flink 案例集(2022版)
立即下载
贺小令|Apache Flink 1.16 简介
立即下载