环境配置
如果下文没有特殊说明, 以 python3
为基础来配置
安装pip
ubuntu:
1 | pip2 |
CentOS:
1 | pip2 |
CentOS
安装 python3
后在 python3/bin/
下有 pip3
, 所以问题变成如何安装 python3
, 参考这里
安装nginx
Ubuntu:
1 | sudo apt-get install nginx |
CentOS:
1 | sudo yum install epel-release # 已安装此源则可以跳过 |
这时候浏览器访问 http://127.0.0.1/
应该可以看到 nginx
的欢迎界面(下图是 CentOS
的)
停止nginx服务
建议如果要测试下面的 Django
、uwsgi
或者是 uwsgi+Django
的话, 先把 nginx
服务 关闭, 不然可能会出现一些错误
Ubuntu:
1 | sudo /etc/init.d/nginx stop # stop nginx |
CentOS:
1 | 停止nginx服务 |
安装uwsgi
1 | pip3 install uwsgi |
做基本测试, 在任意一个目录下, 创建一个名为 test.py
的文件:
1 | # test.py |
shell
运行下面的命令:
1 | --http :8001: 使用http协议, 运行在8001端口; |
然后浏览器访问 http://127.0.0.1:8001
查看效果
安装Django
1 | pip3 install Django |
用uwsgi运行Django服务器
先确保你的Django服务器可以正常运行, 这里不多阐述, 可以按照官网的教程创建一个简单的项目来测试
先进入项目 manage.py
所在目录, 然后执行下面的命令:
1 | --module mysite.wsgi: 加载指定的wsgi模块 |
然后浏览器访问 http://127.0.0.1:8001
(路径根据你的项目设计而定)查看效果
配置nginx+uwsgi+Django(Ubuntu下)
下文中, manage.py
所在目录均写为 dir_M/
, 请读者自行更改为自己的目录
部署静态文件
进入 dir_M/
目录, 创建两个新目录 media
static
, 来存放相应的静态文件
然后打开 dir_M/project_name/settings.py
文件, 在末尾添加一行:
1 | STATIC_ROOT = os.path.join(BASE_DIR, "static/") |
然后回到 dir_M/
, 运行下面的命令:
1 | python manage.py collectstatic |
这一步就完成了
设置站点nginx配置文件
先将 uwsgi_params
(通常在 /etc/nginx/
这个目录里有) 拷贝到 dir_M/
1 | cp /etc/nginx/uwsgi_params dir_M/ |
在 dir_M
下创建一个名为 s_nginx.conf
文件, 写入以下内容(这里直接用 file socket
的方式配置, 如果想用 web port socket
的方式的话, 可以看 参考1):
1 | # s_nginx.conf |
这个配置文件告诉nginx提供来自文件系统的媒体和静态文件, 以及处理那些需要Django干预的请求. 对于一个大型部署, 让一台服务器处理静态/媒体文件, 让另一台处理Django应用, 被认为是一种很好的做法, 但是现在, 这样就好了
将这个文件链接到 /etc/nginx/sites-enabled
,这样nginx就可以看到它了:
1 | sudo ln -s dir_M/s_nginx.conf /etc/nginx/sites-enabled/ |
简单测试静态文件部署
添加一个文件(在这里是图片 3.jpg
, 文本也可以)到 dir_M/media
中, 然后重启 nginx
1
sudo /etc/init.d/nginx restart
可以尝试用 url
来访问你刚刚放置的文件, 我这里是访问 http://127.0.0.1:8765/media/3.jpg
, 效果如下:
让nginx与uwsgi通信
将上文我们用来测试uwsgi的文件拷贝到 dir_M/
1 | # test.py |
shell
中运行:
1 | --socket 表示用 uwsgi 协议, 这里是 unix socket, 也就是上面我们配置nginx的file socket |
重启 nginx
这时候访问 http://127.0.0.1:8765
, 应该就可以看到 Hello World 了
如果出错
可以检查一下 nginx
的错误日志 /var/log/nginx/error.log
让nginx与uwsgi+Django通信
和上文的 uwsgi+Django
类似, 只要把 uwsgi
运行参数改一下就好了, 当然还是在 dir_M/
目录:
1 | --module 加载模块 |
记得重启 nginx
配置uwsgi.ini文件 让uwsgi启动更方便
我们可以将用在uWSGI上的相同的选项放到一个文件中,然后告诉 uWSGI
使用该文件运行。这使得管理配置更容易。
同样在 dir_M
目录, 创建一个名为 s_uwsgi.ini
文件:
1 | # s_uwsgi.ini file |
然后就可以通过这个 ini
文件来运行 uwsgi
:
1 | uwsgi --ini s_uwsgi.ini |
重启 nginx
!
整体过程
- 通过
ini
文件启动uwsgi
+Django
- 启动
nginx
服务 - 访问你的网站
- OK!
到这里入门级的部署就完成了, 进阶的等之后笔者学习了再分享一下吧!
配置nginx+uwsgi+Django(CentOS下)
下文中, manage.py
所在目录均写为 dir_M/
, 请读者自行更改为自己的目录
部署静态文件
进入 dir_M/
目录, 创建两个新目录 media
static
, 来存放相应的静态文件
然后打开 dir_M/project_name/settings.py
文件, 在末尾添加一行:
1 | STATIC_ROOT = os.path.join(BASE_DIR, "static/") |
然后回到 dir_M/
, 运行下面的命令:
1 | python manage.py collectstatic |
这一步就完成了
设置站点nginx配置文件
先将 uwsgi_params
(通常在 /etc/nginx/
这个目录里有) 拷贝到 dir_M/
1 | cp /etc/nginx/uwsgi_params dir_M/ |
与 Ubuntu 不同
打开 /etc/nginx/
目录下的 nginx.conf
, 把这里面的 Server
默认配置注释了(不注释不知道会怎么样, 笔者这里注释了, 后来运行是正常的)
在 dir_M
下创建一个名为 s_nginx.conf
文件, 写入以下内容(这里直接用 file socket
的方式配置, 如果想用 web port socket
的方式的话, 可以看 参考1):
1 | # s_nginx.conf |
这个配置文件告诉nginx提供来自文件系统的媒体和静态文件,以及处理那些需要Django干预的请求。对于一个大型部署,让一台服务器处理静态/媒体文件,让另一台处理Django应用,被认为是一种很好的做法,但是现在,这样就好了。
将这个文件链接到 /etc/nginx/sites-enabled
(没有这个文件夹? 参考 遇到的坑2),这样 nginx
就可以看到它了:
1 | sudo ln -s dir_M/s_nginx.conf /etc/nginx/sites-enabled/ |
简单测试静态文件部署
在这里没有测试过, 不过预计和 Ubuntu
的差不多
让nginx与uwsgi+Django通信
和上文的 uwsgi+Django
类似, 只要把 uwsgi
运行参数改一下就好了, 当然还是在 dir_M/
目录:
1 | --module 加载模块 |
记得重启 nginx
如果出错
可以检查一下 nginx
的错误日志 /var/log/nginx/error.log
配置uwsgi.ini文件 让uwsgi启动更方便
我们可以将用在uWSGI上的相同的选项放到一个文件中,然后告诉 uwsgi
使用该文件运行。 这使得管理配置更容易。
同样在 dir_M
目录, 创建三个文件 s_uwsgi.ini
uwsgi.pid
uwsgi.status
打开 s_uwsgi.ini
文件, 写入以下内容:
1 | # s_uwsgi.ini file |
然后就可以通过这个 ini
文件来运行 uwsgi
:
1 | uwsgi --ini s_uwsgi.ini |
刚刚那两个文件有下面的功能:
1 | 停止 |
重启 nginx
!
最后就是这样:
整体过程
- 通过
ini
文件启动uwsgi
+Django
- 启动
nginx
服务 - 访问你的网站
- OK!
到这里入门级的部署就完成了, 进阶的等之后笔者学习了再分享一下吧!
遇到的坑
1.
之前服务器是用来搭建 wordpress
博客的, 后来重装了系统, 不过 wordpress
还残留??
所以测试 nginx
的时候, 因为80端口早被 wordpress
的 apache
服务器占用了, 启动不了, 所以要把 apache
服务停了, 执行下面的命令:
(ps: 当然如果你想让nginx监听其他端口比如8002也是可以的, 只要改一下配置, 不过这里是刚入门部署的时候, 就按普通的方式来)
1 | 查看占用80端口的进程 |
到这里80端口就不会被占用了, 可以继续配置 nginx
了
2.
在 CentOS
下并没有 sites-enabled/
这个目录, 于是要先编辑 /etc/nginx/nginx.conf
, 在 http block
中添加 include /etc/nginx/sites-enabled/*;
如图:
然后自己新建一个 sites-enabled/
, 重启 nginx
服务(sudo systemctl restart nginx.service
)就可以了
3.
先用 pip3 install uwsgi
, 发现 command not found
然后就 pip install uwsgi
(这个是pip2), 结果Django出了一堆问题
后来找到解决方法了, 添加软连接, 用 python3
的 uwsgi
:
1 | ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi3 |
4.
即使给了666的权限, 在 CentOS
跑 nginx
服务的时候也会提示权限不足(在 error.log
看到), 看了一下原因也在里面, 就是运行的用户不同, 到 nginx.conf
更改运行用户为 root
就可以了, 不过里面建议用普通用户运行….
参考
使用uWSGI和nginx来设置Django和你的web服务器
Django 部署(Nginx)
Django Nginx+uwsgi 安装配置