Развертывание веб-приложения Django

Python Django

Цель этой статьи: Развернуть приложения Django на сервере centos7.x с помощью nginx и uwsgi (или gunicorn).

0. Окружающая среда

Сервер, используемый в этой статье, представляет собой 64-разрядный сервер Centos7.0 от Tencent Cloud, другие Linux аналогичны, и некоторые команды установки запрашиваются самостоятельно.

Только что полученный сервер регистрируется как root.Сначала мы создаем нового пользователя и назначаем права.

useradd -m username # 新建用户
passwd username # 修改密码
usermod -a -G adm username
usermod -a -G sudo username
exit # 分配权限后退出

Новый пользователь вошел в систему после выхода из системы.

Затем установить различные компоненты, такие как python3, mysql и т.д. В начале были всякие проблемы, а затем привык

@小小ХоизДайте Python3.6 поработать на Centos7.x какое-то время~Сценарий одним щелчком мыши здесь успешно установлен.
wget https://raw.githubusercontent.com/LunacyZeus/Python3.6-for-Centos7.0/master/install.sh && sh install.sh

Протестируйте установку pip

python3 -m pip install --upgrade pip
python3 -m pip install requests

Об ошибках не сообщается, py3 установлен

1. Приложение Джанго

Загрузите код со склада, локальный каталог /home/username/myblog, здесь предполагается, что папка приложения django называется myblog, а база данных приложения — mysql.

git clone <yourcode>
cd myblog

# 安装虚拟环境
python3 -m pip install virtualenv 
virtualenv venv
. venv/bin/activate

# 安装依赖文件
pip install -r requirements.txt

# 静态文件处理
python manage.py collectstatic

с последующей миграцией базы данных

Установил mysql сначала поставил пароль

mysql -u root -p

> set password for 'root'@'localhost' =password('password');

И настроить удаленное подключение

> grant all privileges on *.* to root@'%'identified by 'password';

Затем создайте новое имя базы данных, используемое в django, измените пароль в settings.py, после чего вы сможете выполнить миграцию базы данных и т. д.

python manage.py migrate
python manage.py createsuperuser
....
python manage.py runserver 0.0.0.0:8001 

Затем откройте общедоступную сеть сервера для просмотра, он может быть загружен и работает, но статические файлы еще не загружены.

2.0 uwsgi & nginx

О роли nginx и uwsgi:Какая связь между nginx uwsgi wsgi django и этими вещами?

Процитируйте это здесь.

1. Во-первых, nginx — это внешний сервисный интерфейс, и внешние браузеры обращаются к nginx через url.

2. nginx получает HTTP-запрос, отправленный браузером, анализирует пакет и URL-адрес. Если это запрос статического файла, он напрямую обращается к каталогу статических файлов, настроенному пользователем для nginx, и напрямую возвращает статический файл, запрошенный пользователем. пользователя. Если это не статический файл, а динамический запрос, то nginx пересылает запрос в uwsgi. После того, как uwsgi получает запрос, он обрабатывает пакет в формат, приемлемый для wsgi, и отправляет его в wsgi, который вызывает определенный файл приложения в соответствии с запросом, функция определенного файла, после окончательной обработки возвращаемое значение будет снова передано в wsgi, wsgi упакует возвращаемое значение в формат, который может получить uwsgi, и uwsgi будет получить wsgi Отправленный запрос перенаправляется в nginx, и nginx в конечном итоге возвращает браузеру возвращаемое значение.

3. Чтобы знать, что первый уровень nginx не обязателен, uwsgi может завершить весь процесс взаимодействия с браузером, но необходимо учитывать некоторые ситуации

  • Из соображений безопасности браузер не может получить прямой доступ к программе, но через nginx nginx открывает только определенный интерфейс, а uwsgi сам по себе является интерфейсом интрасети, поэтому персонал по эксплуатации и обслуживанию может добавлять ограничения безопасности на nginx для защиты программы. , эффект.
  • Проблема балансировки нагрузки, одного uwsgi, вероятно, недостаточно, даже если открыто несколько заданий, в конце концов, процессор и память машины ограничены, а nginx выступает в качестве прокси, один nginx может проксировать несколько uwsgi, чтобы завершить загрузку uwsgi. сбалансированный.
  • Для проблемы статических файлов нерационально использовать django или uwsgi для обработки статических файлов, а их обработка файлов не так хороша, как у nginx, поэтому вся обработка статических файлов выполняется непосредственно nginx. вообще не проходить через uwsgi и все, что за ним стоит.

принцип:

the web client <-> the web server(nginx) <-> the socket <-> uwsgi <-> Django

2.1 uwsgi

Сначала установите и настройте uwsgi

(venv) pip install uwsgi

Проверьте, работает ли это:

# test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return b"Hello World" 

бегать

uwsgi --http :8000 --wsgi-file test.py

Откройте и увидите Hello world, значит подключено

the web client <-> uWSGI <-> Python

Затем создайте новый файл uwsgi.ini в каталоге проекта.

# vim uwsgi.ini

[uwsgi]
# Django-related settings
socket = /tmp/www.wangzhy.com.socket

# the base directory (full path)
chdir = /home/username/myblog

# Django s wsgi file
module = blog.wsgi

# process-related settings
# master
master = true

# maximum number of worker processes
processes = 4

# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true

Документация по настройке параметров находится здесь:Быстрый старт для приложений Python/WSGI

Затем запустите:

uwsgi --ini uwsgi.ini

# 后台运行
# uwsgi --ini mysite_uwsgi.ini --logto mysite.log &

Откройте , чтобы получить доступ к вашей веб-странице.

2.2 nginx

установка nginx для centos:Установите Nginx на CentOS 7

sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install nginx

# 开启
systemctl start nginx.service

Посетите ip, и вы увидите изображение выше, и установка прошла успешно.

Создайте новый blog.conf в /etc/nginx/conf.d.

server {
    listen      80;
    server_name 127.0.0.1 <yoursite.com>;
    charset     utf-8;

    client_max_body_size 75M;

    # media文件夹
    location /media  {
        alias /home/username/myblog/media;  
    }

    # static文件夹
    location /static {
        alias /home/username/myblog/static;
    }

    location / {
        include     uwsgi_params;
        uwsgi_pass unix:/tmp/www.wangzhy.com.socket;
    }
}

потом

nginx -t # 检查文件

service nginx restart # 重启nginx

Затем включите службу uswgi, и вы сможете получить доступ к сайту.

uwsgi --ini uwsgi.ini