nginx uwsgi django配置
一:uwsgi配置
1),测试uwsgi
项目名称:script
下载uwsgi
sudo pip install uwsgi
查看是否uwsgi是否有用
1,进入项目里面.先运行
Python manager.py runserver 看是否报错
2,启用uwsgi启动项目
uwsgi --http :8000 --module script.wsgi
uwsgi --http :8000 --home /home/panyu/script --chdir /home/panyu/PycharmProjects/script -w script.wsgi
/home/panyu/script 表示虚拟环境的位置,这里的虚拟环境名称就是script
/home/panyu/PycharmProjects/script 表示项目的名称script
PS:如果你项目跑在虚拟环境中,那么你跑的时候要先启动虚拟环境,不然会报错.
2)配置uwsgi
在uwsgi文件夹下,创建.ini文件,放项目的配置文件
cd /etc/uwsgi/
mkdir sites
vim script.ini
配置文件如下
官方版本
# mysite_uwsgi.ini file [uwsgi] # Django-related settings # the base directory (full path) chdir = /path/to/your/project # Django's wsgi file module = project.wsgi # the virtualenv (full path) home = /path/to/virtualenv #指定虚拟环境地址 # process-related settings # master master = true # maximum number of worker processes processes = 10 # the socket (use the full path to be safe socket = /path/to/your/project/mysite.sock # ... with appropriate permissions - may be needed # chmod-socket = 664 # clear environment on exit vacuum = true
实用版本
[uwsgi]
project = script
uid = panyu
path = PytharmProjects
base = /home/%(uid)
chdir = %(base)/%(path)/%(project) #项目路径
module = %(project).wsgi:application #
home = %(base)/%(projects) #这里指定虚拟环境的地址, /home/panyu/script
master = true
processes = 5
socket = /run/uwsgi/%(project).sock
chown-socket = %(uid):www-data
chmod-socket = 660
vacuum = true
daemonize = %(base)/%(path)/%(project)/uwsgi.log
配置好uwsgi.ini时,就需要等待nginx配置好后,调用了.
3):为uWSGI创建systemd单元文件
sudo nano /etc/systemd/system/uwsgi.service #创建uwsgi.server文件
[Unit] Description=uWSGI Emperor service [Service] ExecStartPre=/bin/bash -c 'mkdir -p /run/uwsgi; chown panyu:www-data /run/uwsgi' #这里的panyu是指用户 ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/sites ExecStart我们将指向uwsgi
可执行文件
Restart=always
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all
[Install] 这允许我们指定何时应该自动启动服务
WantedBy=multi-user.target
此时我们无法成功启动服务,因为它依赖于www-data
用户可用。在安装Nginx之前,我们必须等待启动uWSGI服务
二:nginx配置以及使用
1,安装
sudo apt-get install nginx
2,配置 sudo nano /etc/nginx/sites-available/script #写nginx的配置文件
upstream django_data_center {
server unix:/run/uwsgi/data_center.sock; # for a file socket #只想uwsgi的sock文件
#server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
server {
listen 80;
server_name testdatacenter.yimeijian.cn; #指定域名或者是ip地址,指定ip地址的时候加上listen 8000;
location / {
alias /home/ubuntu/data_center/data_center_web/dist/; #直接指向静态文件地址 一般情况下是前段项目 访问:127.0.0.1:8000/ 就会访问该路径
index index.html; #前段的初始页面
}
location /assets/ {
alias /home/ubuntu/data_center/data_center_web/dist/; #前段的静态文件夹 图片等存放文件夹
}
location /public/ {
alias /home/ubuntu/data_center/data_center_web/dist/; #公共文件
}
location /static/ {
alias /home/ubuntu/data_center/data_center/static/; #后端的静态文件
}
#后端接口 统一以v1开始
location /v1/{ #只要以 /v1/ 开始的借口访问走这里
include uwsgi_params; #导入外面的uwsgi_params
uwsgi_pass django_data_center; #django_data_center 是指向最开始的upstream名称
uwsgi_read_timeout 30;
}
location /docs/{
include uwsgi_params;
uwsgi_pass django_data_center;
}
location /admin_login/{
include uwsgi_params;
uwsgi_pass django_data_center;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
listen 443 ssl; # managed by Certbot #这里给htpp请求时,加上ssl协议,也就是访问的时候要用httpls://,下面是他的参数
ssl_certificate /etc/letsencrypt/live/testdatacenter.yimeijian.cn/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/testdatacenter.yimeijian.cn/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server { #这里重定向,如果访问testdatacenter.yimeijian.cn,就强制加上https
if ($host = testdatacenter.yimeijian.cn) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 8080;
server_name testdatacenter.yimeijian.cn;
return 404; # managed by Certbot
}
server {
if ($host = testdatacenter.yimeijian.cn) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name testdatacenter.yimeijian.cn;
return 404; # managed by Certbot
}
3,善后
1):我们写的文件是在/etc/nginx/sites-available,复制一份到sites-enbaled
cp script /etc/nginx/sites-enbaled
2):测试是否有语法错误
sudo nginx -t #报错会有提示
3)启动nginx
sudo systemctl start nginx
sudo systemctl restart nginx
三,uwsgi + nginx 联动
启动uwsgi
sudo systemctl start uwsgi
也可以自动启动
- sudo systemctl enable nginx
- sudo systemctl enable uwsgi
四:报错答疑
1, 如果页面报 502,表示nginx已经找到uwsgi.sock文件了
答:查看下后台,也就是uwsgi.log文件,看看是什么错误
错误: no python applicaton fund... 没有找到python,查看是否使用虚拟环境,有的话在uwsgi.ini中,配置home参数,指定虚拟环境的位置.
2,报unix:/run/uwsgi/firstsite.sock失败
这表明Nginx无法在给定位置找到套接字文件,
1,先查看是否有.sock文件
sudo ls /run/uwsgi
2,查看是否启动uwsgi
sudo systemctl status uwsgi
3,查看systemd文件夹下面的文件更改了没有重新reload
- sudo systemctl daemon-reload
- sudo systemctl restart uwsgi
3,如果报404
表示nginx,没有找到ip或者路劲
1,检查nginx是否更新
2,查看nginx配置文件是否错误,
详细情况可以查看:https://www.digitalocean.com/community/tutorials/how-to-serve-django-applications-with-uwsgi-and-nginx-on-ubuntu-16-04