使用Nginx、uWSGI和Django构建的系统部署应用程序到EC2上
总结
本文是一位初学者使用RESTful API和Swift开发iPhone优惠券发布服务的步骤,按照顺序写成的文章。由于在实施过程中逐步查找技术要素并进行实践,因此实施过程变得非常绕远。
我已经创建了一个能够在上一次的 Django 中向客户端提供图像的 Web API,还使其能够提供优惠券的图像,并且我认为所有必要的功能都已经实现。下一步是将其部署到服务器上,以便从公共环境中使用 API。
粗略的工作步骤是
-
- 在云平台上创建实例并安装所需的软件和包
- 将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。
部署环境的配置请参考这里。
看作中的一种选择
-
- 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是否运行。
这个步骤完成后,服务器部署已经完成。