据说,据说哈,Nginx 这个东西用于请求静态文件很厉害,具体表现在速度很快,前几天我在网上查找了一些教程,然后自己动手试了一下,快不快还不知道,但是这几样东西确实是可以结合在一起的,接下来就来记下我这几天走过的路,以下是目录。
1. 开启一个Django项目,创建 static 目录
2. 安装 Nginx ,开启Nginx服务
3. 安装 uwsgi 通过uwsgi 启动 Django
4. Nginx + uwsgi 开启Django 项目,访问静态文件
5. 创建路由,确认动态路由由Nginx 转发到Django
1、开启一个Django项目,创建 static 目录
在进入这个项目前,最好对于 Django 创建一个项目之类的有个基本的了解,如果不,那也没关系,照着我写的做就行……
在 Ubuntu 的用户下,我的用户名是 hunter, 创建直接创建一个项目,命令如下:
django-admin start project hunter
其中, hunter 为我的项目名称,所以这个项目的跟目录在 /home/hunter/hunter 下,进去以后看起来是这个样子的:
在 Django 的项目路径下,可能我这里有一些文件及文件夹比你多,不要紧,因为这都是后面创建的。
到了这里你可以到 含有配置文件 settings.py 的文件夹下看看,有个 wsgi.py 文件,这个是自动生成的,后面在 uwsgi 的服务中会用到,但我们不用修改它。
然后我们创建一个静态文件夹,用于存放我们的静态文件:
mkdir static
然后 cd 进入这个文件夹,创建一个文件,就叫做 index.html,文件内容如下:
<h1>SUCCESS</h1>
然后,我们测试一下这个 Django 的项目是否是正确的,在 /home/hunter/hunter/ 下 执行:
python3 manage.py runserver 0.0.0.0:8080
然后登陆浏览器, 输入 127.0.0.1:8080 看到 Django 系统特有的一个小火箭,就说明启动成功了。
我们的第一步就完成了。
但接着我们要做一个测试,访问一下 Django 系统自带的一个 admin 的界面,在浏览器输入:
127.0.0.1:8080/admin
可以看到一个登陆界面,这个接口我们后面会用到。
2、 安装 Nginx ,开启Nginx服务
然后安装 Nginx ,执行如下命令:
sudo apt-get install nginx
可能有的会报错之类的,记得更新下 apt 之类的东西。
然后我们通过如下命令启动 Nginx:
sudo /etc/init.d/nginx start
然后就可以看到 Nginx 的一个特有的欢迎页面。
到这里,我们的 Nginx 就装好了,具体参数之类的我们到后面再调。
3、安装 uwsgi 通过uwsgi 启动 Django
然后,我们要安装 uwsgi 这个Python 的依赖,执行:
sudo pip3 install uwsgi
然后,这里本来是有一个命令,可以通过这个命令单独启动 Django 的,但是参数什么的懒得记,这里就不做赘述了,但这里要明确一点的是:
这个作用是通过 uwsgi 来启动 Django 服务,Django 的启动命令就不用再单独运行了。
然后我们把这个命令写到一个文件里,放在Django 系统的根目录下,也就是 /home/hunter/hunter/ 下,文件名为 uwsgi.ini,其内容如下:
[uwsgi]
socket = :4589
chdir = /home/hunter/hunter
module = hunter.wsgi
master = true
processes = 4
vacuum = true
其中:
socket 后面设置的端口 需要记一下,后面在 Nginx 会用到
chdir 的参数为Django根目录的位置
module 的参数就是我们上面说的 会自动生成的 wsgi 文件的位置
processes 为进程数
注意:第一行的 [uwsgi] 一定要加上的,因为我删除过,然后启动,就不起作用了
这个配置文件的启动方式如下:
在/home/hunter/hunter,也就是 Django 系统的根目录下,执行:
uwsgi --ini uwsgi.ini &
我们现在可以启动,也可以后面再启动,如果启动了,我们可以通过
ps aux | grep uwsgi
来查看启动的进程。
4、Nginx + uwsgi 开启Django 项目,访问静态文件
现在到了这一步,uwsgi 已经和 Django 结合在一起了,如何把 Nginx 和Django 和 uwsgi 结合在一起呢?
我们先来配置一下 Nginx 的参数,配置 Nginx地址在 /etc/nginx/site-available/default
记得使用 sudo vim 来进行编辑,
sudo vim /etc/nginx/site-available/default
把原有的文件删删减减,最后可以得到如下的参数:
server {
listen 80; #表示 Nginx 默认监听的是80端口
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name localhost;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:4589; #这两行参数表示和uwsgi 结合,而且这个端口号就是前面 uwsgi 开启Django 项目的端口号,这是一个服务器对内的端口号,80为对外的,收到请求后如果是动态路由,则转发给这个端口的服务进行处理
uwsgi_read_timeout 2;
}
location /static { #这里就是静态文件的配置
expires 30d;
autoindex on;
add_header Cache-Control private;
alias /home/hunter/hunter/static/; #这里是Django项目静态文件地址,也是请求服务以后,直接获取的地址
}
}
然后,我们把 Nginx 重启一下:
sudo /etc/init.d/nginx restart
然后,如果 uwsgi 还没有启动的话,要启动一下:
在Django系统的根目录下:
uwsgi --ini uwsgi.ini &
然后我们就可以访问我们在前面创建的那个静态文件地址了,
127.0.0.1/static/index.html
因为80 是默认端口,所以访问的时候可以不用写,如果在服务器上这个端口被占用,可以在 Nginx 配置的 listen 后面写上自己的端口,浏览器访问的时候加上端口即可,可以看到如下显示:
当然,这只是访问静态文件,如果是要访问 Django 的动态路由呢,我们怎么验证呢?
5、确认动态路由由Nginx 转发到Django
我们通过 uwsgi 把 Django 服务启动起来了,然而我们在浏览器访问的却是 Nginx 的端口,如何确认 Nginx 是把这动态的路由转发给了Django 呢?
很简单,我们通过这个 Nginx 的端口 访问一个Django的接口,如果能够正确访问不就证明我们的结果了吗?
这就用到我们开始说过的 /admin 那个接口。我们访问 Nginx 端口下的单 /admin:
127.0.0.1:/admin
可以看到这样一个界面:
这个页面跟我们之前看到的 登陆界面好像不太一样。
没错!就是不一样,因为 Nginx 掌控了Django 的静态文件的访问,所以Django 的这个接口的一些静态 css 文件之类的都访问不到了,不过没关系。这个接口能够访问就足以证明我们的结论了。
啊,深夜了,还在写这篇博客,我好累~