美文网首页
Linux - 02-Apache

Linux - 02-Apache

作者: 找呀找提莫 | 来源:发表于2020-03-06 13:26 被阅读0次

[toc]

1 Apache的特点

2 Apache的应用场合

  • 使用Apache云行静态HTML页、图片(处理静态小文件能力不及Nginx);
  • 使用Apache结合PHP引擎运行PHP、Perl等程序,LAMP被称为经典组合;
  • 使用Apache结合Tomcate、Resin运行JSP、JAVA等程序,称为中小企业的首选;
  • 使用Apache作代理、负载均衡、rewrite规则过滤等等。

3 源码安装Apache

3.1 下载和校验

[root@localhost tools]# wget http://archive.apache.org/dist/httpd/httpd-2.2.22.tar.gz

从另外的站点下载MD5校验文件:
[root@localhost tools]# wget http://archive.apache.org/dist/httpd/httpd-2.2.22.tar.gz.md5

校验文件

[root@localhost tools]# cat httpd-2.2.22.tar.gz.md5 
d77fa5af23df96a8af68ea8114fa6ce1 *httpd-2.2.22.tar.gz

[root@localhost tools]# md5sum httpd-2.2.22.tar.gz
d77fa5af23df96a8af68ea8114fa6ce1  httpd-2.2.22.tar.gz

结果一致可以说明下载的文件包没问题

3.2 安装Apache

3.2.1 安装编译器

yum install -y gcc

3.2.2 源码编译安装Apache2.2

[root@localhost ~]# cd httpd-2.2.22/

[root@localhost httpd-2.2.22]# ./configure \
 --prefix=/usr/local/apache2.2.22 \
 --enable-deflate \
 --enable-expires \
 --enable-headers \
 --enable-modules=most \
 --enable-so \
 --with-mpm=worker \
 --enable-rewrite
 
 [root@localhost httpd-2.2.22]# make $$ make install
 
 [root@localhost httpd-2.2.22]# ln -s /usr/local/apache2.2.22/ /usr/local/apache
 

参数解释:

  • --prefix=/usr/local/apache2.2.22 表示制定apache安装路径为/usr/local/apache2.2.22;如果不指定安装路径,则默认安装路径为/usr/local/apache2;
  • --enable-deflate 提供对内容的压缩传输编码支持,一般html、js、css等内容的站点,使用此参数功能会大大提高传输速度,提升访问者访问体验;在生产环境中,这是一个重要的调优参数;
  • --enable-expires 激活允许通过配置文件控制HTTP的 "Exprise:" 和 "Cache-Control"头内容,即对网站图片、js、css等内容,提供在客户端浏览器的缓存设置;在生产环境中,这是一个重要的调优参数;
  • --enable-headers 提供允许对HTTP请求头的控制;
  • --enable-modules=most
  • --enable-so 激活apache服务的DSO(全称Dynamix Shared Object,动态共享对象)支持,即在以后可以以DSO的方式编译安装共享模块,这个模块本身不能以DSO方式编译;
  • --with-mpm=worker 选择apache mpm的模式作为worker模式,因为worker模式是更过的使用多线程来处理请求,所以可以处理更多的并发请求,而系统资源的开销小于基于进程的MPMpreforl;如果不指定此参数,默认的模式是prefork模式;在生产环境中,这是一个重要的调优参数;
  • --enable-rewrite 提供基于URL规则的重写;即根据已知URL地址,转换其他想要的URL地址。伪静态网页就是这个模块实现的。在生产环境中,这是必须要用的重要功能;

另外:

  • 在安装apache时,如果忘记以上模块,可以之后通过dso的方式编译安装;
  • 以上参数不是必须的,只是参考参数;比如prefork模式,虽然消耗资源,但是更稳定,因此选择prefork的模式而不选择worker也是可取的。

报错处理:

编译报错:
configure: error: mod_deflate has been requested but can not be built due to prerequisite failures

解决方法:
yum install -y zlib-devel

3.2.3 检查apache编译安装情况

