@(tigerfive)[tigerfive][linux学习笔记][uwsgi][django][nginx]

前言

先决条件和目标
安装和配置VirtualEnv和VirtualEnvWrapper
创建Django项目
设置uWSGI应用程序服务器
安装并配置Nginx为反向代理
结论

原文我发了另一篇文章<How To Serve Django Applications with uWSGI and Nginx on CentOS 7>原文链接

如何在CentOS 7上使用uWSGI和Nginx来运行Django应用程序

介绍

Django是一个功能强大的Web框架,可以帮助您将Python应用程序或网站变为现实。Django包含一个简化的开发服务器,用于在本地测试您的代码,但对于与生产相关的任何事情,都需要更安全,更强大的Web服务器。
在本指南中,我们将演示如何在CentOS 7上安装和配置一些组件,以支持和服务Django应用程序。我们将配置uWSGI应用程序容器服务器与我们的接口,Nginx将代理转换为uWSGI,使我们能够访问其安全性和性能特性来为我们的应用程序提供服务。

先决条件和目标

为了完成这个指南,你应该有一个新的CentOS 7服务器实例,配置一个非root用户,并配置了sudo权限。您可以通过运行我们的初始服务器设置指南了解如何进行设置。
我们将在两个不同的虚拟环境中安装Django,这将允许您的项目和他们的需求分开处理。我们将创建两个示例项目,以便我们可以在多项目环境中运行这些步骤。
一旦我们有了我们的应用程序,我们将安装和配置uWSGI应用程序服务器。这将作为我们应用程序的接口,它将使用HTTP将客户端请求转换为我们的应用程序可以处理的Python调用。然后,我们将在uWSGI之前设置Nginx,以利用其高性能的连接处理机制和易于实现的安全功能。
我们开始吧。

安装和配置VirtualEnv和VirtualEnvWrapper

我们将在他们自己的虚拟环境中安装我们的Django项目来隔离每个项目的需求。为此,我们将安装可以创建Python虚拟环境的virtualenv,以及virtualenvwrapper,这会为virtualenv工作流程增加一些可用性改进。
我们将使用pip(Python包管理器)来安装这两个组件。要获得pip,我们首先需要启用EPEL库,我们可以通过键入以下命令轻松完成:

                        #sudo yum install epel-release         

一旦启用EPEL,我们可以通过输入以下命令来安装pip:

                        #sudo yum install python-pip

现在你已经安装了pip,我们可以通过输入以下命令来全局安装virtualenv和virtualenvwrapper:

                       #sudo pip install virtualenv virtualenvwrapper

安装这些组件后,我们现在可以使用我们的shell来配置它所需要的与virtualenvwrapper脚本一起工作的信息。我们的虚拟环境将全部放置在我们的主文件夹Env中的一个目录中,以便于访问。这是通过一个名为WORKON_HOME的环境变量来配置的。我们可以将其添加到我们的shell初始化脚本中,并可以获取虚拟环境包装脚本。

要将相应的行添加到您的shell初始化脚本中,您需要运行以下命令:

                         echo "export WORKON_HOME=~/Env" >> ~/.bashrcecho "source /usr/bin/virtualenvwrapper.sh" >> ~/.bashrc

现在,请输入您的shell初始化脚本,以便您可以在当前会话中使用此功能:

                         source ~/.bashrc 

你现在应该在你的home文件夹中有一个名为Env的目录,它将保存虚拟环境信息。

创建Django项目

现在我们有了我们的虚拟环境工具,我们将创建两个虚拟环境,分别安装Django,并启动两个项目。

创建第一个项目

我们可以通过使用virtualenvwrapper脚本提供给我们的一些命令轻松地创建一个虚拟环境、

通过键入以下内容创建您的第一个虚拟环境,其中包含您的第一个站点或项目

           mkvirtualenv firstsite

这将创建一个虚拟环境,在其中安装Python和PIP,并激活环境。你的提示会改变你的新虚拟环境。它看起来像这样:(firstsite)user @ hostname:〜$。圆括号中的值是你的虚拟环境的名字。 现在,通过管道安装的任何软件都可以安装到虚拟环境中,而不是安装在全局系统上。这使我们能够在每个项目的基础上分离我们的软件包。

