httpd 服务

URL 网址

浏览器中使用网址(URL,Uniform Resource Locator)来定位服务器中数据存放的位置并访问。URL 格式如下:<协议>://<主机地址或主机名>[:port]/<目录资源>。以斜线作为分段,各段解释如下:

  • 协议

    浏览器支持比较常见的协议有 http、https、ftp、telnet 等,还有不太常见的 news、gopher 等。如果服务器启用的是非标准端口,必须在主机地址后面写明。

  • 主机地址或主机名

    主机地址是服务器的 IP 地址,主机名是域名,通过 DNS 来解析成 IP。

  • 目录资源

    在 Apache 中默认将 html 文件存放在 /var/www/html/ 目录内。

传输数据方法

在 http 的服务端和客户端之间数据传递的基本方法有下面几种:

  • GET

    最常用的方法,浏览器直接向服务器请求网址上面的资源。使用 GET 方式可以直接在 URL 中输入变量。

  • POST

    客户端向服务端发送请求的方法。

  • HEAD

    服务端响应给客户端的一些数据头文件。

  • OPTIONS

    服务端响应给客户端一些允许的功能与方法。

  • DELETE

    删除某些资源的方法。

SSL 证书

SSL(Secure Socket Layer)是 HTTPS 使用的加密方式之一,和 SSH 一样使用非对称的密钥对,用对方的公钥加密数据后传输,以此保证数据在传输过程中的安全。

为了加强网络安全,提高网站信任等级,网站可以把生成的密钥通过第三方公证单位(CA,Certificate Authorities)注册,客户端的浏览器访问时可以自动比对 CA 单位注册时信息,确认证书是否正确有效。

LAMP 服务器安装

由于 Linux 上面 Apache 仅能提供最基本的静态网站支持,要想实现动态网站需要 PHP 和 MySQL 的支持。整个 LAMP 环境总共需要安装以下软件与模块:

  • httpd:提供 Apache 主程序。
  • mysql:MySQL 客户端程序。
  • mysql-server:MySQL 服务端程序。
  • php:PHP 主程序,包含给 Apache 使用的模块。
  • php-devel:PHP 开发工具,与 PHP 外挂的加速软件有关。
  • php-mysql:提供 PHP 程序读取 MySQL 数据库的模块。

整合安装如下:

[root@server2 ~]$ yum install -y httpd mysql mysql-server php php-mysql

相关配置目录

三个软件主要的配置文件路径。

Apache