[root@localhost httpd-2.2.22]# cd /usr/local/apache

查看编译内容:
[root@localhost apache]# ./bin/apachectl -l

列出基于当前配置加载的所有模块:
[root@localhost apache]# ./bin/apachectl -M
httpd: Could not reliably determine the server's fully qualified domain name, using 192.168.23.131 for ServerName
Loaded Modules:
 core_module (static)
 authn_file_module (static)
 authn_dbm_module (static)
 authn_anon_module (static)
 authn_dbd_module (static)
...
    static代表是静态的编译安装,使用mod_so加载的是动态的;
    
启动、停止、重启
./bin/apachectl [start | stop | restart]
    apachectl会去调用 bin/httpd 脚本
查询
[root@localhost apache]# netstat -ntl | grep :80
tcp6       0      0 :::80                   :::*                    LISTEN

[root@localhost apache]# lsof -i tcp:80

3.3 apache配置

3.3.1 apache目录结构

[root@localhost apache2.2.22]# tree
.
├── bin
│   ├── ab              # apache http 服务器性能测试工具;同类软件还有jmeter、loadrunner、webbench;
│   ├── apachectl       # apache启动命令;
│   ├── apxs            # apxs 是一个作为apache HTTP 服务器编译和安装扩展模块的工具,在进行DSO方式模块编译时会用到;
                        # 在编译php时,会用到:--with-apxs2=/usr/local/apache/bin/apxs
│   ├── htcacheclean    # 清理磁盘缓冲区的命令,需要在编译时制定相关参数才能使用;一般很少使用;
│   ├── htpasswd        # 建立和更新基本认证文件;配置nagios时会用到;
│   ├── httpd           # 时papche的控制命令程序,apachectl 执行时会调用 httpd
│   └── rotatelogs      # apache 自带的日志轮询命令;
├── conf
│   ├── extra           # 额外的 Apache 配置文件目录,例如:虚拟主机的配置文件 httpd-vhosts.conf
│   ├── httpd.conf      # Apache 的主配置文件
│   ├── magic
│   ├── mime.types
│   └── original
├── error
├── htdocs              # 这是编译安装时 apache 的默认站点目录
│   └── index.html      # 默认的文件首页
├── icons
├── include
├── lib
├── logs
│   ├── access_log      # Apache 的默认访问日志文件
│   ├── cgisock.1270
│   ├── error_log       # Apache 的错误日志文件
│   └── httpd.pid       # HTTP 服务的pid文件,httpd进程启动后,会把主进程的ID号写到此文件
├── man
├── manual
└── modules             # Apache 的模块目录,比如 php、memcache 等模块编译后都在这里