我们的第一步是安装Django本身,因为我们在我们的虚拟环境中安装了这个工具,所以我们可以在没有sudo的情况下使用pip。

          pip install django  

安装Django后,我们可以通过键入以下命令创建我们的第一个示例项目:

        cd ~django-admin.py startproject firstsite<-----报错找不到命令,find查找命令路径,添加到环境变量。 source  一下

这将创建一个目录名firstsite在你的家目录。在这里面是一个管理脚本,用于处理项目的各个方面,以及用于存储实际项目代码的另一个同名目录。

进入第一级目录,以便我们可以开始设置示例项目的最低要求。

        cd ~/firstsite

首先迁移数据库以初始化我们的项目将使用的SQLite数据库。如果您愿意,您可以为您的应用程序设置一个替代数据库,但这不在本指南的范围之内:

        ./manage.py migrate                           

现在,您的项目目录中应该有一个名为db.sqlite 3的数据库文件。现在,我们可以通过键入以下命令创建一个管理用户:

        ./manage.py createsuperuser                        

您将不得不选择一个用户名,给一个联系人的电子邮件地址,然后选择并确认一个密码。

接下来,使用文本编辑器打开项目的配置 文件:

        nano firstsite/settings.py

由于我们将设置Nginx来服务我们的网站,我们需要配置一个目录来保存我们网站的静态资源。这将使Nginx能够直接提供这些服务,这将对性能产生积极影响。我们将告诉Django把它们放到我们项目的基本目录下的静态目录中。将此行添加到文件的底部以配置此行为:

        STATIC_ROOT = os.path.join(BASE_DIR, "static/")

完成后保存并关闭文件。现在,收集我们网站的静态元素,并通过输入以下内容将其放置在该目录中:

           ./manage.py collectstatic

您可以键入“是”来确认操作并收集静态内容。在项目目录中将有一个名为static的新目录。
所有这一切,我们可以通过暂时启动开发服务器来测试我们的项目。类型:

     ./manage.py runserver 0.0.0.0:8080

这将在端口8080上启动开发服务器。在浏览器中访问服务器的域名或IP地址,然后输入8080。

    http://server_domain_or_IP:8080

你应该看到一个如下所示的页面:

将/ admin添加到浏览器地址栏中的URL末尾,然后转到管理员登录页面:

使用您通过createsuperuser命令选择的管理登录凭证,登录到服务器。您将有权访问管理接口:

经过测试该功能,通过在你的终端键入Ctrl-C停止开发服务器。现在我们可以继续我们的第二个项目了。

Create the Second Project

第二个项目将以与第一个完全相同的方式创建。我们将缩短这部分的解释,既然你已经完成了这一次。

返回到您的主目录并为您的新项目创建第二个虚拟环境。激活后在这个新环境中安装Django:

                    cd ~mkvirtualenv secondsitepip install django        

新环境将被创建并更改为,留下以前的虚拟环境。这个Django实例与其他配置完全分开。这使您可以独立管理它们并根据需要进行自定义。

创建第二个项目并进入项目目录:

                  django-admin.py startproject secondsitecd ~/secondsite  

初始化数据库并创建一个管理用户:

                  ./manage.py migrate./manage.py createsuperuser

打开设置文件:

                   nano secondsite/settings.py 

添加静态文件的位置,就像在以前的项目中一样:

                STATIC_ROOT = os.path.join(BASE_DIR, "static/")

保存并关闭文件。现在,通过键入以下内容将静态元素收集到该目录中:

             ./manage.py collectstatic

最后,启动开发服务器来测试网站:

             ./manage.py runserver 0.0.0.0:8080

您应该检查常规网站:

              http://server_domain_or_IP:8080

还要登录到管理网站:

             http://server_domain_or_IP:8080/admin

如果确认所有内容都按预期工作,请在终端中键入CTRL-C以停止开发服务器。

退出虚拟环境

由于我们现在已经完成了指南中的Django部分,所以我们可以停用我们的第二个虚拟环境:

               deactivate  

如果您需要再次在任一个Django网站上工作,你应该重新激活他们的其他环境。你可以使用workon命令来做到这一点:

            workon firstsite

Or:
workon secondsite

