httpd用来实现http协议的,可用来搭建web服务器的应用程序。下面就针对搭建web服务器的各种配置进行一一描述。
使用的操作系统为centos7.2
修改监听的ip端口
Listen [ip:]port
注意: 1>. Listen 默认监听在本机上的所有ip地址之上
2>. 可定义多个接听端口。
编辑地方:
Listen 127.0.0.1:80
测试结果: 192.168.203.157为服务器另外一个ip地址
[root@centos 7 html]# curl http://192.168.203.157 curl: (7) Failed connect to 192.168.203.157:80; Connection refused [root@centos 7 html]# curl http://127.0.0.1 magedu.com
编辑地方:
Listen 80 Listen 8080
测试结果:
[root@centos 7 html]# curl http://192.168.203.157 magedu.com [root@centos 7 html]# curl http://192.168.203.157:8080 magedu.com
设置是否持久连接:
判断是否为持久连接:
1>. 首先telnet命令使用验证服务器当前支持的连接状态:
[root@centos6 ~]# telnet 192.168.203.157 80 Trying 192.168.203.157... Connected to 192.168.203.157. Escape character is ‘^]‘. GET /index.htmlhttp/1.1 Host: 192.168.203.157 HTTP/1.1 200 OK Date: Thu, 29 Sep 2016 12:57:50 GMT Server: Apache/2.4.6 (CentOS) Last-Modified: Thu, 29 Sep 2016 12:36:35 GMT ETag: "b-53da4ba7495b0" Accept-Ranges: bytes Content-Length: 11 Content-Type: text/html; charset=UTF-8 magedu.com Connection closed by foreign host.
客户端接收到数据后,等待一会时间连接关闭,说明当前服务器支持的是长连接,只是有时间限制。
修改配置文件:
第一种情况:
]# vim /etc/httpd/conf.d/keepalive.conf KeepAlive off
第二种情况:
]# vim /etc/httpd/conf.d/keepalive.conf KeepAlive on
第三种情况(第二种情况的扩展):
]# vim keepalive.conf KeepAlive on KeepAliveTimeout 20 // 请求时间超过20秒,则断开连接,默认秒为单位 MaxKeepAliveRequests 10 // 请求资源数量超过10个的话,则断开链接
DSO(动态的装载和卸载模块文件)
配置文件:/etc/httpd/conf.modules.d/
模块文件都被写入到/etc/httpd/conf.modules.d/*.conf文件中
httpd2.4版本管理模块的的配置文件都放在/etc/httpd/conf.modules.d/*.conf文件,而httpd2.2配置文件则放到/etc/httpd/modules/*.so文件
比如:
vim /etc/httpd/conf.modules.d/00-lua.conf LoadModule lua_module modules/mod_lua.so
httpd默认是加载lua这个模块的。
[root@centos 7 conf.modules.d]# httpd -M | grep lua lua_module (shared)
将/etc/httpd/conf.modules.d/00-lua.conf中这一条目注释后,再去查看。
vim /etc/httpd/conf.modules.d/00-lua.conf #LoadModule lua_module modules/mod_lua.so
重新加载httpd程序。
systemctl reload httpd httpd -M | grep lua
httpd并没有加载mod_lua这一模块。
日志文件配置
日志文件有两种类型:错误日志error_log、访问日志access_log
error_log 错误日志文件被定义在/etc/httpd/conf/httpd.conf文件中,且日志的级别为warn
access_log 文件的特别有用,在生产坏境下,可以分析到访问源的ip地址、从哪里跳转来等.
access_log非常有用,所以在实际生产坏境下,经常要自己特定日志的格式.
官方站点解析:http://httpd.apache.org/docs/2.4/mod/mod_log_config.html#logformat
access_log日志中各参数表示的意思:
%h:访问源ip地址
%l:.....
%u:.....
%t: time 访问的时间
\” \为转移字符,表示”
%r: First line of request.
%>s: 记录最后一次的状态码
%s: 第一次状态码
%{VARNAME}i:......
%{Referer}i: 从哪里跳转来。
使用本地官方站点文件
1>. 安装httpd-manual安装包。
2>. 重载服务。
通过http://ip/manual 来实现对官方文档的访问
DocumentRoot的配置
在httpd2.4版本,指定新的DocumentRoot后,必须再去指定相应目录的参数选项才可以。
DocumentRoot "/website/html" <Directory "/website/html"> AllowOverride None # Allow open access: Require all granted </Directory>
在httpd2.2版本,指定新的DocumentRoot后,不需要指定目录的参数选项。
目录中常用选项总结:
(1) Options:用于定义资源的展示方式; 后跟以空白字符分隔的“选项”列表;
子选项:
Indexes (Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews)
None
All
注意:
1>.Indexes当系统没有给定相应的首页文件的话,会将DocumentRoot指定的目录中文件以列表的形式展示出来。
2>.Indexes有一定的安全的漏洞,在生产坏境下建议使用None功能将此功能关闭
(2) AllowOverride:httpd允许在网页文档的各目录下使用隐藏文件.htaccess来各自的访问控制;此指令定义哪此指令可以在.htaccess中定义
AllowOverride的各个选项:
FileInfo AuthConfig Limit
None
All
注意: Options也有安全漏洞,建议使用None选项将此功能关闭
(3) Require:
允许所有客户端访问:Require all granted
拒绝所有客户端访问:Require all denied
另外一种表示的方法:
<RequireAll>
Require ip 10.1.0.0/16
Require all denied
</RequireAll>
控制特定的客户端访问:
Require ip IP|NETWORK
Require not ip IP|NETWORK
Require host HOSTNAME
Require not host HOSTNAME
HOSTNAME的表示方法:FQDN.或则是domain.tld.
定义站点主页面:
<IfModule dir_module> DirectoryIndex default.html </IfModule>
路径别名
编辑配置文件/etc/httpd/conf/httpd.conf
Alias /myweb/ /website/myweb/ <Directory "/website/myweb/"> AllowOverride None Require all granted </Directory>
测试:
虚拟主机:
虚拟主机的实现可以基于ip、端口、主机名称实现虚拟主机。
第一种: 基于ip地址实现虚拟主机.
步骤: 给网卡添加一个别名地址
#ip a add 192.168.203.200 dev eno33554984 #ip a inet 192.168.203.157/24 brd 192.168.203.255 scope global eno33554984 valid_lft forever preferred_lft forever inet 192.168.203.200/32 scope global eno33554984 valid_lft forever preferred_lft forever
修改配置文件: vhost_ip.conf
<VirtualHost 192.168.203.157:80> DocumentRoot "/vhost/www1/html" ServerName www1.magedu.com <Directory "/vhost/www1/html"> Options None AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.203.200:80> DocumentRoot "/vhost/www2/html" ServerName www2.magedu.com <Directory "/vhost/www2/html"> Options None AllowOverride None Require all granted </Directory> </VirtualHost>
测试结果:
第二种情况:基于端口实现虚拟主机:
修改配置文件:
<VirtualHost 192.168.203.157:80> DocumentRoot "/vhost/www1/html" ServerName www1.magedu.com <Directory "/vhost/www1/html"> Options None AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.203.157:8080> DocumentRoot "/vhost/www3/html" ServerName www1.magedu.com <Directory "/vhost/www3/html"> Options None AllowOverride None Require all granted </Directory> </VirtualHost>
测试结果:
第三种情况: 基于ServerName实现虚拟主机(这个是最常用的)
配置文件的修改:
<VirtualHost *:80> DocumentRoot "/vhost/www1/html" ServerName www1.magedu.com <Directory "/vhost/www1/html"> Options None AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost *:80> DocumentRoot "/vhost/www2/html" ServerName www2.magedu.com <Directory "/vhost/www2/html"> Options None AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost *:80> DocumentRoot "/vhost/www3/html" ServerName www3.magedu.com <Directory "/vhost/www3/html"> Options None AllowOverride None
测试结果:
status页面 (查看服务器的状态页面信息)
[root@centos 7 conf.d]# vim status.conf
<Location /status>
SetHandler server-status
Requireall granted
</Location>
测试页面:
MPM: prework worker event ...
httpd主要的工作模式prework.
因为Linux系统下进程和线程的轻量级差不多。所以worker模式效果并不是很好
event还不是很稳定,所以生产线上使用prework工作模式。
如何修改httpd的工作模式.
这三种模式被修改为被做成内核模块。 只要加载相应的内核模块就OK了。
/etc/httpd/conf.modules.d/00-mpm.conf 模块中有三种模式。 注释或则起作用就OK了。 # Select the MPM module which should be used by uncommenting exactly # one of the following LoadModule lines: # prefork MPM: Implements a non-threaded, pre-forking web server # See: http://httpd.apache.org/docs/2.4/mod/prefork.html LoadModule mpm_prefork_module modules/mod_mpm_prefork.so # worker MPM: Multi-Processing Module implementing a hybrid # multi-threaded multi-process web server # See: http://httpd.apache.org/docs/2.4/mod/worker.html # #LoadModule mpm_worker_module moules/mod_mpm_worker.so # event MPM: A variant of the worker MPM with the goal of consuming # threads only for connections with active processing # See: http://httpd.apache.org/docs/2.4/mod/event.html # #LoadModule mpm_event_module modules/mod_mpm_event.so
这三种模式有许多参数:
prefork ServerLimit 主进程最多可开启进程数 StartServers 服务开启后, 开启多少个子进程 MinspareServers 至少有多少个进程空闲 MaxSpareServers 最多有多少个进程空闲 MaxConnectionsPerchild 一个进程处理多少个请求后,杀掉,产生一个新的进程 MaxRequestWorkers 最多有多少个连接请求
worker: ServerLimit StartServers MinSpareThreads MaxSpareThreads MaxRequestWorkers ThreadsPerChild
event: ThreadsPerChild MaxRequestWorkers AsyncRequestWorkerFactor
修改配置文件:
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
StartServers 5
MinspareServers 3
MaxSpareServers 15
MaxConnectionsPerChild 0
MaxRequestWorkers 50
用户认证:
httpd认证分为表单认证和http协议的认证。
表单认证就是我们互联网上浏览网页经常遇到的,需要提供账号和密码。由服务器端的应用程序提供。
http协议认证:
认证质询:
WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户提供账号和密码;
认证:
Authorization:客户端填入账号和密码后再次发送请求报文 ,认证通过后,服务端将响应请求的资源;
认证的方式有两种:
basic:明文
digest:摘要
虚拟账号:仅用于访问某服务使用。
用户信息存储于何处:文本文件、SQL数据库、ldap目录中。
基于basic认证实例:
基于用户身份认证: <Directory "/var/www/html"> Options Indexes FollowSymLinks AllowOverride None AuthType basic AuthName "Admin Area, Enter your name/password." AuthUserFile "/etc/httpd/.htpasswd" Require valid-user </Directory>
认证文件的生成:
htpasswd -c -m /etc/httpd/.htpasswd jack
htpasswd -m /etc/httpd/.htpasswd bob
基于组的认证:
配置文件:
<Directory "/var/www/html"> Options Indexes FollowSymLinks AllowOverride None AuthType basic AuthName "Admin Area, Enter your admin,admin_user" AuthUserFile "/etc/httpd/.htpasswd" AuthGroupFile "/etc/httpd/.grouppasswd" Require group admin </Directory>
组认证是不是单纯的验证组信息,而是要结合用户验证来进行。
worker进程的运行者身份的验证:
User apache Group apache
进程运行者和运行的所属组都是apache, 这样其实也比较好。
即使黑客截获了httpd的服务, 也只能获得httpd用户的权限,对整个系统构成不了毁灭性的破坏。
也不介意将网页文件的所属组或则所属者修改为httpd。这样一般文件可以随意删除网页文件,这样其实也不好。
原文地址:http://9280078.blog.51cto.com/9270078/1858698