apache服务
apache服务
一些概念:
虚拟主机:是一个技术
Apache中的虚拟主机是一种技术,允许你在一台服务器上运行多个Web网站,每个网站都有自己的域名或IP地址。这通过在Apache服务器上配置特定的配置文件来实现,该配置文件会为每个网站指定一个独立的目录。虚拟主机使用一种技术叫做虚拟目录,该技术可以将不同的网站内容动态地指向服务器上的不同目录。
安装包 httpd 服务名称:httpd
是一个网站服务,用于去访问主页的服务
配置文件名称: 服务的根目录:/etc/httpd 主配置文件:/etc/httpd/conf/httpd.conf 网站数据目录:/var/www/html 访问日志:/var/log/httpd/access_log 错误日志:/var/log/httpd/error_log
参数介绍:
ServerRoot 服务目录 ServerAdmin 管理员邮箱 User 运行服务的用户 Group 运行服务的用户组 ServerName 网站服务器的域名 DocumentRoot 文档的根目录(网站数据目录) Directory 网站数据目录的权限 Listen 监听的ip地址与端口号 DirectoryIndex 默认的索引页面 ErrorLog 错误日志文件 CusetomLog 访问的日志文件 Timeout 网页超时时间,默认为300秒
关于权限:
options:用来定义目录有哪些的特性,FollowSymLinks,可以在目录中使用符号链接,可以使用+或-,添加或者取消某个值 AllowOverride:用于设置.htaccess文件中的指令类型,None表示禁止使用.htaccess allow和deny order allow,deny 表示默认情况禁止所有客户端访问,且Allow字段在Deny字段之前被匹配,如果Allow字段又匹配Deny字段,则Deny字段最终生效,也就是Deny会覆盖Allow order deny,allow 默认情况下,允许所有客户端访问,如果有相同的字段,allow会覆盖deny 案列: 1)允许所有客户端访问 Order allow,deny Allow from all 2)拒绝ip和域名 Order deny,allow deny from ip deny from 域名 3)只有某一个ip能访问,其余都不能访问 Order deny,allow deny from all allow from Ip (先拒绝所有的,在来允许某一个) 4)仅允许某个网段能访问,但是其中有一个ip不能访问 Order allow,deny allow from ip/24 deny from ip
常见的操作:
一:搭建用户认证的目录
就是用户访问网页时,需要输入账号和密码才能去访问
添加账户和密码
添加账户和密码 htpasswd -c /etc/httpd/conf/authpasswd qcy
[root@controller conf.d]# vim auth.conf <VirtualHost *:80> DocumentRoot /qq ServerName www.a.com </VirtualHost> <Directory /qq> AuthType Basic AuthName "auth" AuthUserFile /authpasswd Require user auth qcy </Directory>
设置selinux
[root@controller conf.d]# semanage fcontext -t httpd_sys_content_t -a '/qq(/.*)?' [root@controller conf.d]# restorecon -RFv /qq/ [root@controller /]# ll -Z qq total 4 -rw-r--r--. 1 root root system_u:object_r:httpd_sys_content_t:s0 16 Nov 23 19:22 index.html [root@controller /]# ll -Z qq -d drwxr-xr-x. 2 root root system_u:object_r:httpd_sys_content_t:s0 24 Nov 23 19:22 qq [root@controller /]#
设置防火墙
[root@controller /]# firewall-cmd --permanent --add-service=http [root@controller /]# firewall-cmd --reload [root@controller /]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens160 ens192 sources: services: cockpit dhcpv6-client ssh http ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: [root@controller /]#
访问Ip和域名都行
http://192.168.10.111 输入账户和密码
二:搭建个人网站
就是基于自己的用户的网站,就是要开放权限,就是httpd默认是不允许访问自己的用户目录
更改一下的参数
vim /etc/htpd/conf.d/userdir.conf 修改里面的几个参数 UserDir enabled # 开启访问用户 UserDir public_html # 访问用户目录的名字
还需要在家目录下创建访问用户网站的目录
mkdir /home/q7/public_html echo "this is my web" >> /home/q7/public_html/index.html #并且要赋予权限,让其他人能够访问这个目录 chmod o+x /home/q7/
开启防火墙和selinux
[root@localhost /]# firewall-cmd --permanent --add-service=http [root@localhost /]# firewall-cmd --reload #selinux开启访问家目录的布尔值 [root@localhost /]# setsebool httpd_enable_homedirs on
用户家目录的文件的selinux的的类型为httpd_user_content_t,不用刻意设置,创建好文件后,重启服务,会自动的设置
使用浏览器来访问
http://192.168.10.101/~q7 就能显示内容了
三:基于域名访问的虚拟主机
就是使用同一个ip,不同的域名来实现访问不同的页面,就是一台服务器运行好几个网站
vim /etc/httpd/conf.d/a.conf
<VirtualHost *:80> DocumentRoot /a </VirtualHost> <Directory /a> Require all granted </Directory>
vim /etc/httpd/conf.d/b.conf
<VirtualHost *:80> DocumentRoot /b </VirtualHost> <Directory /b> Require all granted </Directory>
防火墙和selinux都要设置
# 设置网站目录的上下文类型与httpd保持一致 [root@controller www]# semanage fcontext -a -t httpd_sys_content_t '/www/superqiao(/.*)?' [root@controller www]# restorecon -RFv /www/superqiao/
[root@controller www]# firewall-cmd --permanent --add-service=http success [root@controller www]# firewall-cmd --reload success [root@controller www]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens160 ens192 sources: services: cockpit dhcpv6-client http mountd nfs rpc-bind samba ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: [root@controller www]#
访问这2个域名
在浏览器上面访问 www.a.com
在windows中访问的话,要修改域名解析的文件 C:\Windows\System32\drivers\etc 这个目录下的hosts文件,就可以在本地主机上的浏览器去访问了
四:基于端口来访问虚拟主机
就是基于端口来访问虚拟主机
修改httpd的主配置文件
添加端口
Listen 8088 Listen 8089
创建端口,类型与80端口保持一致
semanage port -a 8088 -t http_port_t -p tcp semanage port -a 8089 -t http_port_t -p tcp
防火墙放行这2个端口
firewall-cmd --permanent --add-port=8088/tcp firewall-cmd --permanent --add-port=8089/tcp firewall-cmd --reload
创建端口的配置文件
[root@controller conf.d]# vim 8089.conf <VirtualHost 192.168.10.110:8089> DocumentRoot /www/8089 </VirtualHost> <Directory /www/8089> Require all granted </Directory>
修改selinux的上下文
[root@controller www]# semanage fcontext -a -t httpd_sys_content_t '/www/8089(/.*)?' [root@controller www]# restorecon -RFv /www/8089
重启http服务
基于端口去访问
192.168.10.110:8089
5:基于端口来访问具有不同的页面呈现
原理很简单,就是配置2个端口的配置文件和一个默认的80的配置文件,域名和ip一一对应的上,就能实现
1:创建网页文件
[root@controller www]# ls 8088 8089 q7 [root@controller www]# echo "welcome 8088 port " >> 8088/index.html [root@controller www]# echo "welcome 8089 port " >> 8089/index.html [root@controller www]# echo "welcome 80 port " >> q7/index.html [root@controller www]#
2:在httpd主配置文件里面添加2个端口
Listen 80 Listen 8088 Listen 8089 添加完之后,不能重启httpd服务,因为没有这2个端口号,需要添加这2个端口号,才能重启,且端口的上下文类型要与默认的httpd端口的类型保持一致性 [root@controller /]# semanage port -a 8088 -t http_port_t -p tcp [root@controller /]# semanage port -a 8089 -t http_port_t -p tcp [root@controller /]# semanage port -l |grep 80 amanda_port_t tcp 10080-10083 amanda_port_t udp 10080-10082 conntrackd_port_t udp 3780 cyphesis_port_t tcp 6767, 6769, 6780-6799 geneve_port_t tcp 6080 hadoop_namenode_port_t tcp 8020 hplip_port_t tcp 1782, 2207, 2208, 8290, 8292, 9100, 9101, 9102, 9220, 9221, 9222, 9280, 9281, 9282, 9290, 9291, 50000, 50002 http_cache_port_t tcp 8080, 8118, 8123, 10001-10010 http_port_t tcp 8089, 8088, 80, 81, 443, 488, 8008, 8009, 8443, 9000 这样才能重启httpd服务,就不会报错 [root@controller /]# systemctl restart httpd
3:添加配置文件
在conf.d这个目录下创建配置文件
[root@controller conf.d]# cat 8088.conf <virtualhost 192.168.10.110:8088> documentroot /www/8088 </virtualhost> <directory /www/8088> require all granted </directory> [root@controller conf.d]# cat 8089.conf <virtualhost 192.168.10.110:8089> documentroot /www/8089 </virtualhost> <directory /www/8089> require all granted </directory> [root@controller conf.d]# cat q7.conf <virtualhost 192.168.10.110:80> documentroot /www/q7 servername www.q7.com </virtualhost> <directory /www/q7> require all granted </directory> [root@controller conf.d]# 重启httpd服务 [root@controller conf.d]# systemctl restart httpd [root@controller conf.d]#
4:接下来就是权限有关的问题了
首先是防火墙的放行
[root@controller conf.d]# firewall-cmd --permanent --add-service=http success [root@controller conf.d]# firewall-cmd --permanent --add-port=8088/tcp success [root@controller conf.d]# firewall-cmd --permanent --add-port=8089/tcp success [root@controller conf.d]# firewall-cmd --permanent --add-port=80/tcp success [root@controller conf.d]# firewall-cmd --reload success [root@controller conf.d]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens160 ens192 sources: services: cockpit dhcpv6-client http ssh ports: 8088/tcp 8089/tcp 80/tcp protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: [root@controller conf.d]#
selinux的方面的管理
就是一个是文件的上下文类型,还有一个就是布尔值的操作
[root@controller www]# ls 8088 8089 q7 [root@controller www]# ll -Z total 0 drwxr-xr-x. 2 root root unconfined_u:object_r:default_t:s0 24 Dec 6 14:20 8088 drwxr-xr-x. 2 root root unconfined_u:object_r:default_t:s0 24 Dec 6 14:20 8089 drwxr-xr-x. 2 root root unconfined_u:object_r:default_t:s0 24 Dec 6 14:21 q7 [root@controller www]# 很明显的看出这个网页的上下文类型与httpd服务的类型不一致,所以无法被httpd服务所加载 更改这网页文件的上下文类型 [root@controller www]# semanage fcontext -a -t httpd_sys_content_t '/www(/.*)?' [root@controller www]# restorecon -RFv /www/ Relabeled /www from unconfined_u:object_r:default_t:s0 to system_u:object_r:httpd_sys_content_t:s0 Relabeled /www/8089 from unconfined_u:object_r:default_t:s0 to system_u:object_r:httpd_sys_content_t:s0 Relabeled /www/8089/index.html from unconfined_u:object_r:default_t:s0 to system_u:object_r:httpd_sys_content_t:s0 Relabeled /www/8088 from unconfined_u:object_r:default_t:s0 to system_u:object_r:httpd_sys_content_t:s0 Relabeled /www/8088/index.html from unconfined_u:object_r:default_t:s0 to system_u:object_r:httpd_sys_content_t:s0 Relabeled /www/q7 from unconfined_u:object_r:default_t:s0 to system_u:object_r:httpd_sys_content_t:s0 Relabeled /www/q7/index.html from unconfined_u:object_r:default_t:s0 to system_u:object_r:httpd_sys_content_t:s0 [root@controller www]# ll -Z total 0 drwxr-xr-x. 2 root root system_u:object_r:httpd_sys_content_t:s0 24 Dec 6 14:20 8088 drwxr-xr-x. 2 root root system_u:object_r:httpd_sys_content_t:s0 24 Dec 6 14:20 8089 drwxr-xr-x. 2 root root system_u:object_r:httpd_sys_content_t:s0 24 Dec 6 14:21 q7 [root@controller www]# 直接将这个这个网页文件的父目录设置为httpd服务的类型,因为selinux具有继承性,所以以后在这个里面创建文件,都会默认有httpd服务的上下文类型
5:前面忘了还有一个操作,就是域名解析
192.168.10.110 www.q7.com
测试端也要添加这个域名解析,否则会报错
7:访问
[root@nodes1 yum.repos.d]# curl www.q7.com:80 welcome 80 port [root@nodes1 yum.repos.d]# curl www.q7.com:8088 welcome 8088 port [root@nodes1 yum.repos.d]# curl www.q7.com:8089 welcome 8089 port
这样就完成了基于同一个ip(域名)通过不同的端口所呈现的网页内容的不同,
在思考一下,如果网页文件很多,不是只有一个呢,后续完善,
当然,还有优先级的问题,就是在一个配置文件里面,如果有多个conf的配置文件,且有互相冲突的,就创建一个备份目录,移动到这个备份目录里面去,就可以了
冲突的原因:
就是用了一个ip或者一个域名有2个配置文件,就会有优先级的问题,这个时候,就创建一个备份目录(以conf结尾的目录),把目录移到里面去
6:加密
加密的话,访问某个网站就比较的安全
配置的步骤:
1)安装密钥的的包
[root@controller /]# yum -y install mod_ssl
2)生成密钥
[root@controller ~]# openssl genrsa > tlsweb.key
3)生成证书请求文件
[root@controller ~]# openssl req -new -key tlsweb.key > tlsweb.csr
4)生成证书文件(利用密钥和证书请求文件)
[root@controller ~]# openssl req -x509 -days 365 -key tlsweb.key -in tlsweb.csr > tlsweb.crt
5)修改ssl配置文件里面的参数和移动这些文件
SSLCertificateFile /etc/pki/tls/certs/tlsweb.crt #证书文件 SSLCertificateKeyFile /etc/pki/tls/private/tlsweb.key #密钥文件
移动这些文件
[root@controller ~]# mv tlsweb.key /etc/pki/tls/private/ [root@controller ~]# mv tlsweb.crt /etc/pki/tls/certs/
6)重启服务,selinux必须关掉,才能重启,否则会阻拦
[root@controller ~]# setenforce 0 [root@controller ~]# systemctl restart httpd [root@controller ~]# setenforce 1 [root@controller ~]# getenforce Enforcing [root@controller ~]#
为什么重启httpd会报错?
因为这个文件的上下文类型不一致,所以httpd服务不能加载这些文件,移动的话,文件的上下文类型不会改变,cp的话,文件的上下文类型被自动的继承父目录的上下文类型,也就是cert_t这个类型,修改成这个类型,就不会报错了
唉(这个selinux真的烦。。。)
7)防火墙放行和客户端访问
[root@controller ~]# firewall-cmd --permanent --add-service=https success [root@controller ~]# firewall-cmd --reload success [root@controller ~]# 在客户端的浏览器上输入https://192.168.10.110 点击advanced什么的 就能访问了,上面有个锁的标签,就成功
7:加密自定义网页内容的文件
就是关于这次的操作和以前的哪些的操作,都可以在/etc/httpd/conf.d这个目录下编辑配置文件
就是像基于域名那样的配置,在里面添加一些加密文件的参数,就可以了
几个参数的设置:
SSLCertificateFile /etc/pki/tls/certs/localhost.crt 这个书证书文件的路径 SSLCertificateKeyFile /etc/pki/tls/private/localhost.key 这个是密钥 SSLEngine on 这个是ssl启动的设置
操作:
openssl genrsa > tlsweb.key openssl req -new -key tlsweb.key > tlsweb.csr openssl req -x509 -days 365 -key tlsweb.key -in tlsweb.csr > tlsweb.crt cp tlsweb.key /etc/pki/tls/private/ cp tlsweb.crt /etc/pki/tls/certs/ <virtualhost 192.168.10.110:443> documentroot /var/www/html servername www.a.com SSLEngine on SSLCertificateFile /etc/pki/tls/certs/tlsweb.crt SSLCertificateKeyFile /etc/pki/tls/private/tlsweb.key </virtualhost> <directory /var/www/html> require all granted </directory>
防火墙的放行
[root@controller /]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens160 ens192 sources: services: cockpit dhcpv6-client http ssh ports: 443/tcp protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: [root@controller /]#
编写的网页配置文件
8:总结
就是这些操作,都可以基于身份认证来进行操作,
最后的就是做一些网页权限的操作,允许指定的网段能够访问这个网页,里面的参数必须要学会,就是不仅仅是老师教的