同样,当您在您的网站上完成工作时停用:

            deactivate

设置uWSGI应用程序服务器

现在我们有两个Django项目已经准备好了,我们可以配置uWSGI。uWSGI是一个应用程序服务器,可以通过名为WSGI的标准接口与应用程序进行通信。要了解更多信息,请阅读我们关于在Ubuntu 14.04上设置uWSGI和Nginx的指南。

Installing uWSGI

与上面链接的指南不同,在本教程中,我们将全面安装uWSGI,这将减少处理多个Django项目时的摩擦。在我们安装uWSGI之前,我们需要软件依赖的Python开发文件,我们还需要一个编译器。我们可以用这两种方法来获得
yum:

            sudo yum install python-devel gcc

现在开发文件已经可用了,我们可以通过输入以下命令来在全局安装uWSGI:

            sudo pip install uwsgi

我们可以通过向我们的网站传递信息来快速测试这个应用程序服务器,例如,我们可以通过键入以下命令来告诉它服务我们的第一个项目:

            uwsgi --http :8080 --home /home/user/Env/firstsite --chdir /home/user/firstsite -w firstsite.wsgi

在这里,我们告诉uWSGI使用位于我们〜/ Env目录下的虚拟环境来改变我们项目的目录,并使用存储在我们第一个第一站点目录中的wsgi.py文件来提供文件。对于我们的演示,我们告诉它在端口8080上提供HTTP服务。如果你在浏览器中访问服务器的域名或IP地址,然后是:8080,你将再次看到你的站点(/ admin界面中的静态元素获得“ 还没有工作)。完成测试后,在终端中输入CTRL-C。

Creating Configuration Files 创建配置文件

从命令行运行uWSGI对测试非常有用,但对于实际的部署并不是特别有用,我们将以“Emperor模式”运行uWSGI,它允许主进程在给定一组配置文件的情况下自动管理单独的应用程序。

创建一个将保存您的配置文件的目录。由于这是一个全局过程,因此我们将创建一个名为/ etc / uwsgi / sites的目录来存储我们的配置文件。在创建它之后移动到目录中:

            sudo mkdir -p /etc/uwsgi/sitescd /etc/uwsgi/sites

在这个目录中,我们将放置我们的配置文件。我们需要为每个我们正在服务的项目提供配置文件。uWSGI进程可以采用各种格式的配置文件,但由于其简单性,我们将使用.ini文件。

为您的第一个项目创建一个文件,并在文本编辑器中打开它:

             sudo nano firstsite.ini

在里面,我们必须从[uwsgi]节标题开始。我们所有的信息将在这个标题下面。我们也将使用变量来使我们的配置文件更加可重用。在标题之后,使用第一个项目的名称设置一个名为project的变量。用拥有项目文件的普通用户名设置另一个变量。添加一个名为base的变量,使用您的用户名来建立用户主目录的路径:

            [uwsgi]project = firstsiteusername = userbase = /home/%(username)                

接下来,我们需要配置uWSGI,以便正确处理我们的项目。我们需要通过设置chdir选项来切换到根项目目录。我们可以通过使用%(variable_name)语法来组合主目录和项目名称设置。当配置被读取时,这将被变量的值替换。

以类似的方式,我们将为我们的项目指出虚拟环境。通过设置模块,我们可以准确地指出如何与我们的项目进行交互(通过从项目目录中的wsgi.py文件中导入可调用的“应用程序”)。这些项目的配置将如下所示:

            [uwsgi]project = firstsiteusername = userbase = /home/%(username)chdir = %(base)/%(project)home = %(base)/Env/%(project)module = %(project).wsgi:application

我们想要创建一个拥有5workers的主流程,我们可以通过添加这个来实现:

            [uwsgi]project = firstsiteusername = userbase = /home/%(username)chdir = %(base)/%(project)home = %(base)/Env/%(project)module = %(project).wsgi:applicationmaster = trueprocesses = 5

接下来,我们需要指定uWSGI应该如何监听连接。在我们对uWSGI的测试中,我们使用了HTTP和一个网络端口。既然我们要使用Nginx作为反向代理,我们有更好的选择。

