使用Nginx、uWSGI和Django构建的系统部署应用程序到EC2上

总结

本文是一位初学者使用RESTful API和Swift开发iPhone优惠券发布服务的步骤,按照顺序写成的文章。由于在实施过程中逐步查找技术要素并进行实践,因此实施过程变得非常绕远。

我已经创建了一个能够在上一次的 Django 中向客户端提供图像的 Web API,还使其能够提供优惠券的图像,并且我认为所有必要的功能都已经实现。下一步是将其部署到服务器上,以便从公共环境中使用 API。

粗略的工作步骤是

    1. 在云平台上创建实例并安装所需的软件和包

 

    将API部署到服务器上

是的。

这篇文章总结了关于在服务器上部署API的内容。
如果您想要了解有关在云实例上搭建并安装必要软件和包的文章,请点击此处。

構成 – Compose/Constitute

使用Django开发的Web API通过Nginx、uWSGI和Django进行配置和运行。它们之间的关系如下所示:

Webクライアント <-> nginx <-> the socket <-> uwsgi <-> django

这次我们将为nginx分配8000号端口,为django分配8001号端口。当收到8000号端口的请求时,nginx将通过socket将请求传递给正在监听8001号端口的uwsgi。

部署环境的配置请参考这里。

system-stack.png

看作中的一种选择

    • Django + uWSGI + nginx (uWSGIチュートリアルの和訳)

 

    EC2上で Django + Nginx + uWSGI を試す

环境

亚马逊 Linux 2
Python 3.7.4
Django 3.0.3
SQLite 3.31.1

操作步驟

    • デプロイ資材の準備

DjangoのサーバでAPIを起動(テスト)

Settings.pyのALLOW_HOSTの設定を変更
Djangoサーバを起動

uwsgi経由でAPIを起動(テスト)

nginxでAPIを動かす

uwsgi_params の準備
nginx.confの編集
settings.pyの編集
*nginxの起動と接続確認

部署准备材料

使用Git将源代码等资料部署到服务器上。在事先将最新的资料推送到远程仓库中。

使用git clone命令将资源下载到服务器上。

$ git clone [リモートリポジトリのURL] 

在Django服务器上启动(测试)API。

更改Settings.py中ALLOW_HOSTS的设置。

在项目名称的目录下的Settings.py文件中,存在一个名为ALLOW_HOST的选项。只有指定的IP地址在这里进行了指定,Django才会启动。

应该默认是本地的,所以在Vim等编辑器中打开 Settings.py 并将其更改为实例的全局IP。另外,如果将 ALLOWED_HOSTS 设置为 [“*”],则可以在任何IP环境下启动。

启动Django服务器

在django项目的根目录下(即manage.py所在的文件夹),执行启动django服务器的命令。

$ python3 manage.py runserver 0.0.0.0:8000

我会通过浏览器等方式确认启动情况。确认后,我会通过CONTROL-C停止服务器。

在这里,你有没有想过为什么即使在django服务器上也可以使用API,为什么还要特意与nginx进行协调呢?我个人是这样想的。如果只是公开API,即使不与nginx等web服务器协调,也可以调用API。
在进行研究和尝试之后,我认为与nginx协调有以下两个好处。

    • nginxと連携させた方がセキュリティが強い

djangoサーバのみで公開するとdjango adminページにもアクセスできるため、パスワード認証を通れば第三者がモデルのデータを変更することが可能なのではと思います。

リクエストが沢山来た時の処理が早く、安定している(らしい)

通过uwsgi启动API(进行测试)

将启动Django服务器的操作执行在uwsgi中。
在这个过程中,通过–module选项指定.wsgi文件。文件名将会是[项目名称].wsgi。尽管同名文件不存在于目录中也没关系。

另外,您需要指定协议和端口。在这里,我们将协议设置为http,端口号设置为8000。

# uwsgiの起動
$ uwsgi --http :8000 --module ami_coupon_api.wsgi

我会确认您是否通过浏览器等访问并启动了该应用。

在Nginx上运行API

准备 uwsgi_params。

在django项目的目录下(与manage.py相同的位置),需要放置uwsgi_params文件。uwsgi_params文件存储在nginx的目录下,所以需要复制或创建符号链接。

同时,内容保持默认状态并没有任何问题。

# nginxのディレクトリに移動して uwsgi_paramsファイルをコピー
$ cd /etc/nginx/
$ sudo cp uwsgi_params [djangoプロジェクトのディレクトリ(manage.py と同じ場所)のパス]

编辑 nginx.conf

编辑nginx目录下的nginx.conf文件。需要根据自己的环境进行路径和端口的配置。

# nginxのディレクトリに移動
$ cd /etc/nginx/

# オリジナルのバックアップ を取っておく
$ sudo cp nginx.conf nginx.conf.org

# Vimでnginx.confを編集
$ sudo vi nginx.conf

编辑后的nginx.conf文件(内容根据环境而异)。


  ### 省略 ###

    upstream django {
        server 0.0.0.0:8001;  # 編集  djangoに割り当てるポートを設定します
    }


    server {
        listen       8000;   # nginxに割り当てるポート
        server_name  XXX.XXX.XXX.XXX;   # 編集
        root         /usr/share/nginx/html;
        charset      utf-8;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
        client_max_body_size 100M; # 編集

    location /static {
        alias /home/ec2-user/ami_api/static;
    }
        location / {
        uwsgi_pass django;   # 編集
        include /home/ec2-user/ami_api/uwsgi_params;   # 編集
        }
    }

  ### 省略 ###

编辑settings.py。

请在项目名称/settings.py中添加STATIC_ROOT的设置。使用Vim或其他编辑器打开settings.py,并添加以下设置。

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

一旦进行追加操作,将会应用设置。

# manage.pyのあるディレクトリまで移動してコマンドを実行
$ python3 manage.py collectstatic

成功后,将添加一个名为”static”的目录。

启动nginx并进行连接确认。

# nginx の起動
$ sudo systemctl start nginx

# 起動の確認
$ systemctl status nginx

只要在屏幕上显示为“运行中”,就表示已经启动了。

● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) 

另外,nginx的停止和重新启动命令如下所示。

# 停止
$ systemctl stop nginx

# 再起動
$ systemctl restart nginx

通过浏览器等访问和启动,并确认API是否运行。

这个步骤完成后,服务器部署已经完成。

广告
将在 10 秒后关闭
bannerAds