Apache服务器

Apache服务器

下图来自百度百科Apache服务器

image-20230623111723990

Apache是一个流行的开源Web服务器软件,它可以在各种操作系统上运行,包括Linux、Unix、Windows、macOS等。Apache可以处理静态和动态内容,支持多种编程语言和脚本,例如PHP、Perl、Python等。它还可以通过模块化的方式扩展功能
Apache的特点:

  • Apache可以处理静态和动态内容
  • 支持多种编程语言和脚本,例如PHP、Perl、Python等
  • 跨平台性:Apache可以在多种操作系统上运行,包括Windows、Linux、macOS等,具有很好的跨平台性。
  • 易于扩展:Apache支持多种扩展模块,用户可以根据需要选择适合自己的模块来扩展功能。

apache官网

httpd2.4官方文档

Linux安装Apache

Linux安装Apache的方式

  • 去官网获取源码包,进行源代码编译安装,扩展额外的功能,自定义安装路径
  • rpm包手动安装,需要自行解决依赖关系
  • 配置yum源,使用yum自动化安装,自动解决依赖关系

使用配置yum源的方法安装Apache

  1. 创建虚拟机

用VMware 创建一台虚拟机并开启

  1. 配置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
  1. 安装Apache(Linux的软件包httpd)
[root@apache-server ~]# yum  install -y httpd
  1. 检查是否启动了80端口
[root@apache-server ~]# yum install -y net-tools    # 安装
[root@apache-server ~]# netstat -tulnp |grep "80"   # 如果你没开启httpd的话肯定找不见80端口
  1. 启动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
  1. 放行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:
  1. 访问网页

打开浏览器输入自己的IP地址

image-20230623120549317

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

指定服务器日志的详细程度

如果想要了解日志相关可以参考:日志服务器等级

image-20230623165205373

  • <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指令用于定义日志格式,可以通过它来控制记录日志的内容和格式。定义了三种日志格式:combinedcommoncombinedio

<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

第三步:访问

image-20230623193843088

image-20230623195409761

启动用户的个人网站

每一台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
上一次登录:五 623 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

访问

image-20230624001424176

输入密码后,你就可以看到自己的私人主页了。不过你看到~了吧,不过这个~有点不好看,那么是否可以将网站设置成为:

  • 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
image-20230624182846747

虚拟主机的设定

什么是虚拟主机

所谓的虚拟主机,基本上就是"让你的一台服务器上面,有好多个'主网页'存在,也就是说,硬件实际上只有一台主机,但是由网站网址上来看,则似乎有多台主机存在的样子"。这就是虚拟主机的功能,它可以让你的主机名对应到不同的主网页目录(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

访问

image-20230624114359374

image-20230624114429226

基于域名的虚拟主机

配置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

访问

image-20230624121540700

基于端口的虚拟主机

创建网站数据目录

[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

访问

image-20230624124054639

image-20230624124103241

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

image-20230624170239239

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 
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值