由于没有使用网络端口,因为所有组件都在一台服务器上运行,所以我们可以使用Unix套接字。这是更安全的,并提供更好的性能。这个套接字不会使用HTTP,而是使用uWSGI的uwsgi协议,这是一个为与其他服务器通信而设计的快速二进制协议。Nginx可以使用uwsgi协议本地代理,所以这是我们最好的选择。

我们需要设置将运行该进程的用户。我们还将修改套接字的权限和所有权,因为我们将给予Web服务器写入权限。套接字本身将存储在/ run / uwsgi目录中(我们将创建这个目录)uWSGI和Nginx都可以访问它。我们将设置vacuum选项,以便在服务停止时自动清除套接字文件:

            [uwsgi]project = firstsiteusername = userbase = /home/%(username)chdir = %(base)/%(project)home = %(base)/Env/%(project)module = %(project).wsgi:applicationmaster = trueprocesses = 5uid = %(username)socket = /run/uwsgi/%(project).sockchown-socket = %(username):nginxchmod-socket = 660vacuum = true

有了这个,我们的第一个项目的uWSGI配置就完成了。保存并关闭文件。
使用变量设置文件的优点非常简单,可重复使用。将您的第一个项目文件配置使用复制到您的第二个配置文件的基地:

            sudo cp /etc/uwsgi/sites/firstsite.ini /etc/uwsgi/sites/secondsite.ini

用你的文本编辑器打开第二个配置文件:

            sudo nano /etc/uwsgi/sites/secondsite.ini

我们只需要在这个文件中改变一个单独的值,以使其为我们的第二个项目工作。使用您用于第二个项目的名称修改项目变量:

            [uwsgi]project = firstsiteusername = userbase = /home/%(username)chdir = %(base)/%(project)home = %(base)/Env/%(project)module = %(project).wsgi:applicationmaster = trueprocesses = 5uid = %(username)socket = /run/uwsgi/%(project).sockchown-socket = %(username):nginxchmod-socket = 660vacuum = true                

完成后保存并关闭文件,第二个项目应该准备好了

Create a Systemd Unit File for uWSGI 为uWSGI创建一个Systemd单元文件

我们现在有用于服务我们的Django项目的配置文件,但是我们还没有使这个过程自动化。接下来,我们将创建一个Systemd单元文件,以在启动时自动启动uWSGI。

我们将在保存用户创建的单元文件的/ etc / systemd / system目录中创建单元文件,我们将调用我们的文件uwsgi.service:

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

首先从单元部分开始,该部分用于指定元数据。我们将简单地描述一下我们的服务:

            [Unit]Description=uWSGI Emperor service

接下来,我们将打开[Service]部分。我们将使用ExecStartPre指令来设置运行我们的服务器所需的部分。这将确保/ sure / uwsgi目录被创建,并且我们的普通用户拥有Nginx组作为组拥有者。即使它们已经存在,带有-p标志的mkdir和chown命令也会成功返回。这是我们想要的。

对于由ExecStart指令指定的实际启动命令,我们将指向uwsgi可执行文件。 我们会告诉它以“Emperor模式”运行,允许它使用它在/ etc / uwsgi / sites中找到的文件来管理多个应用程序。 我们还将添加上面所需的Systemd来正确管理进程。这些来自uWSGI文档:

            [Unit]Description=uWSGI Emperor service[Service]ExecStartPre=/usr/bin/bash -c 'mkdir -p /run/uwsgi; chown user:nginx /run/uwsgi'ExecStart=/usr/bin/uwsgi --emperor /etc/uwsgi/sitesRestart=alwaysKillSignal=SIGQUITType=notifyNotifyAccess=all    

现在,我们需要做的就是添加[Install]部分。 这使我们能够指定服务应该何时自动启动。 我们将把我们的服务与多用户系统状态联系起来。当系统设置为多个用户(正常操作条件),我们的服务将被激活:

            [Unit]Description=uWSGI Emperor service[Service]ExecStartPre=/usr/bin/bash -c 'mkdir -p /run/uwsgi; chown user:nginx /run/uwsgi'ExecStart=/usr/bin/uwsgi --emperor /etc/uwsgi/sitesRestart=alwaysKillSignal=SIGQUITType=notifyNotifyAccess=all[Install]WantedBy=multi-user.target

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

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

