
关闭 SELinux 和 iptables 防火墙
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
systemctl stop firewalld
systemctl disable firewalld
APACHE安装
安装编译工具和依赖软件包
yum -y install gcc gcc-c++ make libxml2-devel libxml2 libmcrypt mhash mcrypt zlib libpng apr-devel pcre-devel libpng-devel freetype openssl-devel libmcrypt-devel
安装httpd
tar -xf httpd-2.4.7.tar.gz
cd httpd-2.4.7/
需要把apr和apr-util 依赖包放到httpd的srclib目录中
rz apr-1.4.6
rz apr-util-1.4.1
tar xf apr-1.4.6.tar.gz
tar xf apr-util-1.4.1.tar.gz
mv apr-1.4.6 apr && mv apr httpd-2.4.7/srclib/
mv apr-util-1.4.1 apr-util && mv apr-util/ httpd-2.4.7/srclib/
configure
[root@localhost ~]# cd httpd-2.4.7/
./configure \
--prefix=/usr/local/apache2 \
--sysconfdir=/usr/local/apache2/etc \
--with-zlib \
--with-included-apr \
--with-pcre \
--enable-so \
--enable-deflate=shared \
--enable-expires=shared \
--enable-rewrite=shared \
--enable-static-support \
--enable-modules=most \
--enable-mpms-shared=all \
--enable-ssl \
--enable-cgi
编译安装
make -j4 && make install
启动测试
/usr/local/apache2/bin/apachectl start
curl 127.0.0.1
<html><body><h1>It works!</h1></body></html>
注意:在centos7下只监听了ipv6的地址,没有监听ipv4的端口,实测不加也没事
vim /usr/local/apache2/etc/httpd.conf
# 加入 Listen 0.0.0.0:80
Listen 80
Listen 0.0.0.0:80 // 在(Listen 80 )下加入这行
如遇以下警告信息
[root@localhost httpd-2.4.7]# /usr/local/apache2/bin/apachectl start
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
解决办法: 打开主配置文件 httpd.conf 搜索 ServerName (约在 200 行左右) 我这个2.4.7的版本是在192行
vim /usr/local/apache2/etc/httpd.conf
把这行
ServerName www.example.com:80
改为
ServerName localhost:80
检查语法,重启,不在会有警告了
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl restart
安装PHP
安装依赖包
yum -y install libjpeg-devel freetype-devel libevent-devel libtool-ltdl-devel
上传php源码包
[root@localhost ~]# rz php-7.0.7.tar.gz
tar -xf php-7.0.7.tar.gz
cd php-7.0.7/
configure命令
./configure \
--prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--with-apxs2=/usr/local/apache2/bin/apxs \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-libxml-dir \
--with-png-dir \
--with-jpeg-dir \
--with-freetype-dir \
--with-gd \
--with-zlib \
--with-mcrypt \
--enable-soap \
--enable-mysqlnd \
--enable-mbstring=all \
--enable-sockets \
--with-openssl
参数解释:
| 参数 | 分类 | 含义 | 状态/备注 |
|---|---|---|---|
--prefix=/usr/local/php |
安装路径 | PHP 安装的主目录 | ✅ 标准参数 |
--with-config-file-path=/usr/local/php/etc |
安装路径 | php.ini 配置文件存放目录 | ✅ 标准参数 |
--with-apxs2=/usr/local/apache2/bin/apxs |
Web服务器 | 编译 Apache 2 共享模块,指定 APXS 工具路径 | ✅ 标准参数 |
--with-mysqli=mysqlnd |
数据库 | 启用 MySQLi 扩展,使用原生驱动 | ✅ 标准参数 |
--with-pdo-mysql=mysqlnd |
数据库 | 启用 PDO MySQL 驱动,使用原生驱动 | ✅ 标准参数 |
--enable-mysqlnd |
数据库 | 启用 MySQL 原生驱动核心 | ✅ 标准参数 |
--with-gd |
图像处理 | 启用 GD 图像库 | ✅ 标准参数 |
--with-png-dir |
图像处理 | 启用 PNG 支持(自动检测路径) | ⚠️ PHP 7.4+ 废弃,建议改为 --with-png 或省略 |
--with-jpeg-dir |
图像处理 | 启用 JPEG 支持(自动检测路径) | ⚠️ PHP 7.4+ 废弃,建议改为 --with-jpeg 或省略 |
--with-freetype-dir |
图像处理 | 启用 FreeType 字体支持(自动检测路径) | ⚠️ PHP 7.4+ 废弃,建议改为 --with-freetype 或省略 |
--with-libxml-dir |
XML处理 | 启用 LibXML 支持(自动检测路径) | ⚠️ PHP 7.4+ 废弃,建议改为 --with-libxml 或省略 |
--with-zlib |
压缩 | 启用 Zlib 压缩库 | ✅ 标准参数 |
--with-mcrypt |
加密 | 启用 Mcrypt 加密库 | ❌ PHP 7.2+ 已移除,会产生错误 |
--with-openssl |
加密/SSL | 启用 OpenSSL 支持(HTTPS、加密算法) | ✅ 标准参数 |
--enable-soap |
协议 | 启用 SOAP Web Services 支持 | ✅ 标准参数 |
--enable-mbstring=all |
字符串处理 | 启用多字节字符串支持 | ⚠️ =all 语法过时,改为 --enable-mbstring |
--enable-sockets |
网络 | 启用 Socket 编程支持 | ✅ 标准参数 |
编译安装
make -j4 && make install
创建配置文件
mkdir /usr/local/php/etc # 如果有该目录就不创建了
cp php-7.0.7/php.ini-production /usr/local/php/etc/php.ini
修改 Apache配置文件,使其识别.php文件,并能通过php模块调用php进行页面解析
vim /usr/local/apache2/etc/httpd.conf
AddType application/x-httpd-php .php .phtml
AddType application/x-httpd-php-source .phps
添加位置如图:

重启apache服务
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
测试php页面是否能正常解析(即apache和php连通性)
cat > /usr/local/apache2/htdocs/test.php << 'EOF'
<?php
phpinfo();
?>
EOF
安装 phpMyAdmin
phpMyAdmin 是一个以 PHP 为基础,以 Web-Base 方式架构在网站主机上的 MySQL 的数据库管理工具,让管理者可用 Web 接口管理 MySQL 数据库。
tar -xf phpMyAdmin-4.1.4-all-languages.tar.gz
cp -a phpMyAdmin-4.1.4-all-languages /usr/local/apache2/htdocs/phpmyadmin
cd /usr/local/apache2/htdocs/phpmyadmin
cp -a config.sample.inc.php config.inc.php
vim config.inc.php
# 修改localhost为127.0.0.1
$cfg['Servers'][$i]['host'] = '127.0.0.1'; //用IP代替 localhost,避免socket问题无法登录
如图:

重启apache
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
安装数据库
yum install mariadb-server -y
systemctl start mariadb
mysql_secure_installation
systemctl restart mariadb
访问即可
http://192.168.3.71/phpmyadmin/index.php
设置apache开机自启动
vim /etc/rc.local
/usr/local/apache2/bin/apachectl start
列:部署typecho1.1博客网站
安装数据库
systemctl start mariadb
systemctl enable mariadb
mysql_secure_installation
systemctl restart mariadb
# 创建数据库
mysql -u root -p123456
create database typecho;
上传网站typecho
tar -xf typecho1.1-release.tar.gz
cp build/ /usr/local/apache2/htdocs/blog -r
设置daemon权限
setfacl -m u:daemon:rwx /usr/local/apache2/htdocs/blog
因为httpd服务是以root和daemon用户运行的,daemon需要有写权限才能安装网站

重启服务
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
浏览器访问安装即可
http://192.168.3.71/blog/install.php # 数据需要使用ip 不能用localhost
该网站的后台地址
http://192.168.3.51/blog/admin/
设置http的配置文件
vim /usr/local/apache2/etc/httpd.conf
添加一段blog的配置
<Directory "/usr/local/apache2/htdocs/blog">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
在DirectoryIndex中添加index.php
<IfModule dir_module>
DirectoryIndex index.html index.php # 添加为访问目录 会访问的文件index.php
</IfModule>
APACHE的配置

