分享 apache 服务器的实战经验 1

Posted 程序员肖邦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分享 apache 服务器的实战经验 1相关的知识,希望对你有一定的参考价值。


Apache 是一款使用量排名第一的 web 服务器,平时我们说的 LAMP 中的 A 指的就是它,由于其开源、稳定、安全等特性而被广泛使用。Apache 是 LAMP 的核心,文中记录了做基础运维时关于 Apache 经常使用的功能。

计划主要分享内容目录如下:

  • apache 的几种工作模式

  • apache 的用户认证

  • 设置默认虚拟主机

  • 域名 301 跳转

  • apache 日志切割

  • 不记录指定文件类型的日志

  • apache 配置静态缓存

  • apache 配置防盗链

  • apache 访问控制

  • 禁止解析 php

  • 禁止指定 user_agent

  • 限制某个目录

1. Apache 的三种工作模式

apache 一共有 3 种稳定的模式,它们分别是 prefork、worker、event。http-2.2 版本的 httpd 默认的是 mpm 工作模式为 prefork,2.4 版本的 httpd 默认版本是 event 工作模式,可以通过 httpd -V 来看,编译的时候,可以通过 configure 的参数来指定。

$ httpd -V | grep -i "server mpm"
Server MPM:     Prefork

$ configure --with-mpm=prefork | worker | event

prefork 工作模式

Apache 在启动之初,就预先 fork 一些子进程,然后等待请求进来。之所以这样做,是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间点内,只能处理一个请求。

  • 优点:成熟稳定,兼容所有新老模块。同时,不需要担心线程安全的问题。

  • 缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求。

worker 工作模式

使用了多进程和多线程的混合模式。它也预先 fork 了几个子进程(数量比较少),然后每个子进程创建一些线程,同时包括一个监听线程。每个请求过来,会被分配到 1 个线程来服务。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些。在高并发的场景下,因为比起 prefork 有更多的可用线程,表现会更优秀一些。

  • 优点:占据更少的内存,高并发下表现更优秀。

  • 缺点:必须考虑线程安全的问题。

event 工作模式

它和 worker 模式很像,最大的区别在于,它解决了 keep-alive 场景下,长期被占用的线程的资源浪费问题。event MPM 中,会有一个专门的线程来管理这些 keep-alive 类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。

HTTP 采用 keepalive 方式减少 TCP 连接数量,但是由于需要与服务器线程或进程进行绑定,导致一个繁忙的服务器会消耗完所有的线程。Event MPM 是解决这个问题的一种新模型,它把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限 制,此时 Event MPM 方式是最有效的,但不能在HTTPS访问下工作。

2. Apache 的用户认证

有时候,我们需要给一些特殊的访问设置一个用户认证机制,增加安全。比如我们的个人网站,一般都是有一个管理后台的,虽然管理后台本身就有密码,但我们为了更加安全,可以再设置一层用户认证。

编辑配置文件

在对应的虚拟主机配置中加入如下配置:

$ vim /usr/local/apache2/conf/extra/httpd-vhosts.conf

<VirtualHost *:80>
   DocumentRoot "/usr/local/apache2/htdocs"
   ServerName www.123.com
   ServerAlias www.abc.com
   <Directory /usr/local/apache2/htdocs/admin.php>
       AllowOverride AuthConfig
       AuthName "Please input you acount."
       AuthType Basic
       AuthUserFile /usr/local/apache2/htdocs/.htpasswd
       require valid-user
   </Directory>
</VirtualHost>

说明:首先指定要对哪个目录进行验证,AuthName自定义,AuthUserFile指定用户密码文件在哪里。

创建加密用的用户名和密码文件

创建第一个用户时-c选项创建.htpasswd文件,-m选项增加用户,根据提示输入密码。

$ htpasswd -c htdocs/.htpasswd liwei
$ htpasswd -m htdocs/.htpasswd admin

重启 apache 服务

先检查配置是否正确,然后用 graceful 相当于是 reload 配置,不用重启 apache 服务,效果一样。测试,通过浏览器输入 www.123.com/admin.php 提示输入密码。

$ apachectl -t
$ apachectl graceful

以上是关于分享 apache 服务器的实战经验 1的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序代码片段

网络问题排查实例集锦(实战经验分享)

一次 RocketMQ 进程自动退出排查经验分享(实战篇)

一次 RocketMQ 进程自动退出排查经验分享(实战篇)

分析C++软件异常需要掌握的汇编知识汇总(实战经验分享)

Linux下使用Apache搭建Web网站服务器