介绍
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.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开发文件。我们还需要一个编译器来构建实际的二进制。
我们可以通过键入激活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 应用程序的开发,通过利用本文中描述的通用工具链,您可以轻松地从单一服务器中服务您创建的应用程序。