Install and Configure Nginx as a Reverse Proxy

通过配置uWSGI并准备就绪,我们现在可以安装和配置Nginx作为我们的反向代理,可以使用yum来下载和安装:

            sudo yum install nginx

一旦Nginx安装好了,我们可以继续编辑主配置文件:

                http {. . .include /etc/nginx/conf.d/*.conf;server {}server {}server {listen 80 default_server;server_name localhost;. . .

我们创建的块将保存我们uWSGI站点的配置。现在我们将覆盖第一个服务器模块所需的指令。

首先,我们需要告诉服务器端应该回应哪个端口号和域名,我们假设您的每个站点都有一个域名:

                server {listen 80;server_name firstsite.com www.firstsite.com;}

接下来,我们将告诉Nginx,我们不需要担心失踪的图标。然后,我们将指定在请求这些文件时收集我们第一个网站的静态资产的目录。 Nginx可以直接把它们从这个目录传给客户端:

                server {listen 80;server_name firstsite.com www.firstsite.com;location = favicon.ico { access_log off; log_not_found off; }location /static/ {root /home/user/firstsite;}}

接下来,我们创建一个全面的位置块,将所有其他查询直接传递给uWSGI。我们将包含/ etc / nginx / uwsgi_params文件中的uwsgi参数,并将流量传递给uWSGI服务器设置的套接字:

                server {listen 80;server_name firstsite.com www.firstsite.com;location = favicon.ico { access_log off; log_not_found off; }location /static/ {root /home/user/firstsite;}location / {include uwsgi_params;uwsgi_pass unix:/run/uwsgi/firstsite.sock;}}

这样,我们的第一个服务器块就完成了。

我们其他网站的第二个服务器块将几乎相同。您可以复制并粘贴我们刚创建的服务器块来开始。您需要修改站点应该响应的域名,站点的静态文件的位置以及站点的套接字文件:

                server {listen 80;server_name secondsite.com www.secondsite.com;location = favicon.ico { access_log off; log_not_found off; }location /static/ {root /home/user/secondsite;}location / {include uwsgi_params;uwsgi_pass unix:/run/uwsgi/secondsite.sock;}}

完成这一步后,保存并关闭文件

检查Nginx文件的语法以确保你没有任何错误:

                sudo nginx -t

如果没有错误报告,我们的文件状况良好。

我们还需要完成一项任务,才能使我们的网站正常运行。由于Nginx正在直接处理静态文件,因此需要访问相应的目录。我们需要为它的主目录提供可执行的权限,这是它唯一缺乏的权限。

最安全的方法是将Nginx用户添加到我们自己的用户组中。
然后,我们可以将可执行权限添加到我们的主目录的组所有者,给Nginx提供足够的访问权限来提供文件:

            sudo usermod -a -G user nginxchmod 710 /home/user

现在,我们可以启动Nginx服务器和uWSGI进程:

            sudo systemctl start nginxsudo systemctl start uwsgi

您现在应该可以通过访问更多的域名来访问您的两个项目。公共和管理界面都应按预期工作。

如果这一切顺利,您可以通过输入以下命令启用这两项服务:

            sudo systemctl enable nginxsudo systemctl enable uwsgi

Conclusion

在本指南中,我们已经建立了两个Django项目,每个项目都在自己的虚拟环境中。我们已经将uWSGI配置为使用为每个项目配置的虚拟环境独立地为每个项目提供服务。之后,我们将Nginx设置为反向代理来处理客户端连接,并根据客户端请求提供正确的项目。

Django通过提供许多常见的组件来使创建项目和应用程序变得简单,你要专注于独特的元素。通过利用本文中的通用工具链描述,您可以轻松地为从单个服务器创建的应用程序提供服务。

转载于:https://blog.51cto.com/12419955/2063269

如何在CentOS 7上使用uWSGI和Nginx来运行Django应用程序相关推荐

  1. 2019 年如何在 CentOS 7 上安装最新版 Nginx

    本文首发:开发指南:如何在 CentOS 7 上安装 Nginx Nginx 读作 engine x, 是一个免费的.开源的.高性能的 HTTP 和反向代理服务,主要负责负载一些访问量比较大的站点. ...

  2. centos nginx不是命令_2019 年如何在 CentOS 7 上安装最新的 Nginx

    Nginx 读作 engine x, 是一个免费的.开源的.高性能的 HTTP 和反向代理服务,主要负责负载一些访问量比较大的站点. Nginx 可以作为一个独立的 Web 服务,也可以用来给 Apa ...

  3. centos7使用基础教程_如何在CentOS 7上使用Metricbeat收集基础结构指标

    centos7使用基础教程 The author selected the Computer History Museum to receive a donation as part of the W ...

  4. 如何在 CentOS 7 上安装 Nginx

    本文首发:开发指南:如何在 CentOS 7 上安装 Nginx Nginx 读作 engine x, 是一个免费的.开源的.高性能的 HTTP 和反向代理服务,主要负责负载一些访问量比较大的站点. ...

  5. opencv 安装_如何在 CentOS 8 上安装 OpenCV

    本文最先发表在: 如何在 CentOS 8 上安装 OpenCV​www.itcoder.tech OpenCV(Open Source Computer Vision Library) 是一个开源的 ...

  6. centos7 安装git_如何在 CentOS 7 上挂载 Amazon EFS 文件系统?

    如何为数千个 Amazon EC2 实例提供大规模并行共享访问模式? 在本周,为大家做的分享是关于如何在 CentOS 7 上挂载 Amazon EFS 文件系统.Amazon EFS 可以让您的应用 ...

  7. 如何在 CentOS 7 上生成 SSL 证书为 Nginx 加密

    本文首发:开发指南:如何在 CentOS 7 上安装 Nginx Let's Encrypt 是由 Internet Security Research Group (ISRG) 开发的一个自由.自动 ...

  8. fortran安装_如何在 CentOS 8 上安装 GCC

    本文最先发布在: 如何在 CentOS 8 上安装 GCC​www.itcoder.tech GNU 编译器集合是一系列用于语言开发的编译器和库的集合,包括: C, C++, Objective-C, ...

  9. centos 使用java_如何在CentOS 8上安装Java

    Java是用于构建不同类型的应用程序和系统的最流行的编程语言之一. Java有两种不同的实现,OpenJDK和Oracle Java,两者之间几乎没有区别,只是Oracle Java具有一些其他的商业 ...

最新文章

  1. 【数据竞赛】竞赛宝典黑科技:基于开源结果的高端融合策略
  2. imoocLinux环境变量配置文件笔记
  3. 不等式约束的拉格朗日乘数法_Abaqus血管支架仿真|接触约束执行方式
  4. Character.isLetterOrDigit(ch)判断ch是否为字母或数字
  5. 软件工程学习进度第六周暨暑期学习进度之第六周汇总
  6. centos安装后连不上网
  7. GridView中BoundField重复绑定数据
  8. 【动态主席树】ZOJ 2112【树状数组+主席树】
  9. 学术会议html模板,标准的学术会议的通知模板
  10. 8片74151扩展为64选1数据选择器
  11. 微型计算机内存容量大小一般是指什么的容量,通常说的计算机内存大小指的是什么?...
  12. MAC压缩文件 密码 加密ZIP
  13. python高频面试题_02-27 朴素贝叶斯
  14. NOIP2016提高组初赛难点整理
  15. lightroom使用小结六 调整作品全局色彩
  16. Interviewing at Amazon — Leadership Principles Reading Notes
  17. python下载豆丁网文档
  18. 外贸软件如何提升机械行业进出口管理效率
  19. 人工智能学习Part,II
  20. 二阶段目标检测网络-Mask RCNN 详解

热门文章

  1. 实战Gradle——第1章 项目自动化介绍
  2. python打印出指定目录下的所有文件夹和文件名(递归实现)
  3. App 运营的指标具体都有哪些?(二)
  4. 百度搜索效果(页面传来数据地址,由服务器去获取)
  5. jq 实现发送验证码倒计时功能
  6. python学习第一章要点
  7. 实战经验:MySQL 构建高并发网站性能优化
  8. 或许有一两点你不知的C语言特性
  9. UIBezierPath 的使用介绍
  10. 在TMG2010中发布Web服务器场