创建httpd命令软连接
ln -s /usr/local/apache2/bin/* /usr/local/bin/
查看httpd工作模式 Server MPM: worker
[root@localhost ~]# httpd -V | grep -i "server"
Server version: Apache/2.4.7 (Unix)
Server built: Feb 13 2026 11:07:18
Server's Module Magic Number: 20120211:27
Server loaded: APR 1.4.6, APR-UTIL 1.4.1
Server MPM: worker
Server compiled with....
-D SERVER_CONFIG_FILE="etc/httpd.conf"
相关文件保存位置
配置文件位置: 源码包安装: PREFIX/etc/httpd.conf(主配置文件) PREFIX/etc/extra/*.conf(子配置文件) rpm包安装: /etc/httpd/conf/httpd.conf
网页文件位置: 源码包安装: PREFIX/htdocs/ rpm包安装: /var/www/html/
日志文件位置: 源码包安装:PREFIX/logs/ rpm包安装:/var/log/httpd/
针对主机环境的基本配置参数
ServerRoot /usr/local/apache2 #apache主目录
Listen :80 #监听端口
LoadModule php7 #加载的相关模块
User
Group #用户和组
ServerAdmin #管理员邮箱
ServerName #服务器名(没有域名解析时,使用临时解析。默认不开启)
ErrorLog "logs/error_log" #服务器错误日志
CustomLog "logs/access_log" common #访问记录日志
DirectoryIndex index.html index.php #默认网页文件名,优先级顺序
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.php index.html #可以写多个,但是有优先级之分
</IfModule>
Apache 的目录别名
当 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 /a/ "/a/b/c/"
#结构:别名 "真实目录" #真实目录的结尾要有/ ,否则报错
<Directory "/a/b/c/">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
#可以根据模板编写一个自己需要的目录别名
--------------
创建目录重启服务
mkdir -p /a/b/c/ && echo "www.a.com" > /a/b/c/a.html
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl restart
访问测试

直接在httpd.conf中配置的话就在htdocs中创建目录,使用默认的htdocs目录
mkdir -p /usr/local/apache2/htdocs/abc
echo "www.abc.com" > /usr/local/apache2/htdocs/abc/abc.html
vim /usr/local/apache2/etc/httpd.conf
加入以下配置
<Directory "/usr/local/apache2/htdocs/abc">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>

Apache 的用户认证
有时候,我们需要给一些特殊的访问设置一个用户认证机制,增加安全。比如我们的个人网站,一般都是有一个管理后台的,虽然管理后台本身就有密码,但我们为了更加安全,可以再设置一层用户身 份认证。
创建网站目录和内容
cd /usr/local/apache2/htdocs/
mkdir admin && echo "www.admin.com" > admin/index.html
编辑配置文件
vim /usr/local/apache2/etc/httpd.conf
在需要进行登录认证的目录标签中加入如下配置:
<Directory "/usr/local/apache2/htdocs/admin">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
解释:
<Directory "/usr/local/apache2/htdocs/admin"> #声明被保护目录
AllowOverride All #开启权限认证文件.htaccess
在指定目录下创建权限文件
切换到/usr/local/apache2/htdocs/admin,创建 .htaccess文件,并添加下面的内容
cd /usr/local/apache2/htdocs/admin
vim .htaccess
AuthName "Welcome to apache"
#提示信息
AuthType basic
#加密类型
AuthUserFile /usr/local/apache2/htdocs/admin/apache.passwd
#密码文件,文件名自定义。(使用绝对路径)
require valid-user
#允许密码文件中所有用户访问
建立密码文件,加入允许访问的用户。(此用户和系统用户无关)
/usr/local/apache2/bin/htpasswd -c /usr/local/apache2/htdocs/admin/apache.passwd test1
#-c 建立密码文件,只有添加第一个用户时,才能-c
注意: 当有用户后再加入用户需要使用-m参数
/usr/local/apache2/bin/htpasswd -m /usr/local/apache2/htdocs/admin/apache.passwd test2
#-m 再添加更多用户时,使用-m 参数
注意: htpasswd 该命令是 httpd 的命令,需要绝对路径
重启 apache 服务
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl restart
先检查配置是否正确,然后通过浏览器输入要访问的资源时就会提示输入密码了。
访问测试:

虚拟主机
虚拟主机,也叫"网站空间",就是把一台运行在互联网上的物理服务器划分成多个"虚拟"服务器。虚拟主机技术极大的促进了网络技术的应用和普及。同时虚拟主机的租用服务也成了网络时代的一种新型经济形式。
基于 IP 的虚拟主机
给服务器增加IP(另一个域名解析出来的那个IP)
ifconfig ens33:1 192.168.3.72
创建网站目录和内容
mkdir /usr/local/apache2/htdocs/liuyanban
mkdir /usr/local/apache2/htdocs/bbs
echo "www.bbs.cn" > /usr/local/apache2/htdocs/bbs/index.html
echo "www.liuyanban.cn" > /usr/local/apache2/htdocs/liuyanban/index.html
创建虚拟主机配置文件
vim /usr/local/apache2/etc/extra/vhosts.conf
在httpd.conf主配置文件中引入建虚拟主机vhosts.conf配置文件
vim /usr/local/apache2/etc/httpd.conf
#文件最后添加一行
Include etc/extra/vhosts.conf
<VirtualHost 192.168.3.71:80>
ServerAdmin web@bbs-example.com
DocumentRoot /usr/local/apache2/htdocs/bbs/
ServerName www.bbs.com
ErrorLog logs/bbs-error_log
CustomLog logs/bbs-access_log common
</VirtualHost>
<VirtualHost 192.168.3.72:80>
ServerAdmin web@liuyanban-example.com
DocumentRoot /usr/local/apache2/htdocs/liuyanban/
ServerName www.liuyanban.com
ErrorLog logs/liuyanban-error_log
CustomLog logs/liuyanban-access_log common
</VirtualHost>
重启 apache 服务
/usr/local/apache2/bin/apachectl restart
curl访问测试
curl 192.168.3.71
www.bbs.cn
curl 192.168.3.72
www.liuyanban.cn
基于端口的虚拟主机
vim /usr/local/apache2/etc/extra/vhosts.conf
<VirtualHost 192.168.3.71:80>
ServerAdmin web@bbs-example.com
DocumentRoot /usr/local/apache2/htdocs/bbs/
ServerName www.bbs.com
ErrorLog logs/bbs-error_log
CustomLog logs/bbs-access_log common
</VirtualHost>
<VirtualHost 192.168.3.71:81>
ServerAdmin web@liuyanban-example.com
DocumentRoot /usr/local/apache2/htdocs/liuyanban/
ServerName www.liuyanban.com
ErrorLog logs/liuyanban-error_log
CustomLog logs/liuyanban-access_log common
</VirtualHost>
在httpd.conf主配置文件中引入建虚拟主机vhosts.conf配置文件
vim /usr/local/apache2/etc/httpd.conf
#文件最后添加一行
Include etc/extra/vhosts.conf
Listen 80 在此行下添加监听81 号端口
Listen 80
Listen 81 # 添加这行
重启 apache 服务
/usr/local/apache2/bin/apachectl restart
curl访问测试
curl 192.168.3.71
www.bbs.cn
curl 192.168.3.71:80
www.liuyanban.cn
基于域名的虚拟主机
域名解析:准备两个域名 <www.sohu.com> <www.sina.com> 使用本地 hosts 文件进行解析
echo "192.168.3.71 www.sohu.com" >> /etc/hosts
echo "192.168.3.71 www.sina.com" >> /etc/hosts
网站主页目录规划 在/htdocs/目录下分别创建 sohu 和 sina 两个目录,并在新建目录内创建 index.html 文件(分别写不一样的内容)
cd /usr/local/apache2/htdocs
mkdir sina && echo "sina" > sina/index.html
mkdir sohu && echo "sohu" > sohu/index.html
修改主配置文件开启文件关联
vim /usr/local/apache2/etc/httpd.conf
Include etc/extra/httpd-vhosts.conf #此行取消注释
编辑子配置文件,编写虚拟主机标签
vim /usr/local/apache2/etc/extra/httpd-vhosts.conf
*删掉原有的配置加入以下的内容*
-----sina的配置-------
#添加下方内容,有几个虚拟主机就写几组(添加之前先把原先存在的示例删除掉)
<Directory "/usr/local/apache2/htdocs/sina">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
<VirtualHost 192.168.3.71:80>
#管理员邮箱
ServerAdmin webmaster@sina.com
#网站主目录
DocumentRoot "/usr/local/apache2/htdocs/sina"
#完整域名
ServerName www.sina.com
#错误日志
ErrorLog "logs/sina-error_log"
#访问日志
CustomLog "logs/sina-access_log" common
</VirtualHost>
-----sina的配置-------
注意:写到配置文件的时候不能有注释,否则会报错。
绝对不要混用 具体IP:端口 和 *:端口
#----------------------------
| 配置方式 | 行为
| ----------- | ---------------------
| 一个用IP,一个用 * | IP优先匹配, *的虚拟主机可能永远用不上
| 都用相同IP | 按ServerName匹配,符合预期
| 都用 * | 按ServerName匹配,符合预期
#----------------------------
-----sohu的配置-------
<VirtualHost 192.168.3.71:80>
ServerAdmin webmaster@sohu.com
DocumentRoot "/usr/local/apache2/htdocs/sohu"
ServerName www.sohu.com
ErrorLog "logs/sohu-error_log"
CustomLog "logs/sohu-access_log" common
</VirtualHost>
<Directory "/usr/local/apache2/htdocs/sohu">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
-----sohu的配置-------
重启服务,验证结果
apachectl restart
Windows 下: 浏览器下输入两个不同的域名验证网页内容(提前修改 windows 的 hosts 文件)
C:\Windows\System32\drivers\etc
Linux 下: 通过 elinks/curl 命令验证:elinks/curl URL 地址(提前修改 windows 的 hosts 文件)
访问测试:
curl www.sina.com
sina
curl www.sohu.com
sohu
域名跳转
一个站点难免会有多个域名,而多个域名总得有一个主次,比如我的网站可以用两个域名访问:<www.sina.com> 和 <www.sohu.cn> 但大家发现不管我用哪个域名访问,最终都会跳转到 <www.sina.com> 上来。这个行为就叫做域名跳转,状态码:301 是永久跳转,302 是临时跳转,网站上一定要设置为 301,这样对搜索引擎是比较友好的。实验条件:
-
虚拟主机能正常访问( 完成上面的 基于域名的虚拟主机实验 )
-
打开主配置文件开启重写模块
vim /usr/local/apache2/etc/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so #取消注释
取消这行的注释,如图:

修改虚拟主机配置文件
vim /usr/local/apache2/etc/extra/httpd-vhosts.conf
# 在实验 虚拟主机的基础上 加入 以下内容 实现访问sohu跳转sina
<Directory "/usr/local/apache2/htdocs/sohu">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
创建规则匹配文件
vim /usr/local/apache2/htdocs/sohu/.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 指定该规则为最后一条生效的规则,以后的不再生效
重启服务器并测试
apachectl -t
apachectl restart
通过上述测试,发现无论是 sina 或 sohu 最终都是访问到 <www.sina.com> 域名上来则试验成功
curl www.sina.com
sina
curl www.sohu.com
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.sina.com/">here</a>.</p>
</body></html>
Apache+openssl 实现 https
HTTPS(全称:Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的 HTTP通道,简单讲是 HTTP 的安全版。即 HTTP 下加入 SSL 层,用于安全的 HTTP 数据传输。这个系统被内置于浏览器中,提供了身份验证与加密通讯方法。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。
准备工作 检查 Apache 是否支持 SSL,检查相应模块是否安装,若安装则将模块启用模块存放目录:/usr/local/apache2/modules
检查模块是否启用
[root@localhost ~]# apachectl -M | grep ssl
ssl_module (shared)
CA 证书申请
[root@localhost ~]$ cd /usr/local/apache2/
[root@localhost apache2]# mkdir cert && cd cert
[root@localhost cert]# openssl genrsa -out ca.key 2048
#建立服务器私钥,生成 RSA 密钥
[root@localhost cert]# openssl req -new -key ca.key -out demo.csr
#需要依次输入国家,地区,城市,组织,组织单位,Email 等信息。最重要的是有一个 common name,可以写你的名字或者域名。如果为了 https 申请,这个必须和域名吻合,否则会引发浏览器警报。生成的 csr 文件交给 CA 签名后形成服务端自己的证书
CN
BJ
BJ
atguigu
yjs
www.atguigu.com
zhangsan@qq.com
[root@localhost ~]$ openssl x509 -req -days 365 -sha256 -in demo.csr -signkey ca.key -out demo.crt
#使用 CA 服务器签发证书,设置证书的有效期等信息
注意 1:生成完秘钥和证书文件后,将文件存放在 Apache 的安装目录下的 cert 目录下 注意 2:在生产环境中必须要在 https证书厂商注册(否则浏览器不识别)
配置文件修改 调用 ssl 模块,并启用 ssl 独立配置文件
[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.conf
LoadModule ssl_module modules/mod_ssl.so #取消注释
Include etc/extra/httpd-ssl.conf #取消注释
如图:


修改 extra/httpd-ssl.conf 配置文件,调用证书等文件
[root@localhost ~]$ vim /usr/local/apache2/etc/extra/httpd-ssl.conf
#添加 SSL 协议支持协议
SSLProtocol all -SSLv2 -SSLv3
#修改加密套件
# SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5 //注释这行 改为下面的
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
SSLHonorCipherOrder on //放开这行的注释
#证书公钥配置(签字的)
SSLCertificateFile cert/demo.crt //修改为自己的crt文件
#证书私钥配置
SSLCertificateKeyFile cert/ca.key //修改为自己的key文件
修改主配置文件,添加虚拟主机
[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.conf
<VirtualHost _default_:443>
# DocumentRoot 目录位置要和 httpd.conf 里面的一致
DocumentRoot "/usr/local/apache2/htdocs"
ServerName localhost:443
SSLCertificateFile cert/demo.crt
SSLCertificateKeyFile cert/ca.key
SSLCertificateChainFile cert/demo.crt
</VirtualHost>
结果验证
[root@localhost ~]$ apachectl -t #检查配置文件语法
[root@localhost ~]$ apachectl restart #重启 apache,并测试是否可以使用 https 访问
报错提示: AH00526: Syntax error on line 78 of /usr/local/apache2/etc/extra/httpd-ssl.conf:SSLSessionCache: 'shmcb' session cache not supported (known names: ). Maybe you need to load the appropriate socache module (mod_socache_shmcb?).
让调用的模块加载上
[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.conf
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
#取消注释即可
重启即可
apachectl restart
强制跳转 https
有些时候为了安全,网站不允许使用 http 访问,仅允许使用 https 访问,目的是为了更加安全在 http 部分的目录权限标签中添加一下内容
[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.conf
<Directory "/usr/local/apache2/htdocs">
# .......
RewriteEngine on #开启转发规则
RewriteCond %{SERVER_PORT} !^443$ #检查访问端口只要目标不是443的
RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [R=301,L] #全都使用https重新访问
</Directory>
Apache 日志切割
我们每访问一次网站,那么就会记录若干条日志。如果日志不去管理,时间长了日志文件会越来越大,如何避免产生大的日志文件?其实 apache 有相关的配置,使日志按照我们的需求进行归档,比如每天一个新日志,或者每小时一个新的日志。
首先简单设置日志的路径名称
[root@localhost ~]$ 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 日志分割
[root@localhost ~]$ vim /usr/local/apache2/etc/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 配置文件中的日志记录条目
[root@localhost ~]$ apachectl -t
[root@localhost ~]$ apachectl restart
ErrorLog 是错误日志,CustomLog 是访问日志。|就是管道符,意思是把产生的日志交给 rotatelog这个工具,而这个工具就是 apache 自带的切割日志的工具。-l 的作用是校准时区为 UTC,也就是北京时间。86400,单位是秒,正好是一天,那么日志会每天切割一次。而最后面的 combined 为日志的格式,在 httpd.conf 中有定义
不记录指定文件类型的日志
如果一个网站访问量特别大,那么访问日志就会很多,但有一些访问日志我们其实是可以忽略掉的,比如网站的一些图片,还有 js、css 等静态对象。而这些文件的访问往往是巨量的,而且即使记录这些日志也没有什么用,那么如何忽略不记录这些日志呢?
配置日志不记录图片的访问
[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.conf
<Directory "/usr/local/apache2/htdocs">
#相关配置为:
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
</Directory>
CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_%Y%m%d.log 86400" common env=!image-request
[root@localhost ~]$ apachectl -t
[root@localhost ~]$ apachectl restart
说明: 在原来的访问日志配置基础上,增加了一些 image-request 的定义,比如把 gif、jpg、bmp、swf、js、css 等结尾的全标记为 image-request,然后在配置日志后加一个标记 env=!image-request,表示取反。
Apache 配置静态缓存
所说的静态文件指的是图片、js、css 等文件,用户访问一个站点,其实大多数元素都是图片、js、css 等,这些静态文件其实是会被客户端的浏览器缓存到本地电脑上的,目的就是为了下次再请求时不再去服务器上下载,这样就加快了速度,提高了用户体验。但这些静态文件总不能一直缓存,它总有一些时效性,那么就得设置这个过期时间。
配置静态缓存
[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.conf
LoadModule expires_module modules/mod_expires.so #取消注释,启用模块
<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 模块实现:该模块默认启用
[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.conf
#直接添加即可
<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 | grep expires_module
/usr/local/apache2/bin/apachectl -M | grep headers_module
验证配置文件并重启服务
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
验证
上传a.jpg图片到htdos下
[root@localhost ~]# ls /usr/local/apache2/htdocs/a.jpg
/usr/local/apache2/htdocs/a.jpg
[root@localhost ~]$ curl -x192.168.3.71:80 'http://192.168.3.71/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
Apache 禁止解析 PHP
某个目录下禁止解析 PHP,这个很有作用,我们做网站安全的时候,这个用的很多,比如某些目录可以上传文件,为了避免上传的文件有木马,所以我们禁止这个目录下面的访问解析 PHP。
[root@localhost ~]$ mkdir /usr/local/apache2/htdocs/data && echo "<?php echo 'hello';" > /usr/local/apache2/htdocs/data/a.php
[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.conf
#直接添加即可
<Directory /usr/local/apache2/htdocs/data>
php_admin_flag engine off
<filesmatch "(.*)php">
Order deny,allow
Deny from all
</filesmatch>
</Directory>
验证配置文件并重启服务
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
访问测试

IP访问权限控制
例:允许192.168.3.0/24访问
创建网站目录 写入网站内容
mkdir -p /usr/local/apache2/htdocs/internal
echo "www.internal-web.com" > /usr/local/apache2/htdocs/internal/index.html
创建httpd-auth.conf配置文件
vim /usr/local/apache2/etc/extra/httpd-auth.conf
写入以下内容
<VirtualHost 192.168.3.71:80>
ServerName www.internal.com
DocumentRoot /usr/local/apache2/htdocs/internal
# 日志配置
ErrorLog /usr/local/apache2/logs/internal-error.log
CustomLog /usr/local/apache2/logs/internal-access.log combined
<Directory "/usr/local/apache2/htdocs/internal">
Options -Indexes +FollowSymLinks
AllowOverride None
# 启用必要的模块
<IfModule mod_authz_core.c>
# 允许3网段访问
Require ip 192.168.3.0/24
# 本地回环
Require ip 127.0.0.1
Require ip ::1
# 拒绝其他所有
Require all denied
</IfModule>
</Directory>
</VirtualHost>
编辑主配置文件
vim /usr/local/apache2/etc/httpd.conf
# 最后添加一行 引用httpd-auth.conf配置
Include etc/extra/httpd-auth.conf
重启apache服务
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
非ip允许的网段主机访问测试 403 Forbidden

