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

介绍

web2py 框架是一个强大而易用的工具,可用于快速开发功能齐全的 Python Web 应用程序. 使用 web2py,您可以通过使用管理式 Web UI 轻松开发和管理您的应用程序。

在本指南中,我们将展示如何在 CentOS 7 上部署 web2py 应用程序。我们将使用 uWSGI 应用程序服务器与应用程序进行交互,使用多个工人流程。在 uWSGI 之前,我们将设置 Nginx 以反向代理配置来处理实际的客户端连接。

前提和目标

要完成本指南,您应该有一个新的 CentOS 7 服务器实例,具有非根用户配置的)来学习如何设置此设置。

我们将下载 web2py 框架并测试它,以确保默认应用程序环境正常工作。之后,我们将下载并安装 uWSGI 应用程序容器,作为请求和 web2py Python 代码之间的接口。

下载 web2py 框架

我们的第一步将是下载实际的 web2py 框架,这是在 GitHub 上的git存储库中维护的,所以下载的最佳方式是使用git本身。

我们可以从默认的CentOS存储库下载和安装git,键入:

1sudo yum 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开发文件。我们还需要一个编译器来构建实际的二进制。

我们可以通过键入激活EPEL存储器:

1sudo yum install epel-release

之后,我们可以通过键入来安装所需的包。

1sudo yum install python-devel python-pip gcc

现在我们可以通过键入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 连接。

由于所有组件都在单一服务器上运行,我们可以使用Unix接口,而不是使用网络端口,这更安全,提供更好的性能。这个接口不会使用HTTP,而是将实施uWSGI的uwsgi协议,这是一个快速的二进制协议,旨在与其他服务器进行通信。

我们还将修改插件的权限和所有权,因为我们将给网页服务器写入访问权限。 插件本身将放置在),在那里 uWSGI 和 Nginx 都可以访问它。

 1[uwsgi]
 2chdir = /home/user/myapp
 3module = wsgihandler:application
 4
 5master = true
 6processes = 5
 7
 8uid = user
 9socket = /run/uwsgi/myapp.sock
10chown-socket = user:nginx
11chmod-socket = 660
12vacuum = true

我们的 uWSGI 配置文件已完成. 保存并关闭文件。

创建 uWSGI 的 Systemd 单元文件

我们已经为 uWSGI 创建了配置文件,但我们还没有设置我们的应用程序服务器以便在启动时自动启动。

我们将创建单元文件在 /etc/systemd/system 目录中,在那里存储用户创建的单元文件. 我们将我们的文件称为 uwsgi.service:

1sudo nano /etc/systemd/system/uwsgi.service

從「[單元]」部分開始,用於指定元數據,我們只會在這裡列出我們的服務的描述:

1[Unit]
2Description=uWSGI Emperor service

接下来,我们将打开 [服务] 部分. 我们将使用 ExecStartPre 指令来设置我们需要运行我们的服务器的部件. 这将确保创建 /run/uwsgi 目录,并确保我们的正常用户拥有它与 Nginx 组作为组所有者。

对于ExecStart指令规定的实际启动命令,我们将指向uwsgi可执行。我们会告诉它在):

 1[Unit]
 2Description=uWSGI Emperor service
 3
 4[Service]
 5ExecStartPre=/usr/bin/bash -c 'mkdir -p /run/uwsgi; chown user:nginx /run/uwsgi'
 6ExecStart=/usr/bin/uwsgi --emperor /etc/uwsgi/sites
 7Restart=always
 8KillSignal=SIGQUIT
 9Type=notify
10NotifyAccess=all

现在,我们所需要做的只是添加 [安装] 部分,这使我们能够指定服务何时自动启动,我们将我们的服务与多用户系统状态相关联,每次系统设置为多用户(正常操作状态),我们的服务就会被激活:

 1[Unit]
 2Description=uWSGI Emperor service
 3
 4[Service]
 5ExecStartPre=/usr/bin/bash -c 'mkdir -p /run/uwsgi; chown user:nginx /run/uwsgi'
 6ExecStart=/usr/bin/uwsgi --emperor /etc/uwsgi/sites
 7Restart=always
 8KillSignal=SIGQUIT
 9Type=notify
10NotifyAccess=all
11
12[Install]
13WantedBy=multi-user.target

完成此操作后,保存并关闭文件。

我们将无法在此时成功启动服务,因为它依赖于 nginx 用户的可用性,我们将不得不等待在安装 Nginx 后启动 uWSGI 服务。

安装和配置 Nginx 作为反向代理

有了 uWSGI 配置并做好准备,我们现在可以安装和配置 Nginx 作为我们的反向代理程序。

1sudo yum install nginx

一旦 Nginx 安装,我们可以继续修改服务器块配置,我们会编辑主要的 Nginx 配置文件:

1sudo nano /etc/nginx/nginx.conf

