apache部署web项目
昨天帮朋友把一个python flask项目扔到服务器上,部署折腾到凌晨两点。部署他用的部署就是apache,不是部署nginx。这年头选apache的部署人少了,但老家伙依然能打,部署尤其你手头有个现成的部署httpd服务,或者项目里全是部署.htaccess规则的时候。
先把项目文件拷到/var/www/html/myapp,部署权限设成755,部署属主www-data。部署这一步别偷懒,部署我见过太多人卡在403上,部署结果就是部署目录权限不对。然后装mod_wsgi,部署ubuntu上一条命令的事:apt install libapache2-mod-wsgi-py3。python版本要对上,系统自带3.8,你要是用3.10写的代码,那就得自己编译,那又是另一个故事了。
配置虚拟主机。在/etc/apache2/sites-available/里建个文件,叫myapp.conf。内容大概长这样:
<VirtualHost *:80> ServerName myapp.example.com WSGIDaemonProcess myapp python-path=/var/www/html/myapp WSGIScriptAlias / /var/www/html/myapp/wsgi.py <Directory /var/www/html/myapp> Require all granted </Directory> </VirtualHost>
wsgi.py这文件你得自己写,就三行:
from myapp import app if __name__ == "__main__": application = app
然后a2ensite myapp.conf启用站点,systemctl reload apache2重载服务。就这么简单。
但现实往往没这么顺。我第一次配的时候,页面直接给500,翻apache的error.log,发现是python依赖没装全。虚拟环境没激活,模块全找不到。后来学乖了,直接在WSGIDaemonProcess里加python-home参数指向venv目录,省得每次手动激活。
静态文件是个坑。apache默认不处理python应用里的静态资源,你得单独配一个Alias。比如项目里有static文件夹,那就加一行:
Alias /static /var/www/html/myapp/static
不然css和js全挂,页面丑得没法看。我那个朋友就卡在这,跟我说"页面出来了但光秃秃的",我一看,静态文件请求全404。
还有个细节,apache默认的Timeout是60秒。如果你的项目里有长时间运行的接口,比如导出报表这种,客户端等60秒没响应就断了。把Timeout调到300,或者用异步方案,但那是另一个话题。
最后说下.htaccess。apache的优势就在这,你可以在项目目录里放这个文件,覆盖全局配置。比如强制https跳转,或者加个请求头,都不用动主配置文件。但记得AllowOverride All得开着,不然.htaccess就是废纸一张。默认站点是关的,我吃过这亏,改了.htaccess半天没反应,最后发现是AllowOverride没开。
部署这事,说破天也就这几步。但每次都能遇到新问题,不是端口被占就是模块没启用。多备几个排查命令在脑子里,apachectl -t检查配置语法,journalctl -u apache2看服务日志,比什么教程都管用。apache不新潮,但它稳定,配置起来直来直去,不像nginx那套location正则,写错一个符号就是404。你要是第一次部署web项目,选apache反而省心。
