部署前环境

GCP+CentOS7

BBR 开启(一键脚本)

wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh && chmod +x bbr.sh && ./bbr.sh

安装python3

系统环境准备

yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make

开始源码安装

wget https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz
tar -xzvf Python-3.6.3.tgz -C /tmp
cd  /tmp/Python-3.6.3/

./configure --prefix=/usr/local
make
make altinstall

mv /usr/bin/python /usr/bin/python.bak
ln -s /usr/local/bin/python3.6 /usr/bin/python
ln -s /usr/local/bin/pip3.6 /usr/bin/pip
# 如此实现了 python 命令为版本3,python2 命令为版本2
# 但是 centos 系统的一些组件还需要 python2所以需要修复它们

修复依赖 python2 的系统组件

/usr/bin/yum

/usr/libexec/urlgrabber-ext-down

上面的文件第一行 python 改为 python2

到此处可以新建磁盘映像,以后方便使用,直接从这里开始即可。

nginx(mariadb) 安装

nginx安装

在django连接 mysql前需要安装 mysql 驱动,中间如果报 mysqlclient 相关问题:

# 安装mysqlclient出问题
#    centos 7:
yum install python-devel mariadb-devel -y
#    ubuntu:
sudo apt-get install libmysqlclient-dev
#    然后:
pip install mysqlclient

vitualenv 安装及初始配置

  1. pip install virtualenv
    pip install virtualenvwrapper
  2. nano ~/.bashrc
    # 在文件最后插入下面两行:
    
    export WORKON_HOME=$HOME/.virtualenvs
    source /usr/local/bin/virtualenvwrapper.sh
    
    # 然后运行下面的命令
    source ~/.bashrc
    find / -name "virtualenv"
    ln -s 上一步结果 /usr/bin/virtualenv
  3. 使用方法

    # 新建虚拟环境
    mkvirtualenv 名称
    # 切换虚拟环境
    workon 名称

开发环境 pip 包的转移

在开发环境中:

pip freeze > r.txt

将 r.txt 转移到生产环境中,然后 pip 安装里面的包.

#如果开发环境中有 mysqlclient ,需要先在系统中安装依赖
yum install python-devel mariadb-devel -y

#然后:
pip install -r r.txt

正式部署 Django项目

用 git 传输项目目录到服务器

uwsgi

  1. 安装 uwsgi

    pip install uwsgi
  2. django原生服务器测试项目

    python manage.py runserver 0.0.0.0:8000

    访问测试,并debug。

    理想情况是项目完全显示正常。

  3. 用 uwsgi 测试服务

    uwsgi --http :8000 --module 项目中的wsgi 文件
    # 最后的路径不用/ 用.  例如:(pwd 是在 django 项目的根目录,则 wsgi 的模块位置在项目名称.wsgi)
    uwsgi --http :8000 --module sspanel.wsgi

    理想情况是除丢失静态文件以外均正常,此时 uwsgi 测试成功。

使用 nginx 处理请求

  1. 在项目中新建nginx配置文件***.conf,模板如下:

     # the upstream component nginx needs to connect to
     upstream django {
     # server unix:///path/to/your/mysite/mysite.sock; # for a file socket
     server 127.0.0.1:8000; # for a web port socket (we'll use this first)
     }
     # configuration of the server
    
     server {
     # the port your site will be served on
     listen      80;
     # the domain name it will serve for
     server_name 你的ip地址 ; # 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 你的目录/Mxonline/media;  # 指向django的media目录
     }
    
     location /static {
         alias 你的目录/Mxonline/static; # 指向django的static目录
     }
    
     # Finally, send all non-media requests to the Django server.
     location / {
         uwsgi_pass  django;
         include     uwsgi_params; # the uwsgi_params file you installed
     }
     }

修改:

  • server_name
  • media/static 目录绝对路径
  1. 将配置文件软链到 nginx 规定目录

    ln -s ****.conf /etc/nginx/conf.d/
    # 用绝对路径表示 conf 文件,减少麻烦
    
    #重启 nginx
    service nginx restart

将 django 静态文件统一收集到 static 目录

# 在项目的 settings.py 加入静态根目录
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
# 同时注释掉开发时的STATICFILES_DIRS设置
# 顺便:
debug= false

#运行命令
python manage.py collectstatic

用配置文件的方式启动 uwsgi

  1. 在项目 conf 目录中新建 uwsgi.ini

     # mysite_uwsgi.ini file
     [uwsgi]
    
     # Django-related settings
     # the base directory (full path)
     chdir           = /projects/django-sspanel-backend
     # Django's wsgi file
     module          = sspanel.wsgi
     # the virtualenv (full path)
    
     # process-related settings
     # master
     master          = true
     # maximum number of worker processes
     processes       = 10
     # the socket (use the full path to be safe
     socket          = 127.0.0.1:8000
     # ... with appropriate permissions - may be needed
     # chmod-socket    = 664
     # clear environment on exit
     vacuum          = true
     virtualenv = /root/.virtualenvs/sscontrol
    
     #logto = /tmp/sspanel.log
     #有这个参数后日志不会出现在 bash 里
  2. nginx 相关权限配置

     nano /etc/nginx/nginx.conf
     #第一行配置了 nginx 使用的用户,该用户需要有项目目录的使用权限
     #一种方法是直接改成 root,然后项目目录都使用 root 的身份和权限。
    
     pkill -f nginx
     nginx
     #更改后需要用这种方法重启 nginx,如果用 centos7 的系统命令,权限可能有问题。
  3. 启动 uwsgi,测试。

     uwsgi -i ***.ini
    
     pkill -f uwsgi 关闭后台的进程
  4. 正式上线,后台运行:

    #将 uwsgi 配置文件中的 logto 设置好,后台启动:
    uwsgi -i ***.ini &
    
    #如果需要重启后台的 uwsgi:
    pkill -f uwsgi
    #之后后台会自动再次开启

uwsgi

#将 uwsgi 配置文件中的 logto 设置好,后台启动:
uwsgi -i ***.ini &
#查看日志
tail -f /tmp/xxx.log
#重启后台的 uwsgi
pkill -f uwsgi  #或
uwsgi --reload='/tmp/django-sspanel.pid'
#关闭后台的 uwsgi
killall -9 uwsgi

总结&待学习

记得切换到虚拟环境下运行命令

各处命名问题,尽量保持一致,避免出错。

nginx权限问题

linux 后台知识:& ps grep