目录
首发于:
最近更新于:
分类: archived

前言

关于apache2 web server的简要介绍请参看 apache http server wiki 。目前推荐使用apache2.4,这是它的 apache官方文档

Ubuntu系统或者Centos系统之间httpd的安装配置环境等差异很大,我想说的是那些知识都不是重点,跟着官方文档,咱首先折腾出一个绿色本地安装版本的httpd,然后跟着官方文档学配置才是王道。什么在那个系统那个命令啊,那个系统那个文件夹下那个配置啊都是不重要的东西。

apache的本地安装

apache本地安装过程大体分为下面几步:

  • 安装apr

  • 安装apr-util

  • 安装httpd
  • 安装mod_wsgi (可选项,使用django或者flask你需要它的)

更多的细节在官方文档的 install 那一章节里,读者如果懂ansible的话,可以看看 我写的 green-install项目 里面的apache role 部分。

正如前面说到的,日志文件在那里,配置文件在那里加载啊等等都是可以定制的,摸清楚配置语法才是王道。

挂个简单的静态网站

首先httpd.conf 那里我们写上了 LISTEN 80 了,这样apache将会监听80端口。你的域名指向你的远程服务器ip就可以了。然后一般我们在httpd.conf 后面写上这么一句:

Include conf.d/*.conf

也就是conf.d文件夹下的所有配置自动加载进来。这个conf.d文件夹和conf文件夹是平行关系。然后conf.d里面我们主要就是定义 VirtualHost

上个完整的例子吧:

<VirtualHost *:80>
    ServerName www.cdwanze.work
    DocumentRoot /home/wanze/venv/html
    DirectoryIndex index.html   

    <Directory /home/wanze/venv/html >
        <IfVersion >= 2.4>
            Require all granted
        </IfVersion>
        <IfVersion < 2.4>
            Order deny,allow
            Allow from all
        </IfVersion>
    </Directory>

</VirtualHost>
  • ServerName: apache监听80端口的信号将经过这个ServerName进一步进行分发,比如请求域名是 api.cdwanze.work,那个这个情况将不会被上面例子的VirtualHost处理。
  • DocumentRoot : 服务的静态网站的那些内容所在的文件夹。重要级别五颗星。
  • DirectoryIndex : 某些文件夹请求比如 /a/b ,如果这个文件夹下有index.html文件,那么将显示这个文件的内容。
  • Directory: 文件夹权限管理,重要级别五颗星,不写就会出现没有权限访问错误。
403 Forbidden You don't have permission to access / on this server

apache2.4版本使用语法是 Require all granted ,对应的原2.2的配置是:

Order allow,deny

Allow from all

有考究癖的可以了解下2.2这种写法的意思:

Order allow,deny —— 先写allow规则,再写deny规则 Allow from all —— 所有都可以访问 Deny from all —— 所有都拒绝

2.2的这个配置

Order deny,allow
Deny from all

等同于2.4的:

Require all denied
\end{Verbatim}

然后2.2的这个:

Order Deny,Allow
Deny from all
Allow from example.org

意思是所有都拒绝,只允许 example.org的访问。

等同于2.4:

Require host example.org

我们看到2.4的Require语句更简洁了,比如下面的这个:

Require all granted
Require not ip 10.252.46.165

所有都允许,除了谁谁禁止访问。

挂个wsgi站点

上例子吧:

<IfModule !wsgi_module>
    LoadModule wsgi_module modules/mod_wsgi.so
</IfModule>

WSGIPythonHome "/home/wanze/venv"
WSGIPythonPath "/home/wanze/venv/webapp"

<VirtualHost *:80>
    ServerName api.cdwanze.work

    WSGIScriptAlias / /home/wanze/venv/webapp/webapp/wsgi.py

    <Directory /home/wanze/venv/webapp >
        <IfVersion >= 2.4>
            Require all granted
        </IfVersion>
        <IfVersion < 2.4>
            Order deny,allow
            Allow from all
        </IfVersion>
    </Directory>

    Alias "/static" "/home/wanze/venv/webapp/static"

    <Directory  /home/wanze/venv/webapp/static >
        <IfVersion >= 2.4>
            Require all granted
        </IfVersion>
        <IfVersion < 2.4>
            Order deny,allow
            Allow from all
        </IfVersion>
    </Directory>

</VirtualHost>
  • 首先是检测wsgi模块加载了没有,没有把它加载上。

  • WSGIPythonHome 这个设置你的python的虚拟环境的所在目录,比如上面的例子 venv/bin下面就是python可执行脚本。

  • WSGIPythonPath 这个设置你的Django项目目录所在

  • WSGIScriptAlias 这个设置你的WSGI文件所在
  • Alias 和下面Directory 设置是服务你的项目的静态文件的。

其他文件权限问题

除了上面设置好 Directory 之外,你可能还会遇到其他某些文件的读写权限问题,在查看日志的时候发现提示说那个文件没有权限读写了。这个时候首先要明确httpd的执行User和Group是谁,然后在看目标文件夹或文件的具体权限。

Django项目的wsgi文件是需要有执行权限的。还有Django项目操纵数据库,比如sqlite3这种文件数据库,你可能也会遇到读写权限问题。

还有值得一提的是如果某个母文件夹没有可执行权限,那么里面的所有文件都是不可见的。