Django博客项目通过nginx部署到Ubuntu系统方法和其中遇到的问题汇总
1、更改项目文件
1.1 静态文件html中的导入静态目录一定要是 {% load static %} ,不能是 {% load staticfiles %}
1.2 setting文件修改,修改内容如下:
DEBUG = False #修改为False 正式项目不能为True
ALLOWED_HOSTS = ['*'] #修改为允许所有ip访问
# 设置静态资源路径
STATIC_URL = '/static/'
# 设置图片访问的统一路由
MEDIA_URL='/media/'
# 静态文件收集目录(需要运行nginx执行collected_static静态文件收集目录)
STATIC_ROOT = os.path.join(BASE_DIR, 'collected_static')
1.3 urls文件修改
# 图片访问的路由
from django.conf import settings
from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
2、提交到gitee上
提交到gitee方法不多做解释
3、配置Ubuntu系统
3.1
为了防止系统太旧引起的各种麻烦,先升级一下库的版本:
~$ sudo apt-get update
~$ sudo apt-get upgrade
完成之后,接着安装需要的几个包:
~$ sudo apt-get install nginx
~$ sudo apt-get install python
~$ sudo apt-get install python-pip
~$ sudo apt-get install git
~$ sudo pip install virtualenv
分别安装了 nginx、python3、pip、git、virtualenv。其中 python3 和 pip3 的写法是因为阿里云自带了 Python2.7,把它们区分一下。之前开发时虚拟环境用的 python 自带的,为了避免读者的版本不同造成的各类错误,稳妥起见用 virtualenv 库来创建虚拟环境,操作步骤都是差不多的。
4、从gitee上拉取Django博客项目
需要注意的是,虚拟环境一般是需要在服务器上重新生成的,因此我们需要把开发中用到的库列一个清单,以便在服务器上统一安装。在本地虚拟环境中输入:
pip freeze > requirements.txt
项目中就多了个 requirements.txt
文件,里面记录了项目需要的库的清单。
给项目代码创建目录并进入此目录:
~$ mkdir -p /home/sites/myblog.com
~$ cd /home/sites/myblog.com
目录位置是随便你的,但建议找个地方统一管理所有的网站项目。
然后从 GitHub 中拉取项目代码:
../myblog.com$ git clone 这里填博客的gitee地址
完成之后可以输入 ls
指令,看看代码文件夹是否正常生成了。
5、安装博客所需环境
接着在服务器生成虚拟环境:
../dusaiphoto.com$ virtualenv --python=python3.5 env
../dusaiphoto.com$ source env/bin/activate
(env) ../dusaiphoto.com$
这里用 virtualenv
生成并激活了虚拟环境。python 版本选择 3.5 还是 3.7 都可以,区别并不大。
接下来就是安装库、收集静态资源、数据迁移了:
(env) ../dusaiphoto.com$ cd my_blog
(env) ../django_blog_tutorial$ pip install -r requirements.txt
(env) ../django_blog_tutorial$ python manage.py collectstatic
(env) ../django_blog_tutorial$ python manage.py migrate
6、安装nginx和Gunicorn
前面我们安装了 Nginx
,先来试试安装是否正常。启动 nginx 服务:
(env) ~$ sudo service nginx start
打开浏览器,输入你的服务器公网 IP 地址:
Nginx 欢迎界面出现了,神奇吧。但这个默认配置显然是不能用的,所以需要重新写 Nginx 的配置文件。进入 /etc/nginx/sites-available
目录,这里是定义 Nginx 可 用配置的地方。输入指令 sudo vi dusaiphoto.com
创建配置文件并打开 vi 编辑器:
(env) ~$ cd /etc/nginx/sites-available
(env) /etc/nginx/sites-available$
(env) /etc/nginx/sites-available$ sudo vi dusaiphoto.com
关于 vi
编辑器如何使用也不赘述了,这里只说两个最基本的操作:
-
-
- 按
i
键切换到编辑模式,这时候才可以进行输入、删除、修改等操作 - 按
Ctrl + c
退回到命令模式,然后输入:wq + Enter
保存文件修改并退回到服务器命令行
- 按
-
回到正题,用 vi
在 dusaiphoto.com
文件中写入:
server { charset utf-8; listen 80; server_name 192.168.23.128; # 改成你的 IP
location /static { alias /home/sites/myblog.com/blog/collected_static; # 整合后的静态文件目录 } location /media { alias /home/sites/myblog.com/blog/media; #用户上传文件和图片目录 } location / { proxy_set_header Host $host; proxy_pass http://unix:/tmp/192.168.23.128.socket; # 改成你的 IP } }
此配置会监听 80 端口(通常 http 请求的端口),监听的 IP 地址写你自己的服务器公网 IP。
配置中有3个规则:
- 如果请求 static 路径则由 Nginx 转发到目录中寻找静态资源
- 如果请求 media 路径则由 Nginx 转发到目录中寻找媒体资源
- 其他请求则交给 Django 处理
如果你已经申请好域名了,就把配置中有 IP 的地方都修改为域名,比如:server_name www.dusaiphoto.com;
写好后就退出 vi
编辑器,回到命令行。因为我们写的只是 Nginx 的可用配置,所以还需要把这个配置文件链接到在用配置上去:
(env) ../sites-available$ sudo ln -s /etc/nginx/sites-available/dusaiphoto.com /etc/nginx/sites-enabled
至此 Nginx 就配置好了,接下来搞定 Gunicorn
。
Gunicorn及测试
先回到项目所在的目录,并且进入虚拟环境,然后输入:
(env) ../django_blog_tutorial$ pip3 install gunicorn
(env) ../django_blog_tutorial$ sudo service nginx reload
(env) ../django_blog_tutorial$ gunicorn --bind unix:/tmp/192.168.23.128.socket my_blog.wsgi:application
这里的三个步骤分别是:
- 安装
Gunicorn
- 重启
Nginx
服务 - 启动
Gunicorn
启动 Gunicorn 也是一样,如果你已经有域名了,就把套接字中的 IP 地址换成域名;wsgi 字眼前面是项目的名称。另外
sudo service nginx reload
可替换成 sudo service nginx restart
,区别是 reload 只重载配置文件,restart 重启整个服务。
接下来用浏览器访问服务器试一下:
7、更新项目
然后就是通过 GitHub 更新服务器代码,并且重新收集静态文件:
(env) ../django_blog_tutorial$ git pull origin master
(env) ../django_blog_tutorial$ python3 manage.py collectstatic
8、后期运维
你的网站是需要不断更新优化代码的。每次修改代码后,更新到服务器上也很简单。在虚拟环境中并进入项目目录,依次(collectstatic 和 migrate 是可选的)执行以下命令:
git pull origin master
python3 manage.py collectstatic
python3 manage.py migrate
# 重启 gunicorn
pkill gunicorn
gunicorn --bind unix:/tmp/192.168.23.128.socket blog.wsgi:application
如果你更改了 Nginx 的配置文件,还需要重启 Nginx 服务:
sudo service nginx reload
总结
部署可以说是入门者最大的难关了,也是检验成果、获取成就感的关键一步。多查资料,要相信你遇到的问题别人早就遇到过了。
部署是菜鸟的毕业礼,也是新人的第一课。