这是一个系列教程的第二篇(https://www.pyimagesearch.com/2018/02/05/deep-learning-production-keras-redis-flask-apache/)
实验基础环境:ubuntu 16.04 + apache 2.4.18 详细环境信息请参照同系列的环境配置教程:https://blog.csdn.net/hikkilover/article/details/80899133
下面这篇教程采用递进的结构,从Hello World开始,一步步地讲解如何把apache用起来,发布一个网页或是提供一个web服务。我们的内容集中在apache的配置,其他的一概不涉及。
如何让Apache开始工作?
apache2默认端口号为80,这也是被规定专门用于处理httpd请求的端口,一般来说,一台比较clean的服务器或是云主机,端口80是可用的,但如果你的实验环境比较险恶,用netstat -lnp|grep 80命令查看后,发现这个端口已经被一个莫名的进程占用(我实验用的服务器上的80端口就被一个tcp listen进程占用),出现了这种情况,我们就要修改Apache2 的默认端口。
服务器默认的apache2 配置文件全部在 /etc/apache2/ 目录下,要修改默认端口需要如下的操作,这些文件的修改一般需要服务器的root权限。
step1:修改ports.conf
vim /etc/apache2/ports.conf
Listen 80 -> Listen 8080
step2:修改sites-enabled/000-default.conf
vim /etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> -> <VirtualHost *:8080>
step3:重新启动apache2服务
service apache2 stop
service apache2 start
(查看apache2的运行状态) service apache2 status
正常情况下,这时打开浏览器,访问 http://(服务器外网IP):8080 就可以看到apache2的引导页面。
如何用Apache发布静态网页?
apache2 默认的主页(默认发布文件)保存在 /var/www/html/ 中(名为index.html),下载到本地查看,可以看到其内容就是默认的引导页面,为了让apache2 能部署用户自己的网页,我们不妨使用 linux 的软连接机制(sym-link)将自己写的工程镜像到该目录下,这里我们假设该目录名为webtest。
sudo ln -s /original/path/of/webtest webtest
(关于linux的文件连接机制,有软硬之分,二者的区别很清晰,自行百度即可。)
只是简单地把文件塞进去,apache2并不会发布,要让apache2发布我们的网页,还需要修改它的配置文件。
step1:修改 000-default.conf
sodu vim /etc/apache2/sites-enabled/000-default.conf
# 在DocumentRoot一行后面,添加
<Directory /var/www/html/webtest>
Allow from all
</Directory>
step2:重新启动apache2服务
(sudo) service apache2 restart
这时我们用 http://(服务器绝对IP):8080/webtest就可以访问到自己的静态网站。
如何用Apache发布基于python的web应用?
让apache发布web应用是比较麻烦的一件事,发布用python写的应用就更加麻烦,需要额外给apache打一个mod—— mod_wsgi,具体的安装流程参考本系列环境配置一篇,这里不多言。
在使能了mod_wsgi,并确定它基本能用后,我们需要修改000-default.conf的内容,把发布的对象定向到我们的应用目录下。
step1:使能mod_wsgi
sudo a2enmod wsgi
step2:编辑 000-default.conf
sodu vim /etc/apache2/sites-enabled/000-default.conf
# 在文件首部,添加如下两个环境变量,这里必须用当前所用虚拟环境的根目录和包目录
# 这两个路径其实可以参考mod_wsgi-express module-config的结果来设置
WSGIPythonHome "/.virtualenvs/env_name"
WSGIPythonPath "/.virtualenvs/env_name/lib/python3.5/site-packages"
# 在VirtualHost段内,DocumentRoot一行后面,添加如下两个变量
# 前者可以简单地视作应用的名称与线程数,后者则明确地指向了一个wsgi文件,这个文件可以视为apache部署应用的入口。
WSGIDaemonProcess app_name threads=10
WSGIScriptAlias / /var/www/html/webtest/app_name.wsgi
# 在Directory段使用如下的设置,这样的设置使你的服务“来者不拒”,可以被外网任意IP访问。
<Directory /var/www/html/webtest>
WSGIProcessGroup app_name
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
step3:重新启动apache2服务
(sudo) service apache2 restart
至于基于wsgi和python的web应用怎么写,那是另外一个问题,我们在这里不做探讨,单就apache的配置而言,上面的操作完成后,理论上apache就已经可以发布你的web应用程序了。根据你自己的应用逻辑,可以用浏览器或curl等工具进行访问测试。
主要参考:(https://www.pyimagesearch.com/2018/02/05/deep-learning-production-keras-redis-flask-apache/)