1. 程式人生 > 其它 >Django3開發個人部落格:部署

Django3開發個人部落格:部署

技術標籤:Djangonginxdjangopython

一、部署準備

  • 本站採用uwsgi+nginx+supervisor的方式來在阿里雲伺服器上進行部署。

  • 使用xshell連線遠端伺服器。

  • 安裝Python3環境,可參考 Centos7安裝Python3

  • 安裝redis,可參考 Centos7安裝redis6.0

  • 安裝MySQL,可參考 Centos7安裝MySQL8.0

  • 安裝MySQL後建立Django專案需要使用的資料庫。

  • 安裝專案中用到的依賴:

      # windows10下。
      pip freeze > requirements.txt
      # 將得到的requirements.txt複製至centos7下。
      pip3 install -r requirements.txt
    
      安裝mysqlclient可能出的錯:OSError: mysql_config not found
      執行命令:
      yum install mysql-devel gcc gcc-devel python-devel
    
  • 在伺服器上建立新使用者,並賦予一定許可權。

二、部署程式碼

  • 本站的原始碼除settings.py以外均可在 GitHub中檢視。

  • 使用git拉取專案原始碼:

      [[email protected] ~]$ git clone https://github.com/Zhangzyb/MyBlog.git
      Cloning into 'MyBlog'...
      remote: Enumerating objects: 410, done.
      remote: Counting objects: 100% (410/410), done.
      remote: Compressing objects: 100% (282/282), done.
      remote: Total 846 (delta 178), reused 309 (delta 107), pack-reused 436
      Receiving objects: 100% (846/846), 1.13 MiB | 20.00 KiB/s, done.
      Resolving deltas: 100% (367/367), done.
    
  • 配置settings.py檔案:

      DEBUG = False # 改成False
      ALLOWED_HOSTS = ['.zhangzyb.icu','127.0.0.1','localhost']
      EMAIL_PORT = 465 # 修改郵件埠號,阿里雲對個人不開放22埠
      # 將所有的靜態檔案收集到一起
      STATIC_ROOT = os.path.join(BASE_DIR, 'staticall')
    
  • 資料庫遷移:

      python3 manage.py makemigrations
      python3 manage.py migrate
    

三、使用uwsgi+nginx部署Django專案

  • uwsgi可以使用命令列的方式執行Django,同時支援以配置檔案的方式來執行。

      pip3 install uwsgi
      # uwsgi配置檔案
      # /home/zyb/MyBlog/Blog/uwsgi.ini
      [uwsgi]
      chdir=/home/zyb/MyBlog/Blog
      module=Blog.wsgi:application
      master=true
      processes=4
      socket=/home/zyb/MyBlog/Blog/blog.sock
      vacuum=true
    
      執行命令:uwsgi --ini uwsgi.ini
    
  • Nginx負責處理靜態檔案。

      # 收集靜態檔案
      python3 manage.py collectstatic
    
      # 安裝nginx
      yum install nginx
      # 修改nginx.conf
      # /etc/nginx/nginx.conf
      user zyb; # 修改為新建使用者
      worker_processes auto;
      error_log /var/log/nginx/error.log;
      pid /run/nginx.pid;
      ...
    
      # 在/etc/nginx/conf.d目錄下建立blog.conf配置檔案
      # /etc/nginx/conf.d/blog.conf
      upstream django {
      	 server unix:///home/zyb/MyBlog/Blog/blog.sock; # for a file socket
      	# server 127.0.0.1:8080; # for a web port socket (we'll use this first)
      }
    
      # configuration of the server
      server {
      	# the port your site will be served on
      	# the domain name it will serve for 123.57.237.231
      	server_name www.zhangzyb.icu; # substitute your machine's IP address or FQDN
      	charset     utf-8;
    
      	# max upload size
      	client_max_body_size 75M;   # adjust to taste
    
      	# Django media
      	location /media  {
      		alias /home/zyb/MyBlog/Blog/uploads;  # your Django project's media files - amend as required
      	}
    
      	location /static {
      		alias /home/zyb/MyBlog/Blog/staticall; # your Django project's static files - amend as required
      	}
    
      	# Finally, send all non-media requests to the Django server.
      	location / {
      		uwsgi_pass  django;
      		include     /home/zyb/MyBlog/Blog/uwsgi_params; # the uwsgi_params file you installed
      	}
      }
    
      # 重啟nginx
      systemctl restart nginx
    
  • 專案檔案樹型結構圖。

      ├── article
      ├── Blog
      ├── blog.sock
      ├── celery_tasks
      ├── comment
      ├── manage.py
      ├── static
      ├── staticall
      ├── templates
      ├── uploads
      ├── uwsgi.ini
      └── uwsgi_params
    
  • 更詳細的uwsgi+nginx部署Django專案可檢視官方文件 uwsgi部署Django

四、使用supervisor守護程序

  • supervisor可以將程序以後臺的方式運行同時在程序因意外停止後重啟程序。

  • 本站使用supervisor管理兩個程序,uwsgi和celery。

  • supervisor的配置:

      # 安裝supervisor
      pip3 install supervisor
    
      # 生成配置檔案
      echo_supervisord_conf > /etc/supervisord.conf
    
      # 避免許可權問題,需要修改配置檔案
      [unix_http_server]
      file=/etc/supervisor/var/supervisor.sock   ; # 修改socket檔案的位置
      ...
      [supervisord]
      logfile=/etc/supervisor/log/supervisord.log ; # 修改日誌檔案的位置
      ...
      pidfile=/etc/supervisor/var/supervisord.pid ; # 修改pidfile的位置
      ...
      [supervisorctl]
      serverurl=unix:///etc/supervisor/var/supervisor.sock ; # use a unix:// URL  for a unix socket
      ...
      [include] # 去掉註釋
      files = /etc/supervisor/*.conf
    
      # 建立用於存放supervisor管理檔案的資料夾
      # mkdir /etc/supervisor
      # mkdir /etc/supervisor/var
      # mkdri /etc/supervisor/log
    
  • 使用supervisor管理uwsgi:

      # /etc/supervisor/uwsgi.conf
      [program:uwsgi]
      command=uwsgi --ini uwsgi.ini
      directory=/home/zyb/MyBlog/Blog
      user=zyb
      autorestart=true
      autostart=true
      startretries=3
      redirect_stderr=true
      startsecs=5
      stdout_logfile=/etc/supervisor/log/uwsgi.log
      stopasgroup=true
      killasgroup=true
      priority=999
    
  • 使用supervisor管理Celery:

      # /etc/supervisor/celery.conf
      [program:celery]
      command=celery -A celery_tasks.main worker -l INFO
      directory=/home/zyb/MyBlog/Blog
      user=zyb
      autorestart=true
      autostart=true
      startretries=3
      redirect_stderr=true
      startsecs=5
      stdout_logfile=/etc/supervisor/log/celery.log
      stopasgroup=true
      killasgroup=true
      priority=999
    
  • 關於.conf檔案中的引數參考官方文件 programx-section

  • 執行supervisor:

      supervisord -c /etc/supervisod.conf
      supervisorctl status
    
  • 執行結果:

  • 關於supervisor的基本使用可參考這篇部落格:使用supervisor守護程序

  • 關於supervisor的更多知識可檢視官方文件:Supervisor