文章目录
Apache服务器
Apache是一个流行的开源Web服务器软件,它可以在各种操作系统上运行,包括Linux、Unix、Windows、macOS等。Apache可以处理静态和动态内容,支持多种编程语言和脚本,例如PHP、Perl、Python等。它还可以通过模块化的方式扩展功能
Apache的特点:
Apache可以处理静态和动态内容
支持多种编程语言和脚本
,例如PHP、Perl、Python等跨平台性
:Apache可以在多种操作系统上运行,包括Windows、Linux、macOS等,具有很好的跨平台性。易于扩展
:Apache支持多种扩展模块,用户可以根据需要选择适合自己的模块来扩展功能。
Linux安装Apache
Linux安装Apache的方式
- 去官网获取
源码包
,进行源代码编译安装,扩展额外的功能,自定义安装路径 rpm包
手动安装,需要自行解决依赖关系- 配置
yum源
,使用yum自动化安装,自动解决依赖关系
使用配置yum源的方法安装Apache
- 创建虚拟机
用VMware 创建一台虚拟机并开启
- 配置NAT网卡信息
[root@apache-server ~]# vi /etc/sysconfig/network-scripts/ifcfg-[xxx] # 后面写自己的网卡名
# 添加或修改如下参数
BOOTPROTO=static # 改为静态IP
ONBOOT=yes # 开启网卡
IPADDR=192.168.200.80 # 添加IP地址
NETMASK=255.255.255.0 # 子网掩码
GATEWAY=192.168.200.2 # 网关
DNS1=114.114.114.114 # DNS
[root@apache-server ~]# systemctl restart network # 重启让网卡生效
[root@apache-server ~]# ping -c4 www.baidu.com # 测试是否连上网了
PING www.baidu.com (39.156.66.18) 56(84) bytes of data.
64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=1 ttl=128 time=26.6 ms
64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=2 ttl=128 time=25.4 ms
64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=3 ttl=128 time=25.3 ms
64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=4 ttl=128 time=25.3 ms
# 这就是ping通了
--- www.baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 12041ms
rtt min/avg/max/mdev = 25.326/25.701/26.692/0.594 m
- 安装Apache(Linux的软件包httpd)
[root@apache-server ~]# yum install -y httpd
- 检查是否启动了80端口
[root@apache-server ~]# yum install -y net-tools # 安装
[root@apache-server ~]# netstat -tulnp |grep "80" # 如果你没开启httpd的话肯定找不见80端口
- 启动Apache设置开机自启
[root@apache-server ~]# systemctl start httpd # 开启apache服务器
[root@apache-server ~]# systemctl status httpd # 查看状态 如果你开启了那状态就是active(running)
[root@apache-server ~]# systemctl enable httpd # 开机自启
[root@apache-server ~]# netstat -tulnp |grep "80"
tcp6 0 0 :::80 :::* LISTEN 71722/httpd
- 放行http服务
[root@apache-server ~]# setenforce 0 # 将SELinux的执行模式设置为Permissive
[root@apache-server ~]# getenforce
Permissive
[root@apache-server ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens34
sources:
services: dhcpv6-client ssh # firewall 默认没有放行http
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@apache-server ~]# firewall-cmd --add-service=http --permanent # 放行http服务
success
[root@apache-server ~]# firewall-cmd --reload # 重启生效
success
[root@apache-server ~]# firewall-cmd --list-all # 查看是否放行
public (active)
target: default
icmp-block-inversion: no
interfaces: ens34
sources:
services: dhcpv6-client http ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
- 访问网页
打开浏览器输入自己的IP地址
Apache文件结构
- /etc/httpd/conf/httpd.conf
httpd主配置文件
- /etc/httpd/conf.d/*.conf
httpd子配置文件
- /usr/lib64/httpd/modules、/etc/httpd/modules/
所有你想要使用的模块文件默认放在这个目录里面
- /var/html/www
CentOS默认的首页所在目录,当你输入 http://localhost
所显示的数据,就是放在这个目录当中的首页文件(默认为index.html)
- /var/log/httpd、/etc/httpd/log/
默认的Apache日志文件
- /usr/sbin/httpd
/usr/sbin/httpd
是Apache服务器的主要执行文件,它是Apache服务器的守护进程,负责监听来自客户端的请求,处理请求并返回响应。
- /usr/sbin/apachectl
/usr/sbin/apachectl
是Apache服务器的控制脚本,提供了一系列管理Apache服务器的命令,如启动、停止、重启、重新载入配置文件等
- /usr/bin/htpasswd
/usr/bin/htpasswd
是一个在Linux系统下用于生成Apache服务器密码文件的命令行工具。
Apache主配置文件
[root@apache-server ~]# vim /etc/httpd/conf/httpd.conf
ServerRoot “/etc/httpd”
指定httpd主配置目录定义
- Listen 80
指定apache运行端口,也可以修改端口如 8080
- Include conf.modules.d/*.conf
用于导入Apache服务器模块配置文件。
/etc/httpd/conf.modules.d/
目录下,每个模块对应一个配置文件。通过在主配置文件中添加该指令,可以将所有模块配置文件导入到主配置文件中,从而激活所有的Apache服务器模块。
- IncludeOptional conf.d/*.conf
用于导入Apache服务器其他配置文件的指令
与Include指令不同的是,如果IncludeOptional导入的路径有问题,该路径下的配置文件不会被读取,但不会导致Apache服务器启动失败。
- User apache
Group apache
用于设置Apache服务器运行用户和用户组
在Linux系统中,为了保证服务器的安全性和稳定性,通常需要将不同的进程运行在不同的用户下,以限制进程的权限和资源访问能力。在Apache服务器中,也需要将服务器进程运行在一个特定的用户下,以限制服务器进程的权限,防止被攻击者利用漏洞获取服务器权限。
User apache
指定了Apache服务器进程所应该运行的用户为apache
。
Group apache
指定了Apache服务器进程所应该运行的用户组为apache
。
这意味着Apache服务器进程将以apache
用户的身份运行,只能访问apache
用户有权限的文件和资源,无法访问其他用户的文件和资源。
如果Apache服务器进程运行在root用户下,一旦服务器被攻击者入侵,攻击者就可以获取系统的root权限,从而对系统进行任意操作。因此,将Apache服务器进程运行在一个非特权用户下。
- ServerAdmin root@localhost
用于设置Apache服务器管理员邮箱的指令
- ServerName
www.example.com:80
用于设置Apache服务器的主机名和端口号。
- DocumentRoot “/var/www/html”
"/var/www/html"
是Apache服务器默认的文档根目录,也就是网站文件的存放目录。
当客户端请求Apache服务器时,服务器会从这个目录中查找相应的文件并将其返回给客户端。
- <Directory “/var/www/html”>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
<Directory "/var/www/html">
和</Directory>
之间的配置是用于对/var/www/html
目录进行进一步配置和限制的。
Options Indexes FollowSymLinks
指定了Apache服务器在访问/var/www/html
目录时所具有的选项。其中Indexes
表示可以列出目录中的文件列表,FollowSymLinks
表示可以跟随符号链接访问其他目录。
AllowOverride None
指定了在/var/www/html
目录中不允许使用.htaccess
文件进行额外的配置。
Require all granted
指定了所有的客户端都被允许访问/var/www/html
目录中的文件。
常用选项
Options 访问时展示形式
Options Indexes :当前目录下没有默认页面,就显示目录结构
Options FollowSymLinks :默认设置,允许访问符号链接
Options None : 关闭
AllowOverride .htaccess文件中允许的指令类型
AllowOverride All :全部指令
AllowOverride None :默认值,不允许
Require 访问权限设置
Require all granted :无条件允许访问
Require all denied :无条件拒绝访问
Require ip :指定IP地址范围客户端可以访问
DirectoryIndex index.html
[root@apache-server ~]# httpd -M |grep dir_module # 可以通过这个命令来查询模块的启动情况
dir_module (shared)
userdir_module (shared)
<IfModule dir_module>
和</IfModule>
之间的配置是用于检查dir_module
模块是否已经加载,如果已经加载,则对DirectoryIndex
指令进行配置。
dir_module
是Apache服务器的一个内置模块,用于提供目录浏览功能。
DirectoryIndex
指令用于设置默认的文档索引文件。当客户端请求一个目录时,服务器会自动查找该目录下的文档索引文件,并返回其中的内容。
例如:你在浏览器中输入你的IP地址,就会自动搜索DirectoryIndex
设置的索引文件
- <Files “.ht*”>
Require all denied
</Files>
<Files ".ht*">
和</Files>
之间的配置用于限制对指定文件的访问。
".ht*"
是一个通配符,表示匹配以.ht
开头的所有文件,如.htaccess
和.htpasswd
等。
Require all denied
表示拒绝所有客户端对指定文件的访问。
- ErrorLog “logs/error_log”
指定错误日志文件的路径和名称。
error_log
记录服务器的错误信息,包括服务器运行过程中出现的错误、警告和提示等
access_log
记录客户端的访问信息,包括客户端的IP地址、访问时间、请求方式、请求URL、状态码等。
- LogLevel warn
指定服务器日志的详细程度
如果想要了解日志相关可以参考:日志服务器等级
-
<IfModule log_config_module> LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" 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" combined </IfModule>
<IfModule log_config_module>
和</IfModule>
是一个条件块,用于判断是否加载了log_config_module
模块。如果加载了该模块,就会执行条件块内的指令,否则会忽略这些指令。
LogFormat
指令用于定义日志格式,可以通过它来控制记录日志的内容和格式。定义了三种日志格式:combined
、common
和combinedio
。
<IfModule logio_module>
和</IfModule>
是一个条件块,用于判断是否加载了logio_module
模块。
CustomLog
指令用于指定日志文件的路径和名称,可以通过它来记录服务器的访问日志。在这个例子中,将日志文件存储在logs/access_log
中,并使用combined
格式记录访问日志。
标识 | 含义 |
---|---|
%h | 客户端IP |
%l | 身份验证信息 |
%u | 用户名称 |
%t | 访问时间格式为[day/month/year:hour:minute:second zone] |
\"%r\“ | 请求方法、请求URL和HTTP协议版本 |
%>s | 表示服务器返回给客户端的HTTP状态码 |
%b | 响应大小,单位为字节 |
\“%{Referer}i\” | 表示客户端请求时的来源页面 |
\“%{User-Agent}i\” | 表示客户端浏览器的用户代理信息 |
-
<IfModule alias_module> # # Redirect: Allows you to tell clients about documents that used to # exist in your server's namespace, but do not anymore. The client # will make a new request for the document at its new location. # Example: # Redirect permanent /foo http://www.example.com/bar # Alias: Maps web paths into filesystem paths and is used to # access content that does not live under the DocumentRoot. # Example: # Alias /webpath /full/filesystem/path # ScriptAlias: This controls which directories contain server scripts. # ScriptAliases are essentially the same as Aliases, except that # documents in the target directory are treated as applications and # run by the server when requested rather than as documents sent to the # client. The same rules about trailing "/" apply to ScriptAlias # directives as to Alias. ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" </IfModule>
<IfModule alias_module>
和</IfModule>
用于判断Apache服务器是否已经加载了alias_module
模块,如果已经加载则执行指令,否则跳过。
alias_module
模块用于处理URL路径和实际文件路径或CGI脚本路径的映射关系。
Redirect permanent /foo http://www.example.com/bar
Redirect
指令用于将指定URL重定向到另一个URL,可以通过它来实现网站URL的更改或页面的重定向。
permanent
表示采用301永久重定向方式,告诉搜索引擎和浏览器该URL已永久更改,需要将网页重定向到新的URL。
上例中,将URL路径/foo
重定向到http://www.example.com/bar
。
Alias /webpath /full/filesystem/path
Alias
指令用于指定URL路径和实际文件路径的映射关系,可以通过它来让Apache服务器识别并访问指定的文件或目录。
例子中,将URL路径/webpath
映射到实际文件路径/full/filesystem/path
。
ScriptAlias /cgi-bin/ “/var/www/cgi-bin/”
ScriptAlias
指令用于指定URL路径和实际CGI脚本路径的映射关系,可以通过它来让Apache服务器识别并执行指定的CGI脚本。
例子中,将URL路径/cgi-bin/
映射到实际CGI脚本路径/var/www/cgi-bin/
。
- AddDefaultCharset UTF-8
用于设置Apache服务器返回的内容的默认字符集编码。在这个例子中,将默认字符集设置为UTF-8
编码。
案例 配置一台Web服务器
要求: 搭建一台内部的web服务器,端口为8080,管理员邮箱地址设置为 csq111@qq.com,网页编码类型采用 UTF-8,要求访问该服务器时显示系统内核信息,将默认/var/www/html/ 网页目录改为 /csq/html/ ,将/csq/text/ 文件共享出来,并要求访问 IP:8080/text 能访问到该目录。并设置访问IP:8080/baidu 能跳转到www.baidu.com 。
第一步:修改配置文件
[root@apache-server ~]# vim /etc/httpd/conf/httpd.conf
# 修改内容如下
Listen 8080 # 端口设置为8080
ServerAdmin csq111@qq.com # 管理员邮箱
DocumentRoot "/csq/html/" # 网站资源放置在这里
AddDefaultCharset UTF-8 # 默认就是UTF-8 不做修改
<Directory "/csq/html"> # 目录权限设置
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</IfModule>
<IfModule alias_module>
Redirect /baidu www.baidu.com # 访问IP:8080/baidu 能跳转到 www.baidu.com
Alias /text /csq/text/
# 当访问/text目录时会,服务器会返回文件系统中的/csq/text/example.txt文件。
</IfModule>
<Directory "/csq/text"> # 目录权限设置
AllowOverride None
Options Indexes
Require all granted
</Directory>
[root@apache-server ~]# mkdir -p /csq/html/
[root@apache-server html]# echo "$(uname -r)" > index.html
第二步:放行8080端口
[root@apache-server html]# firewall-cmd --add-port=8080/tcp --permanent
success
[root@apache-server html]# firewall-cmd --reload
success
[root@apache-server html]# setenforce 0
第三步:访问
启动用户的个人网站
每一台Apache服务器都有一个首页,但是如果每个个人用户都想要有可以自己完全控制的首页时,那应该如何设计?通过userdir.conf 这个文件
[root@apache-server ~]# vim /etc/httpd/conf.d/userdir.conf
# mod_userdir模块是用于支持用户个人主页的一个模块
# 可以让用户通过访问“http://域名/~用户名”的方式来访问自己的个人主页。
<IfModule mod_userdir.c>
# UserDir disabled
# 注释掉该参数,即开启useradir模块功能
UserDir public_html
# UserDir public_html:这是一个启用用户个人主页功能的设置。
# 用户可以将自己的个人主页文件放在自己的home目录下的public_html目录中
# 然后通过“http://域名/~用户名”的方式来访问自己的个人主页。
</IfModule>
<Directory "/home/*/public_html">
AllowOverride all
authuserfile "/etc/httpd/passwd"
autname "input yourt accout"
authtype basic
require user chao
</Directory>
<Directory "/home/*/public_html">
:表示对/home目录下所有用户的public_html目录进行设置。其中,*表示匹配所有用户的home目录。
AllowOverride all
:开启权限认证文件.htaccess
authuserfile "/etc/httpd/passwd"
:指定使用哪个文件来存储用户名和密码的信息。
authname "input yourt accout"
:在认证弹窗中显示的提示信息,提示用户输入用户名和密码。
authtype basic
:表示使用基本认证方式进行认证。基本认证是一种HTTP认证方式,客户端需要输入用户名和密码才能访问受保护的资源。
require user chao
:指定只允许用户名为chao的用户访问该目录下的文件。
[root@apache-server ~]# useradd csq
[root@apache-server ~]# su - csq
上一次登录:五 6月 23 22:52:48 CST 2023pts/0 上
[csq@apache-server ~]$ mkdir public_html
[csq@apache-server ~]$ cd public_html/
[csq@apache-server public_html]$ echo "现在进入的网页是CSQ用户的私人网页!" > index.html
[csq@apache-server ~]$ chmod 755 public_html/
[csq@apache-server ~]$ chmod 711 ~
[csq@apache-server ~]$ exit
[root@apache-server ~]# htpasswd -c -m /etc/passwd csq
# htpasswd是一个用于管理HTTP认证文件的命令行工具,可以用来创建用户、添加或修改密码等。
# -c选项表示创建一个新的文件,如果文件已经存在,则会被覆盖。
# -m选项表示使用MD5加密算法进行密码加密。
# /etc/httpd/passwd表示指定要创建或修改的HTTP认证文件的路径和文件名。
# csq表示要创建的用户名。
# 运行这个命令后,系统会提示输入该用户的密码。
# 输入密码后,系统会将加密后的密码写入到指定的认证文件中。
[root@apache-server ~]# setenforce 0
[root@apache-server ~]# firewall-cmd --add-service=http --permanet
[root@apache-server ~]# firewall-cmd --reload
访问
输入密码后,你就可以看到自己的私人主页了。不过你看到~了吧,不过这个~有点不好看,那么是否可以将网站设置成为:
- http://你的主机名/privateCSQ
是可以的,最简单的方法
[root@apache-server ~]# vim /etc/httpd/conf.d/userdir.conf
Alias /private/ "/home/csq/public_html/"
<Directory "/home/csq/public_html/">
AllowOverride all
authuserfile "/etc/httpd/passwd"
authname "input yourt accout"
authtype basic
require user csq
</Directory>
访问
http://你的主机名/privateCSQ
虚拟主机的设定
什么是虚拟主机
所谓的虚拟主机,基本上就是"让你的一台服务器上面,有好多个'主网页'存在,也就是说,硬件实际上只有一台主机,但是由网站网址上来看,则似乎有多台主机存在的样子"
。这就是虚拟主机的功能,它可以让你的主机名对应到不同的主网页目录(DocumentRoot 参数),所以看起来会像有多台实际主机的样子。
虚拟主机配置语法
<VirtualHost addr[:port] [addr[:port]] ...>
ServerName ...
DocumentRoot ...
...
</VirtualHost>
基于IP的虚拟主机
一台服务器多个IP地址,当用户访问不同的IP地址的时候显示不同的网站页面
配置网卡添加IP地址
[root@apache-server ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
# 添加如下信息
IPADDR=192.168.200.20
PREFIX=24
GATEWAY=192.168.200.2
DNS1=114.114.114.114
IPADDR1=192.168.200.40
PREFIX1=24
[root@apache-server ~]# systemctl restart network
[root@apache-server ~]# ip a|grep inet
inet 192.168.200.20/24 brd 192.168.200.255 scope global noprefixroute ens33
inet 192.168.200.40/24 brd 192.168.200.255 scope global secondary noprefixroute ens33
[root@apache-server ~]# ping 192.168.200.40
PING 192.168.200.40 (192.168.200.40) 56(84) bytes of data.
64 bytes from 192.168.200.40: icmp_seq=1 ttl=64 time=0.118 ms
64 bytes from 192.168.200.40: icmp_seq=2 ttl=64 time=0.049 ms
建立所需要的目录
在/var/wwwcsq/目录下创建2个网站数据目录
[root@apache-server ~]# mkdir -p /var/wwwcsq/IP20
[root@apache-server ~]# mkdir -p /var/wwwcsq/IP40
写入主页文件
[root@apache-server ~]# echo "192.168.200.20网站主页面" > /var/wwwcsq/IP20/index.html
[root@apache-server ~]# echo "192.168.200.40网站主页面" > /var/wwwcsq/IP40/index.html
在配置文件中配置基于IP的虚拟主机
[root@apache-server ~]# vim /etc/httpd/conf.d/IP20.conf
<Virtualhost 192.168.200.20> # 指定该虚拟主机监听的端口号和IP地址
Documentroot '/var/wwwcsq/IP20' # 指定该虚拟主机的根目录
ServerName www.csqmyweb1.com # 指定该虚拟主机的名称
CustomLog /var/log/httpd/IP20.access_log combined # 日志文件记录
<Directory /var/wwwcsq/IP20>
AllowOverride None
Require all granted
</Directory>
</Virtualhost>
[root@apache-server ~]# vim /etc/httpd/conf.d/IP40.conf
<Virtualhost 192.168.200.40>
Documentroot '/var/wwwcsq/IP40'
ServerName www.csqmyweb1.com
CustomLog /var/log/httpd/IP40.access_log combined # 日志文件记录
<Directory /var/wwwcsq/IP40>
AllowOverride None
Require all granted
</Directory>
</Virtualhost>
[root@apache-server ~]# systemctl restart httpd
防火墙放行
[root@apache-server ~]# setenforce 0
[root@apache-server ~]# firewall-cmd --add-service=http --permanet
[root@apache-server ~]# firewall-cmd --reload
访问
基于域名的虚拟主机
配置hosts文件
[root@apache-server ~]# vim /etc/hosts
192.168.200.20 www.centos.csq.com
192.168.200.20 www.centos.zhw.com
创建网站数据目录
# 创建网站目录
[root@apache-server ~]# mkdir -p /var/csqweb/csqhtml/
[root@apache-server ~]# mkdir -p /var/zhwweb/zhwhtml/
# 网站首页文件
[root@apache-server ~]# echo "您进入了www.centos.csq.com网站" > /var/csqweb/csqhtml/index.html
[root@apache-server ~]# echo "您进入了www.centos.zhw.com网站" > /var/zhwweb/zhwhtml/index.html
配置基于域名的主机
[root@apache-server ~]# vim /etc/httpd/conf.d/wwwcsq.conf
<Virtualhost *:80>
Documentroot /var/csqweb/csqhtml/
ServerName www.centos.csq.com
<Directory /var/csqweb/csqhtml>
AllowOverride None
Require all granted
</Directory>
</Virtualhost>
[root@apache-server ~]# vim /etc/httpd/conf.d/wwwzhw.conf
<Virtualhost *:80>
Documentroot /var/zhwweb/zhwhtml/
ServerName www.centos.zhw.com
<Directory /var/zhwweb/zhwhtml>
AllowOverride None
Require all granted
</Directory>
</Virtualhost>
防火墙放行
[root@apache-server ~]# setenforce 0
[root@apache-server ~]# firewall-cmd --add-service=http --permanet
[root@apache-server ~]# firewall-cmd --reload
访问
基于端口的虚拟主机
创建网站数据目录
[root@apache-server ~]# mkdir -p /var/wwwcsq/80
[root@apache-server ~]# mkdir -p /var/wwwcsq/8080
[root@apache-server ~]# echo "80" > /var/wwwcsq/80/index.html
[root@apache-server ~]# echo "8080" > /var/wwwcsq/8080/index.html
配置基于端口的主机
[root@apache-server ~]# vim /etc/httpd/conf.d/listen80csq.conf
<VirtualHost 192.168.200.20:80>
DocumentRoot /var/wwwcsq/80
ServerName www.centos.csq.com
<Directory /var/wwwcsq/80>
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
[root@apache-server ~]# vim /etc/httpd/conf.d/listencsq8080.conf
Listen 8080
<VirtualHost 192.168.200.20:8080>
DocumentRoot /var/wwwcsq/8080
ServerName www.centos.csq.com
<Directory /var/wwwcsq/8080>
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
防火墙放行
[root@apache-server ~]# setenforce 0
[root@apache-server ~]# firewall-cmd --add-service=http --permanet
[root@apache-server ~]# firewall-cmd --reload
访问
rewrite重写
mod_rewrite是Apache服务器的一个模块,用于重写URL地址。它通过使用正则表达式来匹配和转换请求的URL,并将请求路由到指定的URL地址或站点文件。这个模块提供了非常强大的功能,可以让站点管理员将URL地址重写为更加友好和易读的形式。
如果你是yum安装的apache 会自动开启重写模块(rewrite)
使用mod_rewrite模块,站点管理员可以定义任意的URL映射规则,例如将动态生成的URL地址转换为静态的URL地址,或者将长的URL地址缩短为更加简洁的形式。
例如:
可以将www.example.com/index.php?id=123
这样的URL地址重写为www.example.com/products/123
,这样可以提高站点的可读性和SEO性能。
rewrite使用详解
RewriteEngine
rrwrite功能总开关,用来开启rewrite重写功能
RewriteEngine on
RewriteCond
它可以根据HTTP请求中的各种参数,包括请求头、请求方法、请求协议、请求地址等等,来判断是否满足某些条件,从而决定是否应用某个RewriteRule指令。
RewriteCond指令的常用参数:
%{HTTP_USER_AGENT}:HTTP请求中的User-Agent头部字段,表示客户端浏览器的类型和版本。
%{HTTP_HOST}:HTTP请求中的Host头部字段,表示请求的主机名。
%{HTTP_REFERER}:HTTP请求中的Referer头部字段,表示请求来源的URL地址。
RewriteRule
RewriteRule是mod_rewrite模块中最常用的指令之一,它用于定义URL重写规则。具体来说,RewriteRule指令可以将传入的请求URL地址根据定义的规则进行转换,并将转换后的URL地址重定向到内部的站点文件或外部的URL地址。
RewriteRule指令的基本格式如下:
RewriteRule Pattern Substitution [Flags]
# Pattern:用于匹配请求URL地址的正则表达式
# 可以是简单的字符串,也可以是正则表达式。
# Substitution:用于替换匹配的请求URL地址的字符串或URL地址
# 可以是一个本地文件路径,也可以是一个完整的URL地址。
# Flags:用于设置RewriteRule指令的参数,可以是一个或多个标记的组合。
# 例如,[R=301,L]表示进行301重定向并停止后续规则匹配。
使用案例
假设有一个网站,它的页面文件都是以.html为后缀名的,希望将所有页面的URL地址都去掉.html后缀。
RewriteEngine On
RewriteRule ^(.*)\.html$ $1 [L,R=301]
# ^(.*).html$表示匹配所有以.html结尾的URL地址
# $1表示替换字符串,表示将匹配到的URL地址中的.html去掉
# [L,R=301]表示当前是最后一个规则,进行301重定向。
# 打开网站的任意页面,并查看浏览器的地址栏,应该可以看到所有的.html后缀都被去掉了。
域名跳转
一个站点有时候会对应多个域名,当我们访问任何一个域名的时候都会跳转到其中指定好的一个域名,这个行为就叫做域名跳转
如果你是yum安装的apache 会自动开启重写模块(rewrite)
[root@apache-server ~]# httpd -M |grep rewrite
rewrite_module (shared)
# 如果要添加模块只需要在httpd.conf文件添加即可
[root@apache-server ~]# vim /etc/httpd/conf/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so
# 如果你添加的模块较多,可以在/etc/httpd/conf.modules.d/文件下创建一个.conf文件添加模块
单个域名跳转
[root@apache-server ~]# vim /etc/hosts
192.168.200.20 www.csq.lol
192.168.200.20 www.chenshiren.lol
192.168.200.20 www.csqweb.lol
[root@apache-server ~]# vim /etc/httpd/conf.d/ymtz.conf
<VirtualHost 192.168.200.20:80>
DocumentRoot /var/wwwcsq/ymtz
ServerAlias www.csq.lol
ServerName www.chenshiren.lol
<Directory /var/wwwcsq/ymtz>
AllowOverride None
Require all granted
</Directory>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.csq.lol$
RewriteRule ^/(.*)$ http://www.chenshiren.lol/$1 [R=301,L]
</VirtualHost>
[root@apache-server ~]# systemctl restart httpd
# 自行测试当访问 www.csq.lol时就会跳转到 www.chenshiren.lol
多个域名跳转
[root@apache-server ~]# vim /etc/httpd/conf.d/ymtz.conf
<VirtualHost 192.168.200.20:80>
DocumentRoot /var/wwwcsq/ymtz
ServerAlias www.csq.lol
ServerAlias www.csqweb.lol
ServerName www.chenshiren.lol
<Directory /var/wwwcsq/ymtz>
AllowOverride None
Require all granted
</Directory>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.csq.lol$ [OR]
RewriteCond %{HTTP_HOST} ^www.csqweb.lol$
RewriteRule ^/(.*)$ http://www.chenshiren.lol/$1 [R=301,L]
</VirtualHost>
[root@apache-server ~]# systemctl restart httpd
# 自行测试当访问 www.csq.lol和www.csqweb.lol时就会跳转到 www.chenshiren.lol
参数解释
当用户访问[www.csq.lol或者www.csqweb.lol时,服务器会将请求的URL地址重定向到www.chenshiren.lol域名下的相同URL地址。
RewriteEngine on
指令表示开启mod_rewrite模块
RewriteCond
指令用于设置条件,%{HTTP_HOST}表示HTTP请求头中的Host字段
^[www.csq.lol$和^www.csqweb.lol$
是用于匹配Host字段中的域名
[OR]
表示逻辑或的关系。
如果HTTP请求的Host字段中包含了指定的域名,则执行下面的RewriteRule指令。
RewriteRule
指令用于进行URL重写,^(.*)$
表示匹配任意的URL地址
$1
表示将匹配的URL地址作为参数传递给重定向后的URL地址。
[R=301,L]
表示使用301永久重定向,并且这是最后一个规则,不需要再进行后续的规则匹配。
status状态页
status状态页是Apache服务器自带的一个模块,用于显示当前Apache服务器的运行状态信息。
status状态页通常包括以下信息:
- Apache服务器的版本号
- 当前服务器的运行时间
- 服务器的负载情况,包括请求处理速度、请求连接数、进程数等等
- 正在处理的请求信息,包括请求URL地址、请求方法、请求状态等等
status状态页可以提供有用的信息,帮助管理员监控服务器的运行状况,但是由于安全性和隐私性等方面的考虑,通常情况下不会将status状态页公开提供给外部用户访问。
[root@apache-server ~]# vim /etc/httpd/conf.d/status.conf
<Location /server-status>
SetHandler server-status
<RequireAll>
Require ip 192.168.200.0/24
# 表示IP地址为192.168.200.0~192.168.200.255之间的所有IP地址
</RequireAll>
</Location>
[root@apache-server ~]# systemctl restart httpd
-
<Location /server-status>
:表示要限制的是status状态页的URL地址,即/server-status。 -
SetHandler server-status
:表示使用Apache自带的server-status处理程序来处理请求。 -
<RequireAll>
:表示需要同时满足所有的条件才能访问status状态页。 -
Require ip 192.168.200.0/24
:表示限制只有IP地址为192.168.200.0/24的用户才能访问status状态页。
访问
ip:80/server-status
apache日志分割
web服务器在长时间运行中,web服务产生的日志文件也会越来越大。如果不对日志文件进行分割管理,单个日志文件会变的非常大,不利用日志分析和管理。打开一个非常大的日志文件非常耗时间
日志分割两种方式
rotatelogs
apache自带的rotatelogs
案例
[root@apache-server ~]# vim /etc/httpd/conf/httpd.conf
# 注释下面的这两行
# ErrorLog "logs/error_log"
#CustomLog "logs/access_log" common
# 添加下面两行 86400为轮转的时间单位为秒,代表一天 -l指定了日志文件的前缀
ErrorLog "|/usr/sbin/rotatelogs -l logs/error_%Y%m%d.log 86400"
CustomLog "|/usr/sbin/rotatelogs -l logs/access_%Y%m%d.log 86400" combined
# 重启
[root@apache-server ~]# systemctl restart httpd
[root@apache-server ~]# ls /etc/httpd/logs/
access_20230624.log access_log error_20230624.log error_log
cronolog
Cronolog 是第三方日志轮循工具,可以用来将apache、tomcat等Web服务器输出的日志分成按日按月保存的文件
[root@apache-server ~]# yum install -y cronolog
案例:每天记录一个日志文件
[root@apache-server ~]# vim /etc/httpd/conf/httpd.conf
# 注释下面的这两行
#ErrorLog "logs/error_log"
#CustomLog "logs/access_log" common
# 添加下面两行
ErrorLog "|/usr/sbin/cronolog logs/error_%Y%m%d.log"
CustomLog "|usr/sbin/cronolog logs/access_%Y%m%d.log" common
# 重启
[root@apache-server ~]# systemctl restart httpd
[root@apache-server ~]# ls /etc/httpd/logs/
access_20230624.log error_20230624.log access_log error_log
案例:每小时一个日志文件
ErrorLog "|/usr/sbin/cronolog logs/error_%Y%m%d%H.log"
CustomLog "|usr/sbin/cronolog logs/access_%Y%m%d%H.log" common
# 重启
[root@apache-server ~]# systemctl restart httpd
[root@apache-server ~]# ls /etc/httpd/logs/
access_2023062415.log access_log error_2023062415.log error_log