web2py 应用程序检测到您是否使用简单的 HTTP 或 SSL 加密连接,因此,我们的文件实际上将包含每个服务器块,我们将从配置为端口 80 的服务器块开始。

更改server_name以引用您的网站应该可访问的域名或IP地址。之后,我们将创建一个位置 {}块,以匹配静态内容的请求。 基本上,我们希望使用常规表达式来匹配以/static/结束的请求,以先前的路径组件。 我们希望将这些请求与我们的web2py项目中的应用程序目录进行地图。 请确保您引用用户的首页目录和应用程序名称:

 1server {
 2    listen 80 default_server;
 3    server_name server_domain_or_IP;
 4    root                    /usr/share/nginx/html;
 5
 6    include /etc/nginx/default.d/*.conf;
 7
 8    location ~* /(\w+)/static/ {
 9        root /home/user/myapp/applications/;
10    }
11
12    . . .

之后,我们需要调整):

 1server {
 2    listen 80 default_server;
 3    server_name server_domain_or_IP;
 4    root                    /usr/share/nginx/html;
 5
 6    include /etc/nginx/default.d/*.conf;
 7
 8    location ~* /(\w+)/static/ {
 9        root /home/user/myapp/applications/;
10    }
11
12    location / {
13        include uwsgi_params;
14        uwsgi_pass unix:/home/user/myapp/myapp.sock;
15    }
16}
17
18    . . .

这将是我们需要的第一个服务器块。

在文件的底部,但在关闭的http {}区块内,创建另一个服务器 {}区块,我们将使用此功能来配置SSL连接。

这个服务器块会听到端口443上的连接,默认的SSL端口. 我们会设置服务器的域名或IP地址,就像我们对端口80的服务器块一样。 为了开始实际的SSL配置,我们会指定SSL应该为此块启用,我们会指示向SSL证书和密钥的路径,以加密连接。

 1http {
 2    . . .
 3    server {
 4        listen 80;
 5        . . .
 6    }
 7    server {
 8        listen 443;
 9        server_name server_domain_or_IP;
10
11        ssl on;
12        ssl_certificate /etc/nginx/ssl/myapp.crt;
13        ssl_certificate_key /etc/nginx/ssl/myapp.key;
14    }
15}

我们将继续使用一些SSL锅板来建立所接受的协议和加密码,然后我们可以设置我们在端口80服务器块中配置的相同的位置 / {}块:

 1http {
 2    . . .
 3    server {
 4        listen 80;
 5        . . .
 6    }
 7    server {
 8        listen 443;
 9        server_name server_domain_or_IP;
10
11        ssl on;
12        ssl_certificate /etc/nginx/ssl/myapp.crt;
13        ssl_certificate_key /etc/nginx/ssl/myapp.key;
14
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:/run/uwsgi/myapp.sock;
22        }
23    }
24}

你现在应该有两个服务器块配置在这个文件中. 保存并关闭它,当你完成。

最后的步骤

接下来,我们需要将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用户必须可以访问我们的应用程序目录,以便它可以根据需要直接服务静态文件。CentOS非常限制地锁定每个用户的主目录,所以我们会将nginx用户添加到我们的用户组中,以便我们可以打开必要的最低权限来使此功能。

nginx用户添加到您的组中,键入以下命令,以用户代替您的用户名:

1sudo usermod -a -G user nginx

现在,我们将给我们的用户组在我们的目录上执行权限,这将允许 Nginx 进程在以下方面输入和访问内容:

1chmod 710 /home/user

现在,检查您的 Nginx 配置文件,查找语法错误:

1sudo nginx -t

如果没有报告语法错误,我们可以继续并启动 Nginx:

1sudo service nginx start

我们还可以开始我们的 uWSGI 服务:

1sudo service uwsgi start

我们需要做的最后一件事是复制我们的应用程序的参数文件,以便在端口443上服务连接时正确阅读。

1cp ~/myapp/parameters_8000.py ~/myapp/parameters_443.py

因此,您应该能够使用您的服务器的域名或IP地址访问您的服务器,如果您想登录管理界面,请使用https

如果一切顺利,您可以通过键入启动时启动 Nginx 和 uWSGI:

1sudo systemctl enable nginx
2sudo systemctl enable uwsgi

结论

在本指南中,我们已经设置了一个样本 web2py 项目来实践部署,我们已经配置了 uWSGI 作为我们的应用程序和客户端请求之间的接口,然后我们在 uWSGI 之前设置了 Nginx,以允许 SSL 连接并有效地处理客户端请求。

web2py 项目通过从一开始就提供可操作的 Web 界面来简化网站和 Web 应用程序的开发,通过利用本文中描述的通用工具链,您可以轻松地从单一服务器中服务您创建的应用程序。

Published At
Categories with 技术
comments powered by Disqus