centos7 服务器配置uWSGI+Nginx+Django
本篇文章参考uWSGI官网Setting up Django and your web server with uWSGI and nginx英语不错的的小伙伴可以自行阅读
1. 配置环境
-
创建虚拟环境
conda create -n django-env python=3.6 # 创建名为django-env,python版本为3.6的虚拟环境 conda activate django-env # 进入虚拟环境
-
下载Django
conda install django # 下载django
-
下载uwsgi
pip install uwsgi # 下载uwsgi (conda 下不了)
2. the web client <-> uWSGI <-> python
-
创建test.py文件
vi test.py i(进入编辑) # test.py def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello World"] # python3 #return ["Hello World"] # python2 esc(退出编辑) :wq!(保存并强制退出(!强制 w保持 q退出)) # 提示:cmd退出正在运行的项目Ctrl + c
-
运行uwsgi
uwsgi --http :8000 --wsgi-file test.py
配置项解释:
--http :8000
:使用http协议连接,连接端口为8000--wsgi-file
:加载指定的文件
注意:
-
如果你是远程服务器运行,访问地址:http://ip:8000,访问不了看看防火墙有没有开放指定端口
-
防火墙开发指定端口
firewall-cmd --zone=public --add-port=8000/tcp --permanent # --add-port=要开放的端口号 firewall-cmd --relo # 防火墙重新加载
-
-
如果你是本机访问,访问地址:http://loaclhost:8000
如果在网页上看到了你看到了
Hello World
恭喜你the web client <-> uWSGI <-> Python
在个流程没问题了
3. the web client <-> uWSGI <-> Django
-
创建Django项目
# 先将uwsgi程序退出 (Ctrl + c) django-admin startproject mysite
-
配置项目
cd mysite/mysite # 进入项目目录 vi setting.py # 进入配置文件 修改: 1. 数据库从sqlite3改为mysql DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '数据库名', # 建议与项目名一致 'USER': '数据库用户', 'PASSWORD': '数据库密码', 'HOST': '数据库连接地址', 'PORT': '3306', } } 2. 语言从英语改成中文(可以不改) LANGUAGE_CODE = 'en-us' ---> LANGUAGE_CODE = 'zh-hans' 3. 时间标准从国际协调时间改为亚洲上海时间(可以不改) TIME_ZONE = 'UTC' ---> TIME_ZONE = 'Asia/Shanghai' esc(退出编辑) :wq!(保存并强制退出(!强制 w保持 q退出))
-
创建数据库
进入mysql: create database 数据库名 # 切记要和配置文件中的数据库名一致 退出mysql # 先回到项目目录下(有manage.py文件) python manage.py migrate
-
runserver 运行Django项目
python manage.py runserver 0.0.0.0:8000 运行django项目
注意:
-
如果你是远程服务器运行,访问地址:http://ip:8000,并且网站显示
Invalid HTTP_HOST header: 'ip:8000'. You may need to add 'ip' to ALLOWED_HOSTS.
提示# 进入setting.py在ALLOWED_HOSTS配置项中加入它提示的ip ALLOWED_HOSTS = [] ---> ALLOWED_HOSTS = ['ip',]
-
如果你是本机访问,访问地址:http://loaclhost:8000
如果你看到了Django运行成功的小火箭,就说明没问题了,加入下一步
-
-
uwsgi运行Django项目
# 先将runserver 启动的Django程序退出 (Ctrl + c)
uwsgi --http :8000 --module mysite.wsgi
配置项解释:
--module
:加载指定的wsgi模块
接下来你去刷新一下刚才
runserver
时打开的网页,如果还是小火箭,恭喜你the web client <-> uWSGI <-> Django
这个流程没问题了
the web client <-> the web server
安装启动Nginx
(看我文章Nginx安装)
默认配置启动Nginx后,Nginx监听80端口
- 如果你是远程服务器运行,访问地址:http://ip:80
- 如果你是本机访问,访问地址:http://loaclhost:80
如果看到的是Nginx的欢迎页面, 页面上有加粗的
Welcome to nginx!
,恭喜你the web client <-> the web server
流程没有问题
the web client <-> the web server <-> the socket <-> uWSGI <-> Python
配置Nginx和uWSGI需要一个
uwsgi_params
文件,这个文件Nginx自带在/usr/local/nginx/conf
里面
-
配置Nginx
-
接下来创建一个配置文件
mysite_nginx.conf
:# 官方给的配置文件(我们需要修改一下) # mysite_nginx.conf upstream django { # server unix:///path/to/your/mysite/mysite.sock; server 127.0.0.1:8001; } server { listen 8000; server_name example.com; charset utf-8; client_max_body_size 75M; location /media { alias /path/to/your/mysite/media; } location /static { alias /path/to/your/mysite/static; } location / { uwsgi_pass django; include /path/to/your/mysite/uwsgi_params; } } # 将配置文件中的 /path/to/your/mysite 改为你的项目文件路径(manage.py上级目录) /home/python/project/django/mysite # uwsgi_params除外,把这个的 /path/to/your/mysite 修改为 /usr/local/nginx/conf # 将 server_name example.com; 改为 server_name ip地址; # ip地址: 本机localhost或127.0.0.1、服务器:服务器IP upstream django { # server unix:///home/python/project/django/mysite/mysite.sock; server 127.0.0.1:8001; } server { listen 8000; server_name ip地址; charset utf-8; client_max_body_size 75M; location /media { alias /home/python/project/django/mysite/media; } location /static { alias /home/python/project/django/mysite/static; } location / { uwsgi_pass django; include /usr/local/nginx/conf/uwsgi_params; } }
-
在项目目录下创建文件夹
media
在下面放一张图片,用于别是否成功连接 -
接下来将配置文件
mysite_nginx.conf
引入Nginx默认配置nginx.conf
# 在nginx.conf末尾加上 include /usr/local/nginx/conf/sites-available/*.conf; # include指令用于从外部文件中引入配置参数 # *.conf 引入该文件夹下的所有以.conf结尾的文件 # "/usr/local/nginx/conf/sites-available/"是我创建配置文件的路径
-
然后我们重启Nginx,浏览器访问http://ip:8000/media/图片名称.后缀名(
ip
同上)注:访问如果出现
403 Forbidden
,需要修改Nginx配置文件# user nobody # 改为 media 文件夹的所有用户,我的是python # 不知道的去media的父级目录使用命令 ll 查看 user python
修改完毕后重启Nginx,如果你看到了你的图片,恭喜你现在nginx没有问题了
-
-
配置Django
- 配置静态文件
# 在setting.py文件中加入配置项(建议加在 STATIC_URL 配置项后面) STATIC_ROOT = os.path.join(BASE_DIR, "static/") # 运行 python manage.py collectstatic # 将静态文件加载到static文件夹中
- 配置静态文件
-
nginx + uwsgi + test.py
-
还记得一开始的
test.py
吗,让我们先用它测试一下# 先进入test.py所在的文件夹 # 运行 uwsgi --socket :8001 --wsgi-file test.py
配置项解释:
socket :8001
:使用协议 uwsgi,端口 8001如果你看的了
Hello World
,恭喜你,the web client <-> the web server <-> the socket <-> uWSGI <-> Python
流程没有问题了
-
使用套接字Unix 启动项目而不是端口
-
修改配置文件
大家记得配置文件
mysite_nginx.conf
有一行注释server unix:///home/python/project/django/mysite/mysite.sock;
我们去打开它,然后将server 127.0.0.1:8001;
注释server unix:///home/python/project/django/mysite/mysite.sock; # server 127.0.0.1:8001;
-
重启nginx
-
再次运行 uWSGI
uwsgi --socket mysite.sock --wsgi-file test.py
如果网页显示
502 Bad Gateway
,我们去看一下错误如果是看我的Nginx安装博客的小伙伴,错误日志位置/usr/local/nginx/logs
,我们使用cat
命令看一下,错误日志cat error.log
,如果你看到了connect() to unix:///home/python/project/django/mysite/mysite.sock failed
首先看一下
unix:///home/python/project/django/mysite/mysite.sock
是否是你test.py
文件所在的地址,如果是那么我们可能需要管理套接字上的权限,以便允许nginx使用它。初始使用一下命令启动:
uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=666
还是不行,尝试这个
uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=664
最后:你看到了
Hello World
,恭喜你成功使用Unix套接字
启动了python文件
使用uwsgi和nginx运行Django应用程序
-
确认nginx配置文件
mysite_nginx.conf
里unix:mysite.sock地址
是否在项目文件下,不是请更改 -
运行命令启动项目
uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=664
看到小火箭,恭喜你成功了
-
配置uWSGI,使用
.ini
启动文件-
创建文件
mysite_uwsgi.ini
,文件要创建在项目目录下和manage.py
同目录# 官方提供配置文件 # mysite_uwsgi.ini [uwsgi] chdir = /path/to/your/project module = project.wsgi home = /path/to/virtualenv master = true processes = 10 socket = /path/to/your/project/mysite.sock vacuum = true # 将 /path/to/your/project 修改为 项目目录/path/to/your/project # module project项目名 # home 的值填python环境的目录 /home/python/miniconda3/envs/django-env [uwsgi] chdir = /home/python/project/django/mysite module = mysite.wsgi home = /home/python/miniconda3/envs/django-env master = true processes = 10 socket = /home/python/project/django/mysite/mysite.sock vacuum = true
-
uwsgi启动xm
uwsgi --ini mysite_uwsgi.ini
回刷新页面,如果还是小火箭,就大功告成了
-
提示
官网文档上在后面还讲了怎么设置全局的uwsgi,有需要的小伙伴可以去看看,链接在最顶部