如何在 Ubuntu 14.04 上使用 uWSGI 和 Nginx 部署 Web2py Python 应用程序

介绍

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.keymyapp.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证书:

web2py SSL warning

这是预期的,因为我们已经签署了自己的证书。点击高级链接或您的浏览器给你的任何其他链接,然后按计划进入网站。

web2py welcome app

通过点击右边的管理界面按钮,您应该能够输入您在运行服务器时选择的密码,并进入管理网站:

web2py admin interface

这使您可以访问正在运行您的应用程序的实际代码,允许您从接口本身中编辑和调整文件。

当你看完后,在终端窗口中再次键入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_certificatessl_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 应用程序的开发,通过利用本文中描述的通用工具链,您可以轻松地从单一服务器中服务您创建的应用程序。

Published At
Categories with 技术
comments powered by Disqus