3.3.2 httpd.conf

     1  ServerRoot "/usr/local/apache2.2.22"        # Apache 的根目录,应只能 root 访问
     2  Listen 80        # Apache 监听的端口;
                         # 默认为80端口,如果同时监控81端口,可以增加一行 Listen 81
     3  <IfModule !mpm_netware_module>
     4  <IfModule !mpm_winnt_module>
     5  User daemon          # Apache 的用户,默认为 daemon,建议修改下
     6  Group daemon         # Apache 的用户组,默认为 daemon,建议修改下
     7  </IfModule>
     8  </IfModule>
     9  ServerAdmin you@example.com     # 系统管理员的信箱,当网站出现故障时,页面会显示该邮箱
    10  DocumentRoot "/usr/local/apache2.2.22/htdocs"   # Apache 的默认 web 站点目录路径结尾不要添加斜线
    11  <Directory />                   # 这将禁止访问文件系统所在的目录,并添加你希望允许访问的目录块
    12      Options FollowSymLinks      # FollowSymLinks 表示允许使用符号链接,没加的选项默认为禁用
    13      AllowOverride None          # 表示禁止用户对目录配置文件(.htaccess进行修改)重载,普通站点目录此项建议不开
    14      Order deny,allow            # 以 deny 方式优先处理,没有明确说明拒绝的话都将通过,即允许未被明确决绝的访问(从后往前读);
    15      Deny from all               # 明确指出,拒绝所有访问;
    16  </Directory>
    17  <Directory "/usr/local/apache2.2.22/htdocs">    # 设置 /usr/local/apache2.2.22/htdocs 目录权限
    18      Options Indexes FollowSymLinks      # FollowSymLinks 表示禁止使用符号链接
                                                # Indexes 表示允许目录浏览
                            # 这很危险,应改为 Options -Indexes FollowSymLinks 或 Options FollowSymLinks 取消目录列表(浏览)功能;
    19      AllowOverride None          # 表示禁止用户读目录配置文件(.htaccess进行修改)重载,不建议开启;
                                        # 有时开发在这里会有需求,一般禁止,又SA来控制这里;
    20      Order allow,deny            # 以 allow 方式优先处理,没有明确说明允许的话都将拒绝访问,即拒绝未被明确允许的;
    21      Allow from all              # 允许所有的访问,因为是提供给所有人的 web 访问服务,所以此处权限要开放;
    22  </Directory>
    23  <IfModule dir_module>
    24      DirectoryIndex index.html   # 配置默认的 Apache 首页文件,如虚拟主机没有此配置项,默认应用这里的配置;
                                        # 首页文件可以有多个,每个文件用空格分开,调用时,优先匹配靠前的文件;
    25  </IfModule>
    26  <FilesMatch "^\.ht">            # 防止 .htaccess 和 .htpasswd 等重要的隐藏文件被 web 用户查看;
    27      Order allow,deny
    28      Deny from all
    29      Satisfy All
    30  </FilesMatch>
    31  ErrorLog "logs/error_log"       # 错误日志路径 logs 为 Apache 安装目录的相对路径;
    32  LogLevel warn
    33  <IfModule log_config_module>
    34      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined   # 访问日志的格式
    35      LogFormat "%h %l %u %t \"%r\" %>s %b" common        # 普通访问日志格式
    36      <IfModule logio_module>
    37        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    38      </IfModule>
    39      CustomLog "logs/access_log" common      # 默认站点访问日志配置
    40  </IfModule>
    41  <IfModule alias_module>
    42      ScriptAlias /cgi-bin/ "/usr/local/apache2.2.22/cgi-bin/"        # 配置 cgi 别名
    43  </IfModule>
    44  <IfModule cgid_module>
    45  </IfModule>
    46  <Directory "/usr/local/apache2.2.22/cgi-bin">           # 允许 cgi 路径访问
    47      AllowOverride None
    48      Options None
    49      Order allow,deny
    50      Allow from all
    51  </Directory>
    52  DefaultType text/plain              # DefaultType:定义当不确定 MIME 类型时服务器提供的默认 MIME 类型;
                                            # 如果你的服务主要包含 test 或 HTML 文档,“text/plain” 是一个好的选择;
    53  <IfModule mime_module>
    54      TypesConfig conf/mime.types
    55      AddType application/x-compress .Z   # AddEncoding 允许你在信息传送中使用(Mosaic/X 2.1+)解压信息
                                                # 注意不是所有的浏览器都支持这个选项。
    56      AddType application/x-gzip .gz .tgz
    57  </IfModule>
    58  <IfModule ssl_module>
    59  SSLRandomSeed startup builtin
    60  SSLRandomSeed connect builtin
    61  </IfModule>

启动时报错:
httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName
原因:
配置文件中ServerName项没有配置,不会影响httpd服务启动,一般配置为 127.0.0.1:80

4 apache应用

4.1 虚拟主机

开启虚拟主机配置

1. 备份配置文件
[root@localhost apache]# cp conf/httpd.conf conf/httpd.conf.ray.20180421

2. vim conf/httpd.conf
395 # Virtual hosts
396 Include conf/extra/httpd-vhosts.conf

4.1.1 基于域名的虚拟主机

[root@localhost apache]# pwd
/usr/local/apache

备份配置文件
[root@localhost apache]# cp conf/extra/httpd-vhosts.conf conf/extra/httpd-vhosts.conf.ray.20180421


