3.4 Django+Uwsgi部署网站 ======================== |image0| 本文是先前自己使用django写过一个个人博客时的部署过程记录。 涉及的工具有:Django+Nginx+Uwsgi+Supervisor 一、环境准备 ------------ -------------- 1.1 服务器 ~~~~~~~~~~ 本文使用的服务器系统是\ **Ubuntu 16.04** 之前使用\ **Ubuntu14.04**\ ,问题非常之多,使用16.04后避免了很多问题。 1. 默认预装\ ``Python2.7.6``\ ,\ ``Python3.4``\ (主要是软件源太早的版本) 2. 创建虚拟环境出现无法解决的问题:\ ``OSError setuptools pip wheel failed with error code 1`` 更新软件源 :: sudo apt-get update sudo apt-get upgrade 更新时,会让你选择是否安装新版软件,输入Y安装 |image1| 更新安装完成后,系统就会给我们预装了Python2.7.12和Python3.5.2 1.2 配置虚拟环境 ~~~~~~~~~~~~~~~~ 安装pip :: sudo apt-get install python-pip 安装pip3 :: sudo apt-get install python3-pip 配置虚拟环境,先安装两个包 :: pip install virtualenv pip install virtualenvwrapper 配置:\ ``vim ~/.bashrc``\ ,编辑完成后,记得\ ``source ~/.bashrc``\ 使之生效 :: # 编辑bashrc文件 export WORKON_HOME=$HOME/.virtualenvs export PROJECT_HOME=$HOME/workspace export VIRTUALENVWRAPPER_SCRIPT=/usr/local/bin/virtualenvwrapper.sh #先find一下具体位置,替换 source /usr/local/bin/virtualenvwrapper_lazy.sh #先find一下具体位置,替换 创建虚拟环境 :: # Python2 mkvirtualenv myblog # Python3 mkvirtualenv myspider 1.3 安装依赖包 ~~~~~~~~~~~~~~ 导入requirements并安装 :: # 进入虚拟环境安装 pip install -i https://pypi.douban.com/simple -r requirements.txt 如果MySQL安装出错就安装下面两个包 .. code:: shell apt-get install python-dev libmysqlclient-dev 二、安装并配置MySQL ------------------- -------------- 2.1 安装MySQL ~~~~~~~~~~~~~ 安装过程,会提示设置密码(默认用户都是root) :: sudo apt-get install mysql-server 安装完成后,测试下,是否安装成功 :: mysql -u root -p 2.2 配置访问权限 ~~~~~~~~~~~~~~~~ **IP权限** MySQL默认只能本机\ ``127.0.0.1``\ 访问 若要从外网连接,必须更改IP绑定 :: # ubuntu 16.04 vim /etc/mysql/mysql.conf.d/mysqld.cnf # ubuntu 14.04 vim /etc/mysql/my.cnf # deepin vim /etc/mysql/mysql.conf.d/mysqld.cnf ----------------------------------- #修改IP绑定 127.0.0.1 为 0.0.0.0 bind-address = 0.0.0.0 **权限分配** :: # 权限分配 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '连接密码' WITH GRANT OPTION; # 刷新权限 FLUSH PRIVILEGES; 配置完以上,记得重启服务 :: sudo service mysql restart **外网连接** 使用navicat进行测试连接 |image2| 连接上后就可以新建数据库 |image3| 如果有备份数据要还原,可以使用数据传输。 数据传输功能,不能确保一次就能将数据传输完整,要多传输几次。 实在无法完整传输,就要导出导入的方式。 |image4| 三、项目上传 ------------ -------------- 我们的项目在本地开发,现在我们必须将项目迁移到服务器上。 这里有三种方法: 1. 使用linux的 rzsz 工具上传(推荐) 2. 使用SFTP/FTP的方式传输项目文件 3. 将项目上传至GitHub上,然后从GitHub上clone到服务器 3.1 使用 lrzsz ~~~~~~~~~~~~~~ 首先在你的服务器上安装这个工具 :: sudo apt-get install lrzsz 然后就可以通过 - rz:上传 - sz:下载 3.2 使用SFTP/FTP ~~~~~~~~~~~~~~~~ ``sftp/ftp`` 软件很多,我用过的有\ ``FileZilla``\ 、\ ``FlashFXP`` ``FileZilla``\ 一开始用的时候,很顺手,自从有一次不知怎么再也连不上,卸载重装也不行。 然后就换\ ``FlashFXP``\ 了。 使用FTP软件的时候,可以将项目压缩成7z文件。再传输,一来文件少了,二来大小也减少不少。 当然迁移到服务器后,要对其进行解压。 这时候我们就要按\ ``7z``\ 了 :: # 安装 apt-get install p7zip-full # 解压(注意-o后没有空格) 7z x myblog.7z -r -o/root # 压缩 7z a -t7z -r myblog.7z /root/* 3.3 使用GitHub ~~~~~~~~~~~~~~ 这是我一开始使用的方式,但是\ **并不推荐**\ 。 **原因有三**\ : 1. 上传至GitHub,说明你项目里有些敏感/隐私信息(账号密码等),要处理。多的话就很费事。 2. 不熟悉Git命令的人,还要先去学Git命令。 3. clone下来后,还要重新对项目里的内容,该改的改。这个也很费事。虽然可以用脚本。 **安装Git** :: sudo apt-get install git git clone git@github.com:xxx/xxx.git # 替换对应的git地址 三、安装并配置Nginx ------------------- -------------- 3.1 安装Nginx ~~~~~~~~~~~~~ :: sudo apt-get install nginx 3.2 配置Nginx ~~~~~~~~~~~~~ 在项目根目录下,新建uc_nginx.conf :: vim uc_nginx.conf 内容如下 .. code:: python upstream django { server 127.0.0.1:8000; # for a web port socket (we'll use this first) } server { listen 80; server_name 你的IP 你的域名; charset utf-8; client_max_body_size 75M; # adjust to taste location /media { alias /root/myblog/media; # 指向django的media目录 } location /static { alias /root/myblog/static; # 指向django的static目录 } location / { uwsgi_pass django; include uwsgi_params; # the uwsgi_params file you installed } } 创建完成后,拷贝或者创建软链接到nginx目录 推荐使用拷贝的方式,因为我有很多次使用软链接的方式,结果就是软链接失效。结果nginx无法启动,找了半天问题,结果发现这个,很蛋疼。 :: #拷贝 cp uc_nginx.conf /etc/nginx/conf.d/ # 创建软链接 sudo ln -s uc_nginx.conf /etc/nginx/conf.d/ 配置完成后,记得重启 ``nginx`` :: sudo service nginx restart 四、安装并配置uwsgi ------------------- 4.1 安装uwsgi ~~~~~~~~~~~~~ 若是安装在虚拟环境里,以后启动的时候,就要先进入虚拟环境。 :: pip install uwsgi 4.2 配置uwsgi ~~~~~~~~~~~~~ 在项目根目录新建uwsgi.ini :: # mysite_uwsgi.ini file [uwsgi] # Django-related settings # the base directory (full path) chdir = /root/myblog module = myblog.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/myblog 4.3 运行项目 ~~~~~~~~~~~~ .. code:: shell # 必须先cd到项目根目录 uwsgi -i uwsgi.ini 五、使用Supervisor管理进程 -------------------------- -------------- 5.1 安装supervisor ~~~~~~~~~~~~~~~~~~ 安装supervisor有两种方式 【不推荐】一种直接使用pip安装 :: pip install supervisor 【推荐】一种是使用apt安装 :: apt-get install supervisor 使用apt安装,能够让服务器开机的时候就自动重启supervisor服务。而使用pip安装则需要手动重启。相对麻烦。 5.2 配置supervisor ~~~~~~~~~~~~~~~~~~ 在\ ``/etc/supervisor/conf.d/``\ 路径下新增\ ``myblog.conf`` :: [program:myblog] ; 程序名称,在 supervisorctl 中通过这个值来对程序进行一系列的操作 autorestart=True ; 程序异常退出后自动重启 autostart=True ; 在 supervisord 启动的时候也自动启动 redirect_stderr=True ; 把 stderr 重定向到 stdout,默认 false environment=PATH="/root/.virtualenvs/myblog" ; 虚拟环境路径 command=/usr/local/bin/uwsgi -i /root/myblog/uwsgi.ini ; 启动命令,与手动在命令行启动的命令是一样的 user=root ; 用哪个用户启动 directory=/root/myblog ; 程序的启动目录 然后将\ ``myblog.conf``\ 写入到supervisor的配置中\ ``/etc/supervisord.conf``\ 中 :: vim /etc/supervisord.conf 直接跳到最后,填入红框内容 |image5| 5.3 启动项目 ~~~~~~~~~~~~ 既然修改了配置,第一步当然要使配置生效。 :: root@localhost:~# supervisorctl reread myblog: changed root@localhost:~# sudo supervisorctl update myblog: stopped myblog: updated process group 通过\ ``supervisorctl status``\ 查看启动状态 |image6| 5.4 supervisor其他命令 ~~~~~~~~~~~~~~~~~~~~~~ :: # myblog 改成你之前设定的对应的项目名 # 关闭进程 $ sudo supervisorctl stop myblog myblog: stopped # 开启进程 $ sudo supervisorctl start myblog myblog: started # 重启进程 $ sudo supervisorctl restart myblog myblog: stopped myblog: started {% note success %}# 注意事项{% endnote %} 六、部署项目 ------------ 6.1 部署配置 ~~~~~~~~~~~~ 在使用 supervisor 拉起项目前,记得确保检查过以下配置\ ``settings.py`` .. code:: python # 关闭debug DEBUG = False # 添加这一行 STATIC_ROOT = os.path.join(BASE_DIR, "static") #注释掉 STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static") ] # 如果没有设置数据库信息的话 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '数据库名', 'USER': 'root', 'PASSWORD': '密码', 'HOST': '127.0.0.1' } } # 有必要的话,需要邮箱验证信息 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.163.com' EMAIL_PORT = 25 EMAIL_HOST_USER = '邮箱@163.com' EMAIL_HOST_PASSWORD = '你的密码' EMAIL_USER_LTS = False EMAIL_FROM = '邮箱@163.com' 收集静态文件 :: python manage.py collectstatic 6.2 调试小技巧 ~~~~~~~~~~~~~~ 在部署的时候,难免会遇到各自各有的问题。 在排查问题的时候,可以先把\ ``debug``\ 打开 使用两种方法,运行项目 :: # 第一种: python manage.py runserver 0.0.0.0:8000 # 第二种 # 运行后,到外网访问IP/域名,看看能不能运行,如果出错会有错误提示 uwsgi -i uwsgi.ini 在项目运行过程中,如果有错误,会显示详细信息。你可以根据这些信息先解决后,再把debug关闭,重新运行项目。 6.3 Nginx权限问题 ~~~~~~~~~~~~~~~~~ 如果使用Ubuntu16.04或者CentOS,nginx的www-data是没有权限的,这时候我们要改下,nginx配置,使其以root用户运行。 :: # 在第一行,将www-data改成root vim /etc/nginx/nginx.conf -------------- |image7| .. |image0| image:: http://image.iswbm.com/20200602135014.png .. |image1| image:: https://i.loli.net/2017/08/20/599982f513b7e.png .. |image2| image:: https://i.loli.net/2017/08/20/59998b33265d9.png .. |image3| image:: https://i.loli.net/2017/08/20/59998b91d16dd.png .. |image4| image:: https://i.loli.net/2017/08/20/59998bdf36c79.png .. |image5| image:: https://i.loli.net/2017/08/25/59a0236def497.png .. |image6| image:: https://i.loli.net/2017/08/25/59a0244d239f0.png .. |image7| image:: http://image.iswbm.com/20200607174235.png