Linux 中httpd服务
httpd是Apache超文本传输协议(HTTP)服务器的主程序,直接执行程序即可启动该服务。
命令参数
httpd
-h可查看命令选项
-M查看静态编译及动态装载的模块(动态模块加载:不需重启即生效)
-c<httpd指令> 在读取配置文件前,先执行选项中的指令。
-C<httpd指令> 在读取配置文件后,再执行选项中的指令。
-d<服务器根目录> 指定服务器的根目录。
-D<设定文件参数> 指定要传入配置文件的参数。
-f<设定文件> 指定配置文件。
-l 显示服务器编译时所包含的模块。
-L 显示httpd指令的说明。
-S 显示配置文件中的设定。
-t 测试配置文件的语法是否正确。
-v 显示版本信息。
-V 显示版本信息以及建立环境。
-X 以单一程序的方式来启动服务器
配置文件
httpd服务配置文件模块化,以便于管理
主配置文件 /etc/httpd/conf/httpd.conf
其他配置文件 /etc/httpd/conf.d/*.conf
检测配置文件语法:
httpd -t
service httpd configtest
主配置文件
/etc/httpd/conf/httpd.conf为httpd服务的主配置文件,其配置内容如下
serverroot “/etc/httpd” //相对路径的根,指定apache的运行目录 listen 80 //套接字,默认省略ip,表示监听本机所有ip的80端口(添加套接字只需重新再写一行) user apache //以Apache用户(普通用户)运行httpd的工作进程(降低权限增加安全性) group apache //Apache子进程运行时的用户组 ServerName www.example.com:80 //指定主机名(dns解析的主机名,一个标识,没有特殊意义) Include conf.modules.d/ *.conf //包含conf.modules.d/ *.conf为子配置文件 DocumentRoot "/var/www/html" //网页文件存放的目录,同时也是URL路径的起始位置 <Directory [目录]> //对目录的具体权限设置,对目录进行的配置,对当前目录及其子目录生效 AllowOverride none Require all de1nied //控制访问,通过网页对所有人拒绝访问此目录 /*关于Require Require是对访问用户进行限制的参数,Require 可以指定ip,host,若有用户也可以指定可访问的用户 Require all denied 所有人不可访问 Require all granted 所有人可访问 Require ip [ip] 可以指定可访问的ip(172.20) Require not ip [ip] 可指定不可访问的ip 当有多个require时需要用黑名单或白名单 白名单: <RequireAny> //标签内为可访问的ip Require all denied Require ip [ip1] Require ip [ip2] </RequireAny> 黑名单: <RequireAll> //标签内为不可访问的ip Require all granted Require not ip 192.168.1.1 </RequireAll> */ Options Indexes FollowSymLinks /*关于Options Options为是否开启额外特性,不开启任何特性为None,在添加属性时若直接加属性名则为只使用该属性,属性之间使用空格符隔开,若写为“+Indexes”这样的格式,则为在其父目录的属性基础上再加上此属性 ALL 开启MultiViews之外的所有特性,默认属性 Indexes 开启后访问的目录下如果没有index.html,index.php,则会将目录下的文件名列出,非下载站点不建议开启 FollowSymLinks 开启后可访问目录下软连接,不安全不建议开启 ExecCGI 开启后允许使用mod_cgi执行CGI脚本 Includes 开启后允许使用mod_include提供的服务器端包含 MultiViews 开启后允许使用多重视图,但影响服务器性能不建议开启 */ ErrorLog "logs/error_log" //定义错误日志路径 LogLevel warn //定义错误日志等级 LogFormat “...” //定义日志格式 CustomLog "logs/access_log" combined //定义访问日志路径和日志格式,combined为一种日志格式 DirectoryIndex index.html //默认主页 </Directory>
多路处理模块配置文件
/etc/httpd/conf.modules.d/为其模块配置文件
/etc/httpd/conf.modules.d/00-mpm.conf //为多路处理模块配置,文件改动后,重启服务生效,对模块中参数的改动直接写在对应模块下即可
prefork模块
指定加载模块 模块名称 模块路径
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
//prefork模块 事先生成多个空闲进程以等待处理用户请求,一个进程响应一个请求(提前生成空闲进程以使用户请求时无需现生成进程,减少用户等待时间)系统的默认模块,也是最稳定的模块
配置参数直接写在对应模块下即可(以下是默认参数)
StartServers 5 //启动服务时开启子进程数
MinSpareServers 5 //最小空闲进程数
MaxSpareServers 10 //最大空闲进程数
MaxRequestWorkers 256 //最多的并发请求数
worker模块
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
//worker模块 一个主进程生成m个子进程,然后每个子进程生成n个线程,所以可以有m*n个并发线程,一个线程响应一个请求
配置参数直接写在对应模块下即可(以下是默认参数)
ServerLimit 16 //最大的进程数
StartServers 3 //启动服务时开启子进程数
MaxRequestWorkers 150 //最多的并发请求数
MinSpareThreads 25 //最少空闲的线程数
MaxSpareThreads 75 //最多空闲的线程数
ThreadsPerChild 25 //每个子进程的线程数
event模块
#LoadModule mpm_event_module modules/mod_mpm_event.so
//event模块,同worker模块类似,生成m个子进程,每个进程直接响应n个请求,并发响应请求m*n,有专门的线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力
httpd服务的进阶配置
basic认证配置
有一些网页在访问时需要进行用户的认证,通过输入用户名和密码来访问httpd服务
<Directory "/var/www/html"> Options Indexes AllowOverride None //利用Apache的rewrite模块对 URL 进行重写的时候, rewrite规则会写在 .htaccess 文件里,而此处的设置就是是否允许.htaccess文件覆盖我们的配置,一般从安全性考虑不允许,所以此处为none,开启为all AuthType Basic //认证类型为basic AuthName “Some Private Area...” //认证名称 AuthUserFile “/etc/httpd/conf/.htpasswd” //用户和密码文件的存放路径 #AuthGroupFile “/etc/httpd/conf/.htgroup” //组文件存放路径,文件中只存放组名和组内成员,密码读取用户密码文件 Require user tom //对tom可以访问 #Require group groupname //允许指定组访问 #Require valid-user //允许所有合法账号访问,只要存在于.htpasswd中即为合法账号 </Diretory>
生成用户和密码文件:
htpasswd -c -b -m /etc/httpd/conf/.htpasswd tom abc.com
htpasswd
-h 查看选项
-c 创建一个新文件
-m MD5加密(默认)
-b 直接指定密码(非交互式)
在执行完以上操作之后就算配置完成了
httpd配置虚拟主机
正常情况下一台服务器应该只能配置一个站点,如果我们希望在一台主机上配置多个站点则需要使用httpd的虚拟主机功能,httpd虚拟主机配置分别可以基于ip,基于端口,基于域名。在三种虚拟主机中,推荐使用基于域名的虚拟主机。另外当我们配置了虚拟主机后就不会再读取主配置文件中的主机配置了。
基于ip时需要服务器对于每一个站点都有自己的ip,需要服务器有多个网卡或者启用网卡的别名。
基于端口需要开启额外的端口分配给站点,而用户在访问时则需要注明访问的端口才可以访问,由于额外开启的端口不是默认端口,所以需要用户自己记住这些端口,所以不建议使用这种方式。
基于域名时则可以直接通过用户要访问的域名而链接到对应的站点,不需要额外的ip和端口,虽然在用户要访问一个站点时是dns先将用户输入的域名解析为ip(此时服务器只有一个ip,其上的所有站点都会解析为一个ip)然后在访问到服务器,再通过数据包中的端口找到httpd服务,但是由于在传输的数据包中包含有域名的数据,所以在通过ip+端口找到服务器和httpd服务后,httpd通过分析数据包中的域名信息即可知道用户要访问的是哪一个站点了。但是如果用户通过ip访问则会默认访问到第一个站点。
下面是三种虚拟主机的配置方式:
基于端口
[root@centos7(nanyibo) ~]# vim /etc/httpd/conf.d/vhost.conf Listen 8080 //开启额外的监听端口 Listen 9090 <VirtualHost *:8080> //虚拟主机的开始标签<VirtualHost ip:port> *表示任意 DocumentRoot "/app/website1" //网页文件存放的目录,同时也是URL路径的起始位置 <Directory "/app/website1"> //虚拟主机的文件目录标签 Require all granted //允许所有人访问 </Directory> </VirtualHost> //虚拟主机的结束标签 <VirtualHost *:9090> DocumentRoot "/app/website2" <Directory "/app/website2"> Require all granted </Directory> </VirtualHost>
基于ip
[root@centos7(nanyibo) ~]# vim /etc/httpd/conf.d/vhost.conf <VirtualHost 192.168.153.17:80> DocumentRoot "/app/website1" <Directory "/app/website1"> Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.153.27:80> DocumentRoot "/app/website2" <Directory "/app/website2"> Require all granted </Directory> </VirtualHost> [root@centos7(nanyibo) ~]# ifconfig ens34:0 192.168.*.1/24 //通过别名对一个网卡配置多个ip [root@centos7(nanyibo) ~]# ifconfig ens34:1 192.168.*.2/24
基于域名的虚拟主机
<VirtualHost *:80> ServerName www.baidu.com //指定域名 DocumentRoot "/app/website1" CustomLog "logs/www.baidu.com_access_log" combined //日志文件存放目录和日志格式 <Directory "/app/website1"> Require all granted </Directory> </VirtualHost> <VirtualHost *:80> ServerName bbs.baidu.com DocumentRoot "/app/website2" CustomLog "logs/bbs.baidu.com_access_log" combined <Directory "/app/website2"> Require all granted </Directory> </VirtualHost>