[root@localhost apache]# vim conf/extra/httpd-vhosts.conf
  1 NameVirtualHost *:80        # 这里表示使用基于域名的虚拟主机配置,这是产品环境下最常用的配置;
                                # *:80 中的 * 表示监听本机所有IP地址,80 表示在80端口上提供http服务;
                                # 如果改 * 为具体IP ,表示监听本机指定IP地址的服务请求;
  2 <VirtualHost *:80>                          # 定义一个虚拟主机,监听本机所有IP地址80端口上提供的http服务请求; 
  3     ServerAdmin wangkuncoin@163.com         # 配置管理员的邮箱
  4     DocumentRoot "/var/www/blog"            # 提供服务器的程序目录,保存网页代码的位置
  5     ServerName blog.coin.org                # 配置提供服务的域名,如果是生产环境,需要把该域名解析到服务器上配置的外网VIP或IP上;
                                                # 如果是测试环境,在本机做hosts即可;
  6     ServerAlias coin.org                    # 配置虚拟主机别名,比如输入coin.org,也会响应blog.coin.org;
                                                # 多个别名可以使用空格隔开;
                                                # 此功能需要apache_mod_alias模块支持,默认会安装该模块;
  7     ErrorLog "logs/blog.coin.org-error_log"             # 错误日志输出位置
  8     CustomLog "logs/blog.coin.org-access_log" common    # 访问日志输出位置
  9 
 10     <Directory "/var/www/blog">
 11         Options -Indexes FollowSymLinks
 12         AllowOverride None
 13         Order allow,deny
 14         Allow from all
 15     </Directory>
 16 </VirtualHost>
 17 
 18 
 19 <VirtualHost *:80>
 20     ServerAdmin wangkuncoin@163.com
 21     DocumentRoot "/var/www/blog"
 22     ServerName bbs.coin.org
 23     ServerAlias coin.org
 24     ErrorLog "logs/bbs.coin.org-error_log"
 25     CustomLog "logs/bbs.coin.org-access_log" common
 26     
 27     <Directory "/var/www/bbs">
 28         Options -Indexes FollowSymLinks
 29         AllowOverride None
 30         Order allow,deny
 31         Allow from all
 32     </Directory>
 33 </VirtualHost>


[root@localhost apache]# mkdir -pv /var/www/blog
mkdir: 已创建目录 "/var/www"
mkdir: 已创建目录 "/var/www/blog"

[root@localhost apache]# mkdir /var/www/bbs

生成网页
[root@localhost apache]# echo "<html><body><h1>blog.coin.org</h1></body></html>" > /var/www/blog/index.html
[root@localhost apache]# echo "<html><body><h1>bbs.coin.org</h1></body></html>" > /var/www/bbs/index.html

Driectory 标签的 Options 参数解释:

    None:不支持任何选项
    Indexes:无index.html时,列出所有网页文件,禁用
    FollowSymLinks:存在软链接网页文件时,是否只可以访问对应源网页文件的内容,禁用
    SymLinksifOwnerMatch:允许访问软链接,但所属必须和运行httpd进程的所属一致
    Includes:允许执行服务器端包含(SSI格式的网页文件),禁用
    ExecCGI:允许运行CGI脚本
    MultiViews:内容协商机制(根据客户端的语言不同显示不同的网页),多视图;禁用
    All:启用所有选项

4.1.2 基于IP的虚拟主机配置(生产环境基本不使用,了解就行)

1. 修改 httpd-vhosts.conf 配置文件中的 第一行注释掉,并将 VirtualHost 标签内的 * 改为ip地址
[root@localhost apache]# vim conf/extra/httpd-vhosts.conf
  1 # NameVirtualHost *:80
  2 <VirtualHost 192.168.23.131:80>
 19 <VirtualHost 192.168.23.132:80>

2. 添加一个新的IP地址:
[root@localhost apache]# ifconfig ens33:1 192.168.23.132 netmask 255.255.255.0 up

3. 此时该服务就拥有两个ip地址:
    192.168.23.131
    192.168.23.132

