介绍
web2py 框架是一个强大而易用的工具,可用于快速开发功能齐全的 Python Web 应用程序. 使用 web2py,您可以通过使用管理式 Web UI 轻松开发和管理您的应用程序。
在本指南中,我们将展示如何在Ubuntu 14.04上部署web2py应用程序。我们将使用uWSGI应用程序服务器与应用程序进行交互,使用多个工人流程。在uWSGI之前,我们将在逆向代理配置中设置nginx来处理实际的客户端连接。
前提和目标
要完成本指南,你应该有一个新的Ubuntu 14.04服务器实例,具有非根用户配置的)来学习如何设置此设置。
我们将下载 web2py 框架并测试它,以确保默认应用程序环境正常工作。之后,我们将下载并安装 uWSGI 应用程序容器,作为请求和 web2py Python 代码之间的接口。
下载 web2py 框架
我们的第一步将是下载实际的 web2py 框架,这是在 GitHub 上的git
存储库中维护的,所以下载的最佳方式是使用git
本身。
我们可以从默认的Ubuntu存储库下载和安装git
通过键入:
1sudo apt-get update
2sudo apt-get install git
一旦安装了git
,我们就可以将存储库克隆到用户的主目录中。我们可以随意命名应用程序。在我们的例子中,我们正在使用名称myapp
来简化。我们需要添加--recursive
旗,因为数据库抽象层作为自己的git
子模块处理:
1git clone --recursive https://github.com/web2py/web2py.git ~/myapp
web2py框架将被下载到您的主目录中的名为myapp
的目录中。
我们可以通过进入目录来测试默认应用程序:
1cd ~/myapp
管理界面必须通过SSL加密,所以我们可以制作一个简单的自签证书来测试这一点。
1openssl req -x509 -new -newkey rsa:4096 -days 3652 -nodes -keyout myapp.key -out myapp.crt
您将需要填写您正在生成的证书的一些信息,在这种情况下真正重要的部分是共同名称
字段,该字段应该参考您的服务器的域名或IP地址:
1. . .
2
3Country Name (2 letter code) [AU]:US
4State or Province Name (full name) [Some-State]:New York
5Locality Name (eg, city) []:New York City
6Organization Name (eg, company) [Internet Widgits Pty Ltd]:DigitalOcean
7Organizational Unit Name (eg, section) []:
8Common Name (e.g. server FQDN or YOUR name) []:server_domain_or_IP
9Email Address []:[email protected]
当你完成时,一个SSL密钥和证书应该在你的应用程序目录. 这些将被称为myapp.key
和myapp.crt
分别。
有了这个完整,我们可以启动 web2py Web 界面来测试它。
1python web2py.py -k myapp.key -c myapp.crt -i 0.0.0.0 -p 8000
您将被要求为管理界面选择密码。
现在,您可以通过导航到您的Web浏览器中访问您的应用程序:
1https://server_domain_or_IP:8000
请确保在上面的地址中使用https
而不是http
。您将被警告,您的浏览器无法识别SSL证书:
这是预期的,因为我们已经签署了自己的证书。点击高级
链接或您的浏览器给你的任何其他链接,然后按计划进入网站。
通过点击右边的管理界面
按钮,您应该能够输入您在运行服务器时选择的密码,并进入管理网站:
这使您可以访问正在运行您的应用程序的实际代码,允许您从接口本身中编辑和调整文件。
当你看完后,在终端窗口中再次键入CTRL-C,我们测试了我们的应用程序,并证明它可以在web2py开发服务器运行时在网络上访问。
安装和配置 uWSGI
现在我们已经启动了 web2py 应用程序,我们可以配置 uWSGI。 uWSGI 是一个可以通过称为 WSGI 的标准接口与应用程序进行通信的应用程序服务器。 有关此事的更多信息,请阅读 本节 在 Ubuntu 14.04 上设置 uWSGI 和 Nginx 的我们的指南。
安装 uWSGI
与上面链接的指南不同,在本教程中,我们将在全球范围内安装uWSGI。在我们能够安装uWSGI之前,我们将需要安装pip
,Python包管理器,以及uWSGI依赖的Python开发文件。
1sudo apt-get install python-pip python-dev
现在我们可以通过键入pip
在全球范围内安装uWSGI:
1sudo pip install uwsgi
uWSGI 應用程式容器伺服器使用 WSGI inteface 規格與 Python 應用程式進行接口. web2py 框架包含旨在在在其「處理者」目錄內提供此接口的檔案。
1mv ~/myapp/handlers/wsgihandler.py ~/myapp
使用主项目目录中的 WSGI 处理器,我们可以通过键入来检查 uWSGI 是否能够服务应用程序:
1uwsgi --http :8000 --chdir ~/myapp -w wsgihandler:application
这一次,由于我们不使用SSL证书和密钥,它将通过简单的HTTP而不是HTTPS提供。您可以在浏览器中使用http
协议再次测试此功能。
完成后,在终端窗口中键入 CTRL-C 以停止服务器。
创建 uWSGI 配置文件
现在我们知道 uWSGI 可以服务应用程序,我们可以使用我们的应用程序信息创建 uWSGI 配置文件。
在/etc/uwsgi/sites
创建一个目录以存储我们的配置,然后移动到该目录:
1sudo mkdir -p /etc/uwsgi/sites
2cd /etc/uwsgi/sites
我们将我们的配置文件命名为myapp.ini
:
1sudo nano myapp.ini
在配置文件中,我们需要从一个[uwsgi]
标题开始,其中将放置我们所有的配置指令。标题后,我们将指示我们的应用程序的目录路径,并告诉模块要执行。
1[uwsgi]
2chdir = /home/user/myapp
3module = wsgihandler:application
接下来,我们需要指定,我们希望 uWSGI 以主模式运作,我们希望生成五个工人流程:
1[uwsgi]
2chdir = /home/user/myapp
3module = wsgihandler:application
4
5master = true
6processes = 5
接下来,我们需要指定我们希望 uWSGI 如何获得连接. 在我们对 uWSGI 服务器的测试中,我们接受了正常的 HTTP 连接. 然而,由于我们将在 uWSGI 之前配置 Nginx 作为逆向代理,我们还有其他选项。 Nginx 可以使用uwsgi
协议进行代理,这是 uWSGI 设计的快速二进制协议,用于与其他服务器进行通信。
由于我们使用uwsgi
协议与 Nginx 进行通信,我们不需要网络端口,相反,我们将使用一个 Unix 接口,这是更安全和更快的。我们将将此置于我们的应用目录中。我们需要修改权限,以便该组能够阅读和写入接口。
1[uwsgi]
2chdir = /home/user/myapp
3module = wsgihandler:application
4
5master = true
6processes = 5
7
8socket = /home/user/myapp/myapp.sock
9chmod-socket = 660
10vacuum = true
上面的真空
指令将在 uWSGI 过程结束时清除插槽文件。
我们的 uWSGI 配置文件已完成. 保存并关闭文件。
创建一个 uWSGI Upstart 文件
我们已经为 uWSGI 创建了一个配置文件,但我们还没有设置我们的应用程序服务器自动启动时。为了实现此功能,我们可以创建一个简单的 Upstart 文件。我们会告诉它在皇帝模式
中运行 uWSGI,这允许应用程序服务器读取任何数量的配置并为每个启动服务器。
在/etc/init
目录中创建一个文件,在那里Upstart过程寻找其配置文件:
1sudo nano /etc/init/uwsgi.conf
我们将首先给我们的服务文件一个描述,并表示我们希望在哪个运行级别自动启动它. 传统的多用户运行级别是 2, 3, 4 和 5. 当服务器进入其他运行级别时,我们将有 Upstart 停止服务(例如在关闭、重新启动或单用户模式):
1description "uWSGI application server in Emperor mode"
2
3start on runlevel [2345]
4stop on runlevel [!2345]
我们将使用我们的正常用户帐户,因为它拥有我们所有的项目文件. 对于我们的组,我们需要允许www-data
组所有权,这是 Nginx 运作的组。
之后,我们只需要指定要运行的命令来启动 uWSGI. 我们只需要使用 - 皇帝
旗帜并将其传输到包含我们的配置文件的目录:
1description "uWSGI application server in Emperor mode"
2
3start on runlevel [2345]
4stop on runlevel [!2345]
5
6setuid user
7setgid www-data
8
9exec /usr/local/bin/uwsgi --emperor /etc/uwsgi/sites
这将启动一个 uWSGI 应用程序服务器来处理我们的 web2py 网站. 皇帝模式允许我们轻松地为其他项目添加配置文件。
现在我们已经完成了我们的 Upstart 脚本。 保存并关闭文件. 在此时刻,我们无法启动 uWSGI 服务,因为我们还没有安装 Nginx。
安装和配置 Nginx 作为反向代理
有了 uWSGI 配置并做好准备,我们现在可以安装和配置 Nginx 作为我们的反向代理程序,可以从 Ubuntu 的默认存储库下载:
1sudo apt-get install nginx
一旦安装了 Nginx,我们可以继续修改服务器块配置,我们将使用默认服务器块作为基础,因为它拥有我们最需要的:
1sudo nano /etc/nginx/sites-available/default
web2py 应用程序检测到您是否使用简单的 HTTP 或 SSL 加密连接,因此,我们的文件实际上将包含每个服务器块,我们将从配置为端口 80 的服务器块开始。
更改server_name
以引用您的网站应该可访问的域名或IP地址。之后,我们将创建一个位置 {}
块,以匹配静态内容的请求。 基本上,我们希望使用常规表达式来匹配以/static/
结束的请求,以先前的路径组件。 我们希望将这些请求与我们的web2py项目中的应用程序
目录进行地图。 请确保您引用用户的首页目录和应用程序名称:
1server {
2 listen 80 default_server;
3 listen [::]:80 default_server ipv6only=on;
4
5 root /usr/share/nginx/html;
6 index index.html index.htm;
7
8 server_name server_domain_or_IP;
9
10 location ~* /(\w+)/static/ {
11 root /home/user/myapp/applications/;
12 }
13
14 . . .
之后,我们需要调整):
1server {
2 listen 80 default_server;
3 listen [::]:80 default_server ipv6only=on;
4
5 root /usr/share/nginx/html;
6 index index.html index.htm;
7
8 server_name server_domain_or_IP;
9
10 location ~* /(\w+)/static/ {
11 root /home/user/myapp/applications/;
12 }
13
14 location / {
15 include uwsgi_params;
16 uwsgi_pass unix:/home/user/myapp/myapp.sock;
17 }
18}
这将是我们需要的第一个服务器块。
在文件的底部,有一个被评论的部分,其中包含大多数需要用SSL服务的指令。你可以识别这个块,因为它有听443;
作为第一个指令。
要开始,请再次更改server_name
,以匹配您的服务器的域名或IP地址,然后我们可以跳到ssl_certificate
和ssl_certificate_key
的指令,我们会将我们生成的SSL证书暂时放入/etc/nginx/ssl
的目录中,所以指定该位置的文件路径:
1server {
2 listen 443;
3 server_name server_domain_or_IP;
4
5 root html;
6 index index.html index.htm;
7
8 ssl on;
9 ssl_certificate /etc/nginx/ssl/myapp.crt;
10 ssl_certificate_key /etc/nginx/ssl/myapp.key;
11
12 . . .
在ssl_protocols
列表中,删除SSLv3,因为它已被发现具有协议本身固有的漏洞。
然后我们可以跳到位置 / {}
块,并将我们在最后一个服务器块中所做的相同的uWSGI代理信息:
1server {
2 listen 443;
3 server_name server_domain_or_IP;
4
5 root html;
6 index index.html index.htm;
7
8 ssl on;
9 ssl_certificate /etc/nginx/ssl/myapp.crt;
10 ssl_certificate_key /etc/nginx/ssl/myapp.key;
11
12 ssl_session_timeout 5m;
13
14 #ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
15 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
16 ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
17 ssl_prefer_server_ciphers on;
18
19 location / {
20 include uwsgi_params;
21 uwsgi_pass unix:/home/user/myapp/myapp.sock;
22 }
23}
你现在应该有两个服务器块配置在这个文件中. 保存并关闭它,当你完成。
最后的步骤
接下来,我们需要将SSL证书移动到我们指定的目录,首先创建目录:
1sudo mkdir -p /etc/nginx/ssl
现在,将您创建的证书和密钥移动到该目录. 如果您有商业证书授权机构签署的SSL证书,您可以在这里更换证书和相应的密钥,以避免对您的访问者发出不受信任的SSL证书警告:
1sudo mv ~/myapp/myapp.crt /etc/nginx/ssl
2sudo mv ~/myapp/myapp.key /etc/nginx/ssl
更改权限,以便非根用户无法访问该目录:
1sudo chmod 700 /etc/nginx/ssl
现在,检查您的 Nginx 配置文件,查找语法错误:
1sudo nginx -t
如果没有报告语法错误,我们可以继续并重新启动 Nginx:
1sudo service nginx restart
我们还可以开始我们的 uWSGI 服务:
1sudo service uwsgi start
我们需要做的最后一件事是复制我们的应用程序的参数文件,以便在端口443上服务连接时正确阅读。
1cp ~/myapp/parameters_8000.py ~/myapp/parameters_443.py
因此,您应该能够使用您的服务器的域名或IP地址访问您的服务器,如果您想登录管理界面,请使用https
。
结论
在本指南中,我们已经设置了一个样本 web2py 项目来实践部署,我们已经配置了 uWSGI 作为我们的应用程序和客户端请求之间的接口,然后我们在 uWSGI 之前设置了 Nginx,以允许 SSL 连接并有效地处理客户端请求。
web2py 项目通过从一开始就提供可操作的 Web 界面来简化网站和 Web 应用程序的开发,通过利用本文中描述的通用工具链,您可以轻松地从单一服务器中服务您创建的应用程序。