admin
英语好啊,英语得学。--陈清泉
类目归类
# 注意:apache配置文件严格区分大小写
# 针对主机环境的基本配置参数
ServerRoot /usr/local/apache2 #apache主目录
Listen 80 #监听端口{Listen 192.168.88.10:80}
LoadModule php7 #加载的相关模块
User
Group #用户和组
ServerAdmin #管理员邮箱
ServerName #服务器名(没有域名解析时,使用临时解析。默认不开启)
ErrorLog "logs/error_log" #服务器错误日志
CustomLog "logs/access_log" common #访问记录日志
Include etc/extra/httpd-vhosts.conf #子配置文件中内容也会加载生效
# 主页目录及权限
DocumentRoot "/usr/local/apache2/htdocs"
#网页文件存放目录(默认)
<Directory "/usr/local/apache2/htdocs">
#定义指定目录的权限
Options Indexes FollowSymLinks
None #没有任何额外权限
All #所有权限(除去MultiViews以外)
Indexes #浏览权限(当此目录下没有默认网页文件时,显示目录内容)
FollowSymLinks #准许软链接到其他目录
MultiViews #准许文件名泛匹配(需要手动开启模块才有效negotiation)
AllowOverride None
#定义是否允许目录下.htaccess文件中的权限生效
None #.htaccess中权限不生效
All #文件中所有权限都生效
AuthConfig #文件中,只有网页认证的权限生效
Require all granted(denied) #访问控制列表
</Directory>
<IfModule dir_module> #此标签用来指定访问到指定目录时自动加载哪个页面文件
DirectoryIndex index.html index.php #可以写多个,但是有优先级之分
</IfModule>
# 一、性能优化
# 1. 调整 MPM(Multi-Processing Module)设置
# Apache 有不同的 MPM,可以选择适合高并发环境的 MPM。对于高并发的情况,推荐使用 event MPM。请确保在编译 Apache 时启用了 event MPM。
# 检查当前使用的 MPM
$ /usr/local/apache2/bin/httpd -V | grep MPM
# 如果您使用的是 prefork MPM,建议切换到 event MPM。可以在 Apache 的配置文件中添加或修改以下内容:
# 确保使用 event MPM
LoadModule mpm_event_module modules/mod_mpm_event.so
# 2. 配置 MPM 参数
对于 event MPM,您可以配置以下参数以提高性能:
<IfModule mpm_event_module>
ServerLimit 256
StartServers 10
MinSpareThreads 10
MaxSpareThreads 20
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 256
MaxConnectionsPerChild 1000
</IfModule>
# 参数解释:
ServerLimit: #允许的最大服务器进程数量。
StartServers: #启动时的服务器进程数量。
MinSpareThreads: #最小空闲线程数。
MaxSpareThreads: #最大空闲线程数。
ThreadLimit: #每个进程最大线程数。
ThreadsPerChild: #每个进程的线程数。
MaxRequestWorkers: #同时处理的请求数(并发连接数)。
MaxConnectionsPerChild: #每个进程服务的最大连接数,达到后将被回收。
# 3. 启用 KeepAlive
# 启用 KeepAlive 允许客户端在同一连接上发送多个请求,减少连接建立的开销。
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
# 参数解释:
MaxKeepAliveRequests: #每个连接允许的最大请求数。
KeepAliveTimeout: #保持连接的最长时间(秒)。
# 4. 压缩和缓存
# 启用压缩和缓存可以显著提高响应速度和减少带宽占用。
# 启用 mod_deflate 模块进行压缩:
LoadModule deflate_module modules/mod_deflate.so
# 在配置文件中添加以下内容
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript
</IfModule>
# 启用 mod_cache 模块进行页面缓存:
LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_cache_disk.so
# 在配置文件中添加以下内容
<IfModule mod_cache.c>
CacheRoot "/usr/local/apache/cache"
CacheEnable disk /
CacheDirLevels 5
CacheDirLength 3
</IfModule>
# 5. 限制请求大小
# 为了防止恶意请求和过大的请求造成资源耗尽,可以限制请求的大小。
LimitRequestBody 10485760 # 10 MB = 1024*1024*10
# LimitRequestBody 指令允许您设置一个最大值,以限制客户端请求体的大小(以字节为单位)。当客户端请求体超出这个限制时,Apache 将返回一个 413 Request Entity Too Large 的 HTTP 状态码,表示请求的实体过大,服务器无法处理;当前的设置为全局限制,可结合<Directory>标签实现指定对象限制。
# 注意:所有的配置修改,都需要重启 Apache 服务以应用配置
# 重启 Apache 服务
$ systemctl restart httpd
#--------------------------------------分割线----------------------------------------
# 二、性能测试和访问监控
# 优化配置后,建议使用工具测试 Apache 的性能,例如 ab(Apache Benchmark)或 htop,以评估当前配置的有效性。在高负载情况下,您可能需要根据监控结果进一步调整参数。
# 安装 Apache Benchmark 工具(如果未安装)
$ dnf install -y httpd-tools
# 进行压力测试
$ ab -n 1000 -c 100 https://example.com/index.php
# 您可以使用 mod_status 查看 Apache 的状态和活动连接,确保加载 mod_status 模块
LoadModule status_module modules/mod_status.so
# 在配置文件中添加以下内容
<Location "/server-status">
SetHandler server-status
Require all granted # 允许来自任意地址的请求
</Location>
# 访问 http://example.com/server-status?auto 可查看服务器状态。
在 Apache 中配置虚拟主机可以让您在同一台服务器上托管多个域名。每个域名可以独立配置,包括 Document Root、日志文件和其他设置。
# 虚拟主机实现方法:
# 基于IP地址的虚拟主机、基于端口的虚拟主机、基于域名的虚拟主机
# 在 Apache 配置目录中,您可以为每个域名创建单独的虚拟主机配置文件。假设我们要添加两个域名:`example.com` 和 `example.net`。
# 1. 进入 Apache 的配置目录:
$ cd /usr/local/lamp/apache/conf/
# 2. 创建虚拟主机配置文件(例如 `vhosts.conf`):
$ vim vhosts.conf
# 一般系统自带了,可以去子配置目录中找一下,会提供模板。
# 3. 在 `vhosts.conf` 文件中添加以下内容:
# 虚拟主机 1
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot "/usr/local/apache2/htdocs/example.com"
ErrorLog "/usr/local/apache2/logs/example.com-error.log"
CustomLog "/usr/local/apache2/logs/example.com-access.log" combined
</VirtualHost>
# 虚拟主机 2
<VirtualHost *:80>
ServerName example.net
ServerAlias www.example.net
DocumentRoot "/usr/local/apache2/htdocs/example.net"
ErrorLog "/usr/local/apache2/logs/example.net-error.log"
CustomLog "/usr/local/apache2/logs/example.net-access.log" combined
</VirtualHost>
# HTTPS 虚拟主机(如果需要)
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot "/usr/local/apache2/htdocs/example.com"
SSLEngine on
SSLCertificateFile "/usr/local/apache2/conf/ssl/server.crt"
SSLCertificateKeyFile "/usr/local/apache2/conf/ssl/server.key"
ErrorLog "/usr/local/apache2/logs/example.com-ssl-error.log"
CustomLog "/usr/local/apache2/logs/example.com-ssl-access.log" combined
</VirtualHost>
<VirtualHost *:443>
ServerName example.net
ServerAlias www.example.net
DocumentRoot "/usr/local/apache2/htdocs/example.net"
SSLEngine on
SSLCertificateFile "/usr/local/apache2/conf/ssl/server.crt"
SSLCertificateKeyFile "/usr/local/apache2/conf/ssl/server.key"
ErrorLog "/usr/local/apache2/logs/example.net-ssl-error.log"
CustomLog "/usr/local/apache2/logs/example.net-ssl-access.log" combined
</VirtualHost>
# 4. 创建网页根目录,为每个虚拟主机创建相应的网页根目录:
# 创建目录
$ mkdir -p /usr/local/apache2/htdocs/example.com/
$ mkdir -p /usr/local/apache2/htdocs/example.net/
# 创建测试文件
$ echo "<?php phpinfo(); ?>" | sudo tee /usr/local/apache2/htdocs/example.com/index.php
$ echo "<?php phpinfo(); ?>" | sudo tee /usr/local/apache2/htdocs/example.net/index.php
# 5. 修改主配置文件,启用虚拟主机配置
# 在 Apache 的主配置文件(`httpd.conf`)中,添加以下行以包含虚拟主机配置文件:
# 在 httpd.conf 末尾添加
Include conf/vhosts.conf
# 6. 重启 Apache 服务
$ sudo systemctl restart httpd
# 7. 更新 DNS 配置,windows下测试时可以借助hosts文件
# 确保将 `example.com` 和 `example.net` 的域名解析到您的服务器 IP。您可以使用域名注册商提供的 DNS 管理工具来添加 A 记录。
# 8. 验证虚拟主机配置
# 打开浏览器,并访问 `http://example.com` 和 `http://example.net`,您应该能够看到 PHP 信息页面。
# 检查 Apache 日志以确保没有错误:
$ tail -f /usr/local/apache2/logs/example.com-access.log
$ tail -f /usr/local/apache2/logs/example.net-access.log
# 查看错误日志
$ tail -f /usr/local/apache2/logs/example.com-error.log
$ tail -f /usr/local/apache2/logs/example.net-error.log
# 9. 总结
# 通过以上步骤,您已成功在 Apache 中配置了多个虚拟主机,支持多个域名的部署。这样可以有效地共享服务器资源,为不同的网站提供独立的配置和访问路径。
# 1. 生成自签名 SSL 证书:
# 创建证书存放目录
$ mkdir -p /usr/local/apache2/conf/ssl
$ cd /usr/local/apache2/conf/ssl
# 生成自签名证书
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt -subj "/C=CN/ST=Beijing/L=Beijing/O=Example/OU=IT/CN=example.com"
# 2. 配置 Apache 启用 SSL 和 HTTP/2:
# 编辑 Apache 配置文件
$ vim /usr/local/apache2/conf/httpd.conf
# 确保加载以下模块
LoadModule ssl_module modules/mod_ssl.so
LoadModule http2_module modules/mod_http2.so
# 配置 SSL 虚拟主机
<VirtualHost *:443>
ServerName example.com
DocumentRoot "/usr/local/apache2/htdocs"
SSLEngine on
SSLCertificateFile "/usr/local/apache2/conf/ssl/server.crt"
SSLCertificateKeyFile "/usr/local/apache2/conf/ssl/server.key"
Protocols h2 http/1.1
ErrorLog "/usr/local/apache2/logs/ssl_error_log"
CustomLog "/usr/local/apache2/logs/ssl_access_log" combined
</VirtualHost>
# 配置重定向
<VirtualHost *:80>
ServerName example.com
Redirect permanent / https://example.com/
</VirtualHost>
# 3. 效果验证
$ systemctl restart httpd
# 一个站点难免会有多个域名,而多个域名总得有一个主次,比如我的网站可以用两个域名访问:www.sina.com 和 www.sohu.cn 但大家发现不管我用哪个域名访问,最终都会跳转到www.sina.com 上来。这个行为就叫做域名跳转,状态码:301是永久跳转,302是临时跳转,网站上一定要设置为301,这样对搜索引擎是比较友好的。
实验条件:
1. 虚拟主机能正常访问
2. 打开主配置文件开启重写模块
LoadModule rewrite_module modules/mod_rewrite.so #取消注释
实验步骤:
# 修改虚拟主机配置文件
$ vi */extra/httpd-vhosts.conf
<Directory "/usr/local/apache2/htdocs/sohu">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# 创建规则匹配文件
$ vi */.htaccess
在指定的网站目录下创建文件,并添加以下内容
RewriteEngine on
# 开启rewrite功能
RewriteCond %{HTTP_HOST} ^www.sohu.com
# 把以www.sina.com 开头的内容赋值给HTTP_HOST变量
RewriteRule ^(.*)$ http://www.sina.com/$1 [R=permanent,L]
# ^(.*)$ 指代客户端要访问的资源
# $1 把 .* 所指代的内容赋值到$1变量中
# R=permanent 永久重定向 = 301
# L 指定该规则为最后一条生效的规则,以后的不再生效
# 重启服务器并测试
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
# 通过上述测试,发现无论是sina或sohu最终都是访问到www.sina.com域名上来则试验成功
# 端口跳转非常相似
# 强制跳转https:
<Directory "/usr/local/apache2/htdocs/bbs">
……
RewriteEngine on #开启转发规则
RewriteCond %{SERVER_PORT} !^443$ #检查访问端口只要目标不是443的
RewriteRule ^(.*)$ https://%{SERVER_NAME}$1 [R=301,L] #全都使用https重新访问
</Directory>
# 当apache接受请求时,在默认情况下会将DocumentRoot目录中的文件送到客户端,如果想将某一不在DocumentRoot目录中的文件共享到网站上,并希望将它们留在本来位置而不需要进行移动的话,处理这种情况可以通过建立别名的方式将URL指向特定的目录
# 编辑主配置文件
$ vim /usr/local/apache2/etc/httpd.conf
Include etc/extra/httpd-autoindex.conf
# 去掉注释,开启调用子配置文件
# 编辑子配置文件
$ vim /usr/local/apache2/etc/extra/httpd-autoindex.conf
alias /icons/ "/usr/local/apache2/icons/"
# 结构:别名 "真实目录" #真实目录的结尾要有/
<Directory "/usr/local/apache2/icons">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
# 可以根据模板编写一个自己需要的目录别名
# 有时候,我们需要给一些特殊的访问设置一个用户认证机制,增加安全。比如我们的个人网站,一般都是有一个管理后台的,虽然管理后台本身就有密码,但我们为了更加安全,可以再设置一层用户身份认证。
# 编辑配置文件
$ vim /usr/local/apache2/etc/httpd.conf
# 在需要进行登录认证的目录标签中加入如下配置:
<Directory "/usr/local/apache2/htdocs/typecho/admin"> #声明被保护目录
Options Indexes FollowSymLinks
AllowOverride All #开启权限认证文件.htaccess
Require all granted
</Directory>
# 在指定目录下创建权限文件
# 切换到/usr/local/apache2/htdocs/typecho/admin,创建 .htaccess文件,并添加下面的内容
$ vi .htaccess
AuthName "Welcome to kernel"
#提示信息
AuthType basic
#加密类型
AuthUserFile /usr/local/apache2/htdocs/typecho/admin/apache.passwd
#密码文件,文件名自定义。(使用绝对路径)
require valid-user
#允许密码文件中所有用户访问
# 建立密码文件,加入允许访问的用户。(此用户和系统用户无关)
$ htpasswd -c /usr/local/apache2/htdocs/typecho/admin/apache.passwd test1
-c 建立密码文件,只有添加第一个用户时,才能-c
$ htpasswd -m /usr/local/apache2/htdocs/typecho/admin/apache.passwd test2
-m 再添加更多用户时,使用-m 参数
# 注意: htpasswd 该命令是httpd的命令,需要绝对路径
# 重启apache服务
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
# 先检查配置是否正确,然后通过浏览器输入要访问的资源时就会提示输入密码了。
# 我们每访问一次网站,那么就会记录若干条日志。如果日志不去管理,时间长了日志文件会越来越大,如何避免产生大的日志文件?其实apache有相关的配置,使日志按照我们的需求进行归档,比如每天一个新日志,或者每小时一个新的日志。
# 首先简单设置日志的路径名称
$ vim /usr/local/apache2/etc/httpd.conf
# 编辑添加内容如下:
ErrorLog "logs/error.log"
CustomLog "logs/access.log" combined
# 指定了日志存放在/usr/local/apache2/logs目录下分别为error.log和access.log,combined为日志显示的格式,日志格式可以参考配置文件httpd.conf中格式的指定,如下:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
# 设置apache日志分割
# 同样编辑配置文件httpd.conf
ErrorLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/error_%Y%m%d.log 86400"
CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_%Y%m%d.log 86400" combined
注意1:以上仅为两条命令(一条错误日志,一条访问日志),路径太长写不开
注意2:若开启了https,则需要修改http-ssl.conf配置文件中的日志记录条目
ErrorLog是错误日志,CustomLog是访问日志。|就是管道符,意思是把产生的日志交给rotatelog这个工具,而这个工具就是apache自带的切割日志的工具。-l的作用是校准时区为UTC,也就是北京时间。86400,单位是秒,正好是一天,那么日志会每天切割一次。而最后面的combined为日志的格式,在httpd.conf中有定义。
# 如果一个网站访问量特别大,那么访问日志就会很多,但有一些访问日志我们其实是可以忽略掉的,比如网站的一些图片,还有js、css等静态对象。而这些文件的访问往往是巨量的,而且即使记录这些日志也没有什么用,那么如何忽略不记录这些日志呢?
# 配置日志不记录图片的访问
$ vim /usr/local/apache2/etc/httpd.conf
# 相关配置为:
SetEnvIf Request_URI ".*\.gif$" image-request
SetEnvIf Request_URI ".*\.jpg$" image-request
SetEnvIf Request_URI ".*\.png$" image-request
SetEnvIf Request_URI ".*\.bmp$" image-request
SetEnvIf Request_URI ".*\.swf$" image-request
SetEnvIf Request_URI ".*\.js$" image-request
SetEnvIf Request_URI ".*\.css$" image-request
CustomLog "|/usr/local ... _%Y%m%d.log 86400" combined env=!image-request
# 说明:在原来的访问日志配置基础上,增加了一些image-request的定义,比如把gif、jpg、bmp、swf、js、css等结尾的全标记为image-request,然后在配置日志后加一个标记env=!image-request,表示取反。
# 静态文件指的是图片、js、css等文件,用户访问一个站点,其实大多数元素都是图片、js、css等,这些静态文件其实是会被客户端的浏览器缓存到本地电脑上的,目的就是为了下次再请求时不再去服务器上下载,这样就加快了速度,提高了用户体验。但这些静态文件总不能一直缓存,它总有一些时效性,那么就得设置这个过期时间。
# 配置静态缓存
$ vim /usr/local/apache2/etc/httpd.conf
<IfModule mod_expires.c> #此模块默认未启用,请手动启用
ExpiresActive on
ExpiresByType image/gif "access plus 1 days"
ExpiresByType image/jpeg "access plus 24 hours"
ExpiresByType image/png "access plus 24 hours"
ExpiresByType text/css "now plus 2 hours"
ExpiresByType application/x-javascript "now plus 2 hours"
ExpiresByType application/javascript "now plus 2 hours"
ExpiresByType application/x-shockwave-flash "now plus 2 hours"
ExpiresDefault "now plus 0 min"
</IfModule>
或者使用 mod_headers 模块实现:该模块默认启用
<IfModule mod_headers.c>
# htm,html,txt 类的文件缓存一个小时
<filesmatch "\.(html|htm|txt)$">
header set cache-control "max-age=3600"
</filesmatch>
# css, js, swf 类的文件缓存一个星期
<filesmatch "\.(css|js|swf)$">
header set cache-control "max-age=604800"
</filesmatch>
# jpg,gif,jpeg,png,ico,flv,pdf 等文件缓存一年
<filesmatch "\.(ico|gif|jpg|jpeg|png|flv|pdf)$">
header set cache-control "max-age=29030400"
</filesmatch>
</IfModule>
# 说明:这里的时间单位可以 days、 hours 甚至是 min,两种不同的方法,上面使用的是mod_expires,而下面用的是 mod_headers,要想使用这些模块,必须要事先已经支持。如何查看是否支持,使用命令:
# /usr/local/apache2/bin/apachectl -M
# 重启服务器并验证
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
# 验证:
# curl 'http://www.sohu.com/image/a.jpg' -I
HTTP/1.1 200 OK
Date: Wed, 26 Oct 2016 03:51:26 GMT
Server: Apache/2.2.31 (Unix) PHP/5.5.38
Last-Modified: Tue, 31 May 2016 03:08:36 GMT
ETag: "46891b-16b-5341ab0597500"
Accept-Ranges: bytes
Content-Length: 363
Cache-Control: max-age=86400
Expires: Thu, 27 Oct 2016 03:51:26 GMT
Content-Type: image/jpg
点击
☰ 打开
我最帅,如果有人超过我的话,那应该就是川哥和超哥了
小伙子有前途