4. graceful httpd服务

4.1.3 基于端口的虚拟主机配置(生产环境基本不使用,一般对公司内部人员提供访问)

1. 在 httpd.conf 中增加监听端口
[root@localhost apache]# vim conf/httpd.conf
 40 Listen 80
 41 Listen 8000

2. 修改 httpd-vhosts.conf 配置文件中的 第一行注释掉,并将 VirtualHost 标签内的端口改为对应的监听端口
[root@localhost apache]# vim conf/extra/httpd-vhosts.conf
  1 # NameVirtualHost *:80
  2 <VirtualHost *:80>
 19 <VirtualHost *:8000>

3. graceful httpd服务

4. 检查 http服务端口,此时应该有两个端口
[root@localhost apache]# netstat -anltp | grep httpd
tcp6       0      0 :::80                   :::*                    LISTEN      1143/httpd          
tcp6       0      0 :::8000                 :::*                    LISTEN      1143/httpd

4.1.4 多端口多域名虚拟主机

emm~~~~~~

4.2 检查apache配置语法

[root@localhost apache]# ./bin/apachectl -t
Syntax OK

# 这是生产环境特别重要的一步,它让你在重启前可以查出配置文件中的错误,如果没有此步,很可能会因为配置错误,而导致服务器短时间宕机;
# 这在正规互联网公司是无法接受的;

4.3 graceful参数重启apache服务

[root@localhost apache]# ./bin/apachectl graceful

# graceful 不是restart;
# graceful 表示优雅的重启;
# 这个参数可以在重启时,不强行中断用户的访问请求,而是处理完毕后再重新启动;
# 生产环境务必使用 granceful

4.4 检查apache启动

[root@localhost apache]# netstat -anlp | grep :80
tcp6       0      0 :::80                   :::*                    LISTEN      1143/httpd

除了检查端口外,在启动apache时,使用脚本获取header信息或模拟用户访问指定URL(wget方式),来自动检查apache启动是不是真的正常,最大限度的保证重启后,能迅速知道网站是不是正常,而无需再敲命令查看;

这样如果配置问题,而非语法问题(语法问题使用 -t 参数已经检查过了),好迅速改回来,使得影响用户时间最短。

5 403 Forbidden 问题

403 Forbidden 资源不可用,服务器理解客户的请求,但拒绝处理它,通常由于服务器上文件或目录权限导致;

原因1(重要)

apache配置文件中没有对站点目录的权限许可配置,这通常是在初始安装apache后,更改了默认的apache站点目录所致;

如编译安装apache(假设安装在 /usr/local/apache)后,将站点目录(默认是/usr/local/apache/htdocs)改为其他路径,则会报403错误;

解决办法,仿照 /usr/local/apache/htdocs 的 directory配置 增加 新的站点目录的权限配置即可。

原因2 丢失index.html

站点目录下,无首页文件(index.html),而apache的配置又禁止了目录浏览(Option 配置 -Indexes 或者 取消 Indexes 或者配置为 None),就会提示403;

原因3 访问权限配置错误

如:<br>
Order Deny, Allow
Deny from 10.0.0.0/24<br>

将 10.0.0.0 网段的IP全部拒绝,则该网段的IP访问时都会显示 403 Forbidden;

原因4 站点目录权限

apache的用户对 站点目录没有读权限;

6 apache模块学习

6.1 --enable-expires

6.2 --mod_deflate

mod_deflate 模块提供了一个 DEFLATE 输出过滤器,允许服务器在将输出内容在发送到客户端之前进行压缩,以节约带宽。

6.2.1 检查是否安装

  1. 编译安装httpd,的确认方法
[root@localhost apache2.2.22]# pwd
/usr/local/apache2.2.22

[root@localhost apache2.2.22]# ./bin/apachectl -l | grep mod_deflate
  mod_deflate.c
  1. 如果是以DSO方式编译的,则查看方法为
[root@localhost apache2.2.22]# ll modules/ | grep mod_deflate

[root@localhost apache2.2.22]# grep mod_deflate.so conf/httpd.conf

