1. Prepare
1.1 Criando grupos de usuários zanhu
groupadd zanhu
1,2 zanhu usuários criar e participar de grupos de usuários dentro zanhu
useradd -m zanhu -g zanhu
1.3 password
passwd zanhu
1.4 outorga permissão de execução ao zanhu usuário
chmod +x /home/zanhu
1,5 dependente do sistema de montagem pretendida
yum install python-devel zlib-devel mysql-devel libffi-devel bzip2-devel openssl-devel java gcc wget
Como o rpm instalado mysql8.0, utilizando o anterior rpm -qa|grep mysql
comando para visualizar já contém mysql-community-devel não há necessidade de instalar mysql-devel
1.6 instalação dos Serviços de Implantação necessário
yum install -y nginx redis supervisor
1.7 Ajustar o boot
systemctl enable redis nginx supervisord
1.8 o usuário para mudar para zanhu
su - zanhu
projeto Xftp Django 1,9 para copiar / home / diretório zanhu, atenção modificar proprietário do projeto, é um grupo de zanhu
chown zanhu:zanhu -R zanhu/
1.10 é criado no diretório do diretório do projeto registros, usado para armazenar gunicorn, Daphne, ElasticSearch, log aipo
mkdir logs
1.11 gerados no âmbito do projecto conta com o ambiente virtual original
cd /root/zanhu
pipenv shell
pip free > /home/zanhu/zanhu/requirements.txt
1.12 para o diretório do projeto, instalar as dependências
Este método Caton em uso, pois sob o ambiente virtual original contendo minoria relativamente pequena em um ambiente de teste para download de dependências causa atrasos, removê-los para continuar após a instalação dependente
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple/ -r requirements.txt
2. Baixe e instale ElasticSearch
Porque Django versão palheiro do problema, apenas a versão elasticsearch2.4.6, o site oficial não tem recursos, pode ser baixado do github, e, em seguida, enviado para o servidor através Xftp
Baixar
tar -xf elasticsearch-2.4.6.tar.gz
3. Execute sob o diretório gunicorn projeto
/usr/local/python37/bin/gunicorn --env DJANGO_SETTINGS_MODULE=config.settings.production -b 127.0.0.1:8888 --chdir /home/zanhu/zanhu config.wsgi
4. Iniciar a ElasticSearch usuário zanhu
./elasticsearch-2.4.6/bin/elasticsearch
5. Iniciar aipo
/usr/local/python37/bin/celery --work=/home/zanhu/zanhu -A config.celery_app worker -l info
5.1 é mostrada a seguir, um arranque bem sucedido
[tasks]
. config.celery_app.debug_task
. djcelery_email_send_multiple
. zanhu.users.tasks.get_users_count
6. Iniciar Daphne
/usr/local/python37/bin/daphne -p 8000 config.asgi:application
7. Iniciar Nginx
7.1 nginx.conf Configuração
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
upstream channels-backend { # websocket请求转发配置
server localhost:8000;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://127.0.0.1:8888; # 动态请求转发给gunicorn服务
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /staticfiles/ {
root /home/zanhu/zanhu/zanhu; # staticfiles文件所在的目录路径
}
location /media/ {
root /home/zanhu/zanhu/zanhu; # media文件所在的目录路径
}
location /ws/ { # /ws/用于区分http请求和websocket
proxy_pass http://channels-backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
7.2 nginx Começando
systemctl start nginx
7,3 log de erro Ver nginx
tail -f /var/log/nginx/error.log
O fluxo do projeto Django implantação manual, digite o navegador ip para ver se a operação bem sucedida
8. Resumo das questões
Você não pode procurar dados usando a função de pesquisa ElasticSearch, pedido normal. A razão é ainda pensei que era um projeto executado sob o ambiente virtual original, um novo projeto, esqueça gerar um índice python3 manage.py rebuild_index
de implantação estiver concluída, arquivos estáticos e arquivos de mídia não pode ser carregado, pode ser estático problema de permissões de arquivo ou projeto Django roteamento problemas de configuração, o seguinte solução problema de configuração de encaminhamento
8,1 cookiecutter rota gerado:
from django.conf import settings
from django.urls import include, path
from django.conf.urls.static import static
from django.views.generic import TemplateView
from django.views import defaults as default_views
urlpatterns = [
# 用户
path("users/", include("zanhu.users.urls", namespace="users")),
# 第三方应用
path("search/", include("haystack.urls")),
# 项目
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
código de exibição de fonte static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
está disponível apenas no modo de depuração, não pode carregar arquivos estáticos em um ambiente de produção, então, fazer as seguintes alterações
#####修改后的urls.py
from django.conf import settings
from django.urls import include, path
from django.views.static import serve # 注意区别,导入django.views.static下的serve方法
from django.views.generic import TemplateView
from django.views import defaults as default_views
urlpatterns = [
# 用户
path("users/", include("zanhu.users.urls", namespace="users")),
# 第三方应用
path("search/", include("haystack.urls")),
# 项目
re_path("^static/(?P<path>.*)$", serve, document_root=settings.STATIC_ROOT) # 添加静态文件的路由
re_path("^media/(?P<path>.*)$", serve, document_root=settings.MEDIA_ROOT) # 添加media文件的路由
]
9. Utilização de controlo supervisor de implantação
9,1 na /etc/supervisord.d
cd /etc/supervisord.d
9.2 Edição zanhu_celery.ini
[program:celery]
# 执行用户
user = zanhu
# 执行的命令
command = /usr/local/python37/bin/celery --work=/home/zanhu/zanhu -A config.celery_app worker -l info
# 日志文件配置
loglevel = info
stdout_logfile = /home/zanhu/zanhu/logs/celery.log
stderr_logfile = /home/zanhu/zanhu/logs/celery_error.log
# 日志文件最大字节数
stdout_logfile_maxbytes = 100MB
# 备份数量
stdout_logfile_backups = 3
# 命名每个进程,便于管理
process_name = celery_worker%(process_num)s
# 启动的进程数,设置成服务器的CPU数
numprocs_start = 1
numprocs = 1
# 设置自启和重启
autostart = true
autorestart = true
redirect_stderr = true
9.3 Edição zanhu_daphne.ini
[program:daphne]
# 执行用户
user = zanhu
# 在该目录下执行下面command命令
directory = /home/zanhu/zanhu
# 执行的命令
command = /usr/local/python37/bin/daphne -p 8000 config.asgi:application
# 日志文件配置
loglevel = info
stdout_logfile = /home/zanhu/zanhu/logs/daphne.log
stderr_logfile = /home/zanhu/zanhu/logs/daphne_error.log
stdout_logfile_maxbytes = 100MB
stdout_logfile_backups = 3
# 给每个进程命名,便于管理
process_name = daphne_worker%(process_num)s
# 启动的进程数,设置成云服务器的vCPU数
numprocs_start = 1
numprocs = 1
max-requests = 5000
# 设置自启和重启
autostart = true
autorestart = true
redirect_stderr = True
9.4 Edição zanhu_elasticsearch.ini
[program:elasticsearch]
# 执行用户
user = zanhu
# 在该目录下执行下面command命令
directory = /home/zanhu/elasticsearch-2.4.6/bin/
# 执行的命令
command = /home/zanhu/elasticsearch-2.4.6/bin/elasticsearch -d
# 日志文件配置
loglevel = info
stdout_logfile = /home/zanhu/zanhu/logs/elasticsearch.log
stderr_logfile = /home/zanhu/zanhu/logs/elasticsearch_error.log
stdout_logfile_maxbytes = 100MB
stdout_logfile_backups = 3
# 给每个进程命名,便于管理
process_name = elasticsearch_worker%(process_num)s
# 启动的进程数,设置成云服务器的vCPU数
numprocs_start = 1
numprocs = 1
# 设置自启和重启
autostart = true
autorestart = true
redirect_stderr = True
9.5 Edição zanhu_gunicorn.ini
[program:gunicorn]
# 执行用户
user = zanhu
# 执行的命令
command = /usr/local/python37/bin/gunicorn --env DJANGO_SETTINGS_MODULE=config.settings.production -b 127.0.0.1:8888 --chdir /home/zanhu/zanhu config.wsgi
# 日志文件配置
loglevel = info
stdout_logfile = /home/zanhu/zanhu/logs/gunicorn.log
stderr_logfile = /home/zanhu/zanhu/logs/gunicorn_error.log
stdout_logfile_maxbytes = 100MB
stdout_logfile_backups = 3
# 给每个进程命名,便于管理
process_name = gunicorn_worker%(process_num)s
# 启动的进程数,设置成云服务器的vCPU数
numprocs_start = 1
numprocs = 1
# 最大访问次数,超过后重新启动
max-requests = 5000
# 设置自启和重启
autostart = true
autorestart = true
redirect_stderr = True
aommand = /usr/local/python3/bin/daphne -p 8000 config.asgi:application
9.6 Start Service
sudo systemctl start supervisord