在 Apache 中主要的配置文件或目录如下:

  • /etc/httpd/conf/httpd.conf

    httpd 最主要的配置文件,有时也会被拆成数个小文件分别管理不同参数。

  • /etc/httpd/conf.d/*.conf

    可以将自定义额外参数单独写成配置文件,放到 /etc/httpd/conf.d 目录下。在 httpd 启动时,这个文件内容就会被读入主要配置文件当中。

  • /usr/lib64/httpd/modules/,/etc/httpd/modules/

    Apache 支持很多外挂模块,PHP 和 SSL 都是 Apache 外挂的一种。所有要使用的模块文件默认放到以上目录中。

  • /var/www/html/

    默认存放 html 数据文件位置。

  • /var/www/error/

    当服务器设置错误或客户端请求的数据错误时,在浏览器上显示此目录下对应的错误页面。

  • /var/www/icons/

    存放一些 Apache 提供的小 icon 文件。

  • /var/www/cgi-bin/

    给一些可执行的 CGI 程序放置的目录。

  • /var/log/httpd/

    默认的 Apache 日志文件存放目录,需要注意用量大小。

MySQL

MySQL 相关的配置文件和目录有:

  • /etc/my.cnf

    MySQL 的配置文件,可以对 MySQL 数据库进行优化或指定额外的运行参数。

  • /var/lib/mysql/

    MySQL 数据库文件存放位置。

PHP

在 LAMP 环境中和 PHP 有关的配置和目录有:

  • /etc/httpd/conf.d/php.conf

    PHP 设置参数存放此文件中,在 Apache 重新启动时会被读取,因此不需要手动将 php 模块写入 httpd.conf 中。

  • /etc/php.ini

    PHP 的主要配置文件,包括是否允许用户上传,能否允许某些低安全性的标志等。

  • /usr/lib64/httpd/modules/libphp5.so

    PHP 提供给 Apache 使用的模块。

  • /etc/php.d/mysql.ini,/usr/lib64/php/modules/mysql.so

    PHP 操作 MySQL 使用的模块。

  • /usr/bin/phpize,/usr/include/php/

    安装 PHP 加速器所需文件。

Apache 配置文件

Apache 配置文件 /etc/httpd/conf/httpd.conf 中分以下几个部分。

服务器环境设置

针对服务器环境设置方面,包括主机名,服务器配置文件顶层目录等:

  • ServerRoot “/etc/httpd”

    服务器设置的最顶层目录,包括日志,模块等数据都放于此处(链接文件)。

  • ServerTokens OS

    告知客户端服务器的版本和操作系统,一般不需要设置。

  • PidFile run/httpd.pid

    设置 PID 文件路径。

  • Timeout 60

    发送或接受数据时的等待超时时间,一般不需要设置。

  • KeepAlive On

    是否允许持续性的连接,也就是一个 TCP 连接可以有多个文件传送请求,默认为 Off。

  • MaxKeepAliveRequests 500

    设置能够传输的最大传输数量,0 代表不限制。

  • KeepAliveTimeout 15

    在设置保持连接的条件下,连接在最后一次传输后等待延迟的秒数。

  • Listen 80

    默认监听 80 端口,也可以修改绑定网口或端口。

  • User apache,Group apache

    设置 httpd 进程启动的属主和属组。

  • ServerAdmin root@localhost

    设置管理员邮箱。

  • ServerName www1.example.com:80

    设置主机名。

目录相关设置

默认网页存放目录 /var/www/html 由 DocumentRoot 设置。需要注意 SELinux 相关规则和类型的正确性。

首页文件名由 <IfModule dir_module> 内的 DirectoryIndex 设置。文件读取由文件名参数顺序决定。

和目录有关的设置写在 <Directory> 段落内,主要有下面一些设置:

  • Options(目录参数)

    此设置值表示这个目录内能让 Apache 进行的操作,也就是震度 Apache 的程序权限设置。主要参数有:

    • Indexes: 如果找不到首页文件,便显示整个目录下的文件名。
    • FollowSymLinks: 让连接文件可以生效。
    • ExecCGI: 让此目录具有执行 CGI 程序的权限。
    • Includes: 让一些 Server-Side Include 程序可以运行。
    • MultiViews: 与多语言支持有关。
  • AllowOverride(允许覆盖参数)

    表示是否允许额外配置文件 .htaccess 的某些参数覆盖。常见参数有:

    • ALL: 所有权限均可被覆盖。
    • AuthConfig: 仅有网页认证账号可覆盖。
    • Indexes: 仅允许 Indexes 方面的覆盖。
    • Limits: 允许用户利用 Allow,Deny 与 Order 管理可浏览的权限。
    • None: 不可覆盖。

PHP 模块参数修改

PHP 模块配置文件位于 /etc/httpd/conf.d/php.conf,其内容不需要有任何修改,主要修改的是 PHP 配置文件 /etc/php.ini

  • log_errors = On, ignore_repeated_errors = Off, ignore_repeated_source = Off

    设置记录日志,忽略重复错误记录默认为 Off,可以设置为 On。

  • display_errors = Off, display_startup_errors = Off

    设置出现错误时,是否在浏览器上显示相关错误信息。debug 时可以设置为 On。

  • post_max_size = 8M, file_uploads = On, upload_max_filesize = 2M, memory_limit = 128M

    设置 PHP 程序上传文件大小限制和内存占用数值。

启动服务

使用 systemctl 直接启动 httpd,或者可以用 apache 自带的 apachectl 命令操作:

[root@server2 ~]$ systemctl enable --now httpd
[root@server2 ~]$ apachectl status

测试 PHP 模块是否驱动,可以建立一个 phpinfo.php 文件:

[root@server2 ~]$ echo '<?php phpinfo (); ?>' > /var/www/html/phpinfo.php

在浏览器中使用 http://192.168.2.254/phpinfo.php 地址访问,可以看到 PHP 版本等信息。

MySQL 需要手动启动,使用 mysql 命令测试连接:

[root@server2 ~]$ systemctl start mysqld
[root@server2 ~]$ mysqladmin -u root pass 'mypass'
[root@server2 ~]$ mysql -u root -p mypass

防火墙设置

iptables 放行 80 和 443 端口设置如下:

[root@server2 ~]$ iptables -A INPUT -p TCP -i ens33 --dport 80 --sport 1024:65534 -j ACCEPT
[root@server2 ~]$ iptables -A INPUT -p TCP -i ens33 --dport 443 --sport 1024:65534 -j ACCEPT

设置 SELinux 的放行规则:

[root@server2 ~]$ setsebool -P httpd_can_network_connect=1

新建一个网页文件后需要恢复 SELinux 类型:

[root@server2 ~]$ echo "HOME" > index.html
[root@server2 ~]$ mv index.html /var/www/html
[root@server2 ~]$ ll -Z /var/www/html/
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 index.html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 phpinfo.php
[root@server2 ~]$ restorecon -Rv /var/www/html/

基本身份认证

Apache 可以通过目录下的 .htaccess 文件来设置保护目录。首先建立目录和文件:

[root@server2 ~]$ mkdir /var/www/html/pro
[root@server2 ~]$ echo 'PROTECT!' > /var/www/html/pro/index.html

在主配置文件 /etc/httpd/conf/httpd.conf 中,增加一段配置:

[root@server2 ~]$ vi /etc/httpd/conf/httpd.conf
<Directory "/var/www/html/pro">
    AllowOverride AuthConfig
    Require all granted
</Directory>
[root@server2 ~]$ apachectl restart

/var/www/html/pro 目录下建立 .htaccess 文件:

[root@server2 httpd]$ vi /var/www/html/pro/.htaccess
AuthName        "protect test"
Authtype        Basic
AuthUserFile    /var/www/apache.passwd
require user user11

文件配置选项说明如下:

  • AuthName:出现在账号密码提示对话框中的内容。
  • AuthType:认证类型。
  • AuthUserFile:账号密码配置文件。
  • require:设置通行账号。可以设为 valid-user,即所有在 apache.passwd 内定义的用户都可以访问。

下面是建立账号密码文件。使用 htpasswd 命令加入账号 user11user12,密码为 passwd

[root@server2 ~]$ htpasswd -c /var/www/apache.passwd user11
New password: 
Re-type new password: 
Adding password for user user11
[root@server2 ~]$ htpasswd /var/www/apache.passwd user12
New password: 
Re-type new password: 
Adding password for user user12

在浏览器中输入地址 http://192.168.2.254/pro/ 测试。

虚拟主机设置

虚拟主机就是让多个主机名对应到不同的主网页目录(DocumentRoot 参数)。例如 ftp.hxz.asswww.hxz.ass 都指向 192.168.2.254,需要在 DNS 服务商网页设置好对应关系。

这里新建一个 ftp 目录,来对应 ftp.hxz.ass 域名:

[root@server2 ~]$ mkdir /var/www/ftp
[root@server2 ~]$ echo "FTPftp" > /var/www/ftp/index.html

配置对应的虚拟主机设置文件,然后重启 httpd 服务:

[root@server2 ~]$ vi /etc/httpd/conf.d/virtual.conf
<Directory "/var/www/ftp">
    AllowOverride None
    Require all granted
</Directory>

<VirtualHost *:80>
    ServerName www.hxz.ass
    DocumentRoot /var/www/html
</VirtualHost>
<VirtualHost *:80>
    ServerName ftp.hxz.ass
    DocumentRoot /var/www/ftp
    CustomLog /var/log/httpd/ftp.acess_log combined
</VirtualHost>
[root@server2 ~]$ systemctl restart httpd

上面使用 CustomLog 来指定写入日志的路径,这样可以更方便管理。

在客户端测试一下:

[root@server3 ~]$ curl www.hxz.ass
HOME
[root@server3 ~]$ wget ftp.hxz.ass
--2021-10-16 23:22:07--  http://ftp.hxz.ass/
Resolving ftp.hxz.ass (ftp.hxz.ass)... 10.1.1.1
Connecting to ftp.hxz.ass (ftp.hxz.ass)|10.1.1.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7 [text/html]
Saving to: 'index.html'

服务器测试

Apache 提供了一个叫做 ab 的程序来测试网站效率。例如指定 110 个同时连接,200 个每连接线程测试 phpinfo.php

[root@server2 ~]$ ab -dkS -c110 -n200 http://127.0.0.1/phpinfo.php
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 100 requests
Completed 200 requests
Finished 200 requests


Server Software:        Apache/2.4.6
Server Hostname:        127.0.0.1
Server Port:            80

Document Path:          /phpinfo.php
Document Length:        47649 bytes

Concurrency Level:      110
Time taken for tests:   0.070 seconds
Complete requests:      200
Failed requests:        17
   (Connect: 0, Receive: 0, Length: 17, Exceptions: 0)
Write errors:           0
Keep-Alive requests:    0
Total transferred:      9566380 bytes
HTML transferred:       9529780 bytes
Requests per second:    2863.57 [#/sec] (mean)
Time per request:       38.414 [ms] (mean)
Time per request:       0.349 [ms] (mean, across all concurrent requests)
Transfer rate:          133759.55 [Kbytes/sec] received

Connection Times (ms)
              min   avg   max
Connect:        0     3    8
Processing:    12    22   25
Total:         12    25   33

日志分析

Apache 日志文件有两个:/var/log/httpd/access_log/var/log/httpd/error_log

由于日志文件增速很快,所以需要修改 logrotatehttpd 配置文件,加入压缩功能:

[root@server2 ~]$ vi /etc/logrotate.d/httpd
/var/log/httpd/*log {
    missingok
    notifempty
    sharedscripts
    compress
    delaycompress
    postrotate
        /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
    endscript
}

日志文件分析软件可以使用 webalizer,软件配置文件位于 /etc/webalizer.conf,生成的图标位于 /var/www/usage

[root@server2 ~]$ yum install -y webalizer
[root@server2 ~]$ vi /etc/webalizer.conf
OutputDir      /var/www/html/pro/
[root@server2 ~]$ webalizer
Warning: Truncating oversized hostname
Skipping bad record (1)

之后就可以通过 http://192.168.2.254/pro/ 来访问了。

另外一个日志文件分析软件是 awstats,它采用 Perl 语言编写,所以需要 mod_perl 的支持:

[root@server2 ~]$ yum install -y awstats
[root@server2 ~]$ vi /etc/httpd/conf.d/awstats.conf 
<Directory "/usr/share/awstats/wwwroot">
    Options None
    AllowOverride AuthConfig
    <IfModule mod_authz_core.c>
        # Apache 2.4
        Require all granted
    </IfModule>
    <IfModule !mod_authz_core.c>
        # Apache 2.2
        Order allow,deny
        Allow from all
        Allow from ::1
    </IfModule>
</Directory>

配置文件中修改了 CGI 运行方式,网页认证,允许访问的客户端地址。另外还需要配置针对域名的配置文件:

[root@server2 ~]$ cp /etc/awstats/awstats.model.conf /etc/awstats/awstats.www.conf
[root@server2 ~]$ vi /etc/awstats/awstats.www.conf
SiteDomain="www.hxz.ass"

测试生成分析资料与访问账号:

[root@server2 ~]$ cd /usr/share/awstats/wwwroot/cgi-bin/
[root@server2 cgi-bin]$ ./awstats.pl now
[root@server2 wwwroot]$ vi /usr/share/awstats/wwwroot/.htaccess
AuthName        "awstats test"
Authtype        Basic
AuthUserFile    /var/www/apache.passwd
require         valid-user

之后浏览器通过 http://192.168.2.254/awstats/awstats.pl?config=www 并输入账号密码之后,就可以访问 awstats 的报表了。

HTTPS 加密

加密需要通过 mod_ssl 来进行,可以使用 yum 安装:

[root@server2 ~]$ yum install -y mod_ssl

安装好以后就可以通过浏览器访问 https://192.168.2.254/ 了。和 SSL 加密有关的文件如下:

  • /etc/httpd/conf.d/ssl.conf:软件 mode_ssl 提供的 Apache 配置文件。
  • /etc/pki/tls/private/localhost.key:系统私钥文件,可以用来制作证书。
  • /etc/pki/tls/certs/localhost.crt:加密过的证书文件。

如果要自建证书,例如建立一个名为 hxz.ass 的证书,步骤如下:

[root@server2 ~]$ cd /etc/pki/tls/certs/
[root@server2 certs]$ make my.key
[root@server2 certs]$ openssl rsa -in my.key -out hxz.ass.key
Enter pass phrase for my.key:
writing RSA key
[root@server2 certs]$ rm -rf my.key
[root@server2 certs]$ chmod 400 hxz.ass.key 
[root@server2 certs]$ make hxz.ass.crt SERIAL=20210101
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:CN
Locality Name (eg, city) [Default City]:CN
Organization Name (eg, company) [Default Company Ltd]:CN
Organizational Unit Name (eg, section) []:CN
Common Name (eg, your name or your server's hostname) []:www.hxz.ass
Email Address []:admin@hxz.ass
[root@server2 certs]$ ll hxz*
-rw-------. 1 root root 1379 Oct 17 04:08 hxz.ass.crt
-r--------. 1 root root 1679 Oct 17 04:06 hxz.ass.key

最终生成的证书是 hxz.ass.crt,对应私钥为 hxz.ass.key。其有效期为一年,如果想要十年,可以修改 make 脚本中的内容。

修改 ssl.conf 中证书和私钥的位置:

[root@server2 certs]$ vi /etc/httpd/conf.d/ssl.conf 
SSLCertificateFile /etc/pki/tls/certs/hxz.ass.crt
SSLCertificateKeyFile /etc/pki/tls/certs/hxz.ass.key

之后重启 httpd 服务,并在浏览器中刷新查看新的证书。