[root@localhost apache2.2.22]# ./bin/apachectl -M | grep deflate
Syntax OK
 deflate_module (static)
 
# static 代表是编译安装的;
# dynamic 代表是DSO安装的;
# 以上两种情况不能同时存在,否则会有冲突;

6.2.2 mod_deflate 常规安装方法

  1. 配置编译时,可加入如下参数
--enable-deflate

查看帮助可以看到模块信息:

[root@localhost httpd-2.2.22]# ./configure --help | grep deflate
  --enable-deflate        Deflate transfer encoding support
  1. DSO安装
在解压的apache的源码目录的/root/httpd-2.2.22/modules/filters/

[root@localhost apache2.2]# ./bin/apxs -c -i -a /root/httpd-2.2.22/modules/filters/mod_deflate.c
...
chmod 755 /tmp/apache2.2/modules/mod_deflate.so
[activating module `deflate' in /tmp/apache2.2/conf/httpd.conf]



apx 安装参数说明:

-c  此选项表示需要执行编译操作;
    它首先会编译C源程序(.c)files为对应的目标代码文件(.o),然后连接这些目标代码和files中其余的目标代码文件(.o和.a),以生成动态共享对象dsofile。
    如果没有指定 -o 选项,则此输出文件名由files中的第一个文件名推测得到,也就是默认为mode_name.so;

-i  此选项表示需要执行安装操作;以安装一个或多个动态共享对象到服务器的modules目录中;

-a  此选项自动增加一个 LoadModule行 到 httpd.conf 文件中,以激活此模块,或者此行已存在,则启用之;
检查安装
[root@localhost apache2.2.22]# pwd
/tmp/apache2.2.22
[root@localhost apache2.2.22]# ll modules/ | grep mod_deflate
-rwxr-xr-x 1 root root 70320 4月  21 23:06 mod_deflate.so

[root@localhost apache2.2.22]# cat conf/httpd.conf | grep mod_deflate
LoadModule deflate_module     modules/mod_deflate.so

  1. 查看http headers 验证mod_deflate效果
[root@localhost apache2.2.22]# curl -I 127.0.0.1
HTTP/1.1 200 OK
Date: Sat, 21 Apr 2018 13:56:34 GMT
Server: Apache/2.2.22 (Unix) DAV/2
Last-Modified: Sat, 21 Apr 2018 02:24:20 GMT
ETag: "c09eecd-47-56a5280968da7"
Accept-Ranges: bytes
Content-Length: 71
Content-Type: text/html

6.2.3 mod_deflate模块配置

  1. 在 httpd.conf 配置
    把以下内容复制到配置文件末尾即可
    DeflateActive on
    DeflateDefault "access plus 12 month"
    DeflateByType text/html "access plus 12 months"
    DeflateByType text/css "access plus 12 months"
    DeflateByType image/gif "access plus 12 months"
    DeflateByType image/jpeg "access plus 12 months"
    DeflateByType image/jpg "access plus 12 months"
    DeflateByType image/png "access plus 12 months"
    DeflateByType application/x-shockwave-flash "access plus 12 months"
    DeflateByType application/x-javascript "access plus 12 months"
    DeflateByType video/x-flv "access plus 12 months"
    <ifmodule mod_deflate.c>
        DeflateCompressionLevel 9
        S

  1. 在 httpd-vhosts.conf 配置

7 Apache优化配置

7.1 配置cronolog进行日志轮转

7.2 404 故障转移

把404的故障转移到 www.baidu.com

[root@localhost apache2.2.22]# vim conf/httpd.conf
352 ErrorDocument 404 "https://www.baidu.com"

[root@localhost apache2.2.22]# ./bin/apachectl -t

[root@localhost apache2.2.22]# ./bin/apachectl graceful

在浏览器输入 IP/asdasd 就可以看到效果

7.3 mod_deflate 文件压缩

相关文章

网友评论

      本文标题:Linux - 02-Apache

      本文链接:https://www.haomeiwen.com/subject/ugabrhtx.html