Nginx - uWSGI 部署Django
Nginx+uWSGI部署Django项目
Django 简介
Django 是一个高级的Python 网络框架,可以快速开发安全和可维护的网站。 由经验丰富的开发者构建,Django负责处理网站开发中麻烦的部分,因此你可以专注于编写应用程序,而无需重新开发。 它是免费和开源的,有活跃繁荣的社区,丰富的文档,以及很多免费和付费的解决方案。
部署流程(CentOS 7)
安装 Django
安装 python3
$ yum install -y python3
创建一个虚拟环境
首先创建django
的工作目录:
$ mkdir my_django_app$ cd my_django_app
使用如下命令创建一个虚拟环境(venv
目录,里面包含了python的二进制包,pip等工具):
$ python3 -m venv venv
使用上面刚创建好的虚拟环境:
$ source venv/bin/activate
安装 Django
使用pip
工具安装:
(venv)$ pip install django
验证是否安装成功:
(venv)$ python -m django --version
创建一个 Django 项目
创建一个名为mydiangoapp
的项目:
(venv)$ django-admin startproject mydjangoapp
迁移数据库并创建一个管理用户:
(venv)$ cd mydjangoapp(venv)$ python manage.py migrate(venv)$ python manage.py createsuperuser# 接下来,会进入交互式命令,如下所示Username (leave blank to use 'agou-ops'): adminEmail address: suofeiyaxx@gamil.comPassword:Password (again):Superuser created successfully.
默认情况下,Django使用的是SQLite
数据库,如果用于生产环境,可以使用PostgreSQL
,MariaDB
, Oracle
或者MySQL
数据库.
:question:如果你是迁移的项目,运行以下步骤:
# 首先,清除初始迁移和删除默认的sqlite数据库(venv)$ find . -path "*/migrations/*.py" -not -name "__init__.py" -delete(venv)$ find . -path "*/migrations/*.pyc" -delete(venv)$ rm -f db.sqlite3# 运行如下命令同步迁移数据库(venv)$ python manage.py collectstatic(venv)$ python manage.py makemigrations(venv)$ python manage.py migrate
测试 Django 服务
(venv)$ python manage.py runserver [0.0.0.0:8000]
服务默认监听在本地的8000
端口,打开浏览器,访问 http://127.0.0.1:8000 检查服务状态即可。
取消激活虚拟环境
当所有任务都完成之后,如果想要返回到原来的终端,使用以下命令取消激活虚拟环境即可:
(venv)$ deactivate
配置 nginx 和 uwsgi
uwsgi 全局配置
sudo pip install uwsgisudo mkdir -p /etc/uwsgi/sitescd /etc/uwsgi/sitessudo vim mydjangoapp.ini
配置文件mydiangoapp.ini
中添加如下内容:
[uwsgi]project = <project_name>username = <user_name>base = /home/%(username)
chdir = %(base)/%(project)home = %(base)/Env/env_1module = %(project).wsgi:application
master = trueprocesses = 5
uid = %(username)socket = /run/uwsgi/%(project).sockchown-socket = %(username):nginxchmod-socket = 660vacuum = true
创建一个Unix socket
来使用uWSGI
协议来辅助 Ngx 反代:
# 编辑uwsgi的服务配置文件$ sudo vim /etc/systemd/system/uwsgi.service# ------------------------------[Unit]Description=uWSGI Emperor service
[Service]# <user_name>为用户名称ExecStartPre=/usr/bin/bash -c 'mkdir -p /run/uwsgi; chown <user_name>:nginx /run/uwsgi'ExecStart=/usr/bin/uwsgi --emperor /etc/uwsgi/sitesRestart=alwaysKillSignal=SIGQUITType=notifyNotifyAccess=all
[Install]WantedBy=multi-user.target
nginx 反代设置
server { listen 8000; server_name localhost;
location = favicon.ico { access_log off; log_not_found off; } location /static/ { root /home/<user_name>/<project_name>; }
location / { include uwsgi_params; uwsgi_pass unix:/run/uwsgi/<project_name>.sock; }}
增加权限及启动服务:
$ sudo nginx -t$ sudo usermod -a -G <user_name> nginx$ chmod 710 /home/<user_name>
$ sudo systemctl start nginx$ sudo systemctl start uwsgi$ sudo systemctl enable nginx$ sudo systemctl enable uwsgi
:smile:到此安装完成,打开浏览器访问 http://127.0.0.1:8000 测试即可。
其他
Django 使用 MySQL 数据库
安装mysql
客户端工具(服务器端在此不再赘述):
(venv)$ sudo yum install -y mysql-connector-python.x86_64 mysql-community-devel.x86_64 mysql-cluster-community-client.x86_64 mysql-shell.x86_64 mysql-router.x86_64 gccpip install mysqlclient # inside the virtual environment
修改配置文件settings.py
:
# 在行尾添加如下内容STATIC_ROOT = os.path.join(BASE_DIR, "static/")# 修改默认的数据库配置DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'first_db', # 数据库提前自行创建 'USER': 'root', 'PASSWORD': 'your-root-password', 'HOST': 'localhost', 'PORT': '', }}# 修改监听地址,默认为本地localhostALLOWED_HOSTS = ['your_ip_here']
如果有firewalld
防火墙,还需要:
$ sudo firewall-cmd --permanent --add-service=http$ sudo firewall-cmd --permanent --add-port=8000/tcp$ sudo firewall-cmd --complete-reload$ sudo firewall-cmd --list-all
参考资料
- Deploy Django: https://www.codingpaths.com/django/deploy-django/