使用Ubuntu20.4云服务器、django2.1.7、python3.8、MobaXterm远程登陆平台,使用服务器的root用户,服务器开放8888端口
由于我不是专业做网络服务的,只是项目需要测试,所以只是自己的理解。
①通信流程:用户发送请求,被nginx监听到,由于nginx和uswgi通过socket连通,nginx监听到请求后会映射到uswgi,及Django端,而后django进行处理。
本文从Django构建(简单的请求和响应)→uwsgi使用→nginx部署→https(需要SSL证书)
流程进行简单概述
之前使用服务器的base环境运行django项目,但是uwsgi需要一个使用的环境路径,本来想通过
①which python3
找到了python3安装的位置
②python3 -m pip list
查看python3安装的库及版本
但base环境的activate我没找到,所以只好重新建立一个django使用的虚拟环境
④pip3 install virtualenv
安装虚拟环境包
virtualenv djangotest
新建名为djangotest的虚拟环境
source activate
激活虚拟环境,安装需要的库
注意虚拟环境的路径
使用云服务器,MobaXterm登录可以直接上传文件。到相应目录激活环境,运行python3 manage.py runserver 0.0.0.0:8888
(使用0.0.0.0可以使外网浏览器访问),注意一定要使用python3,否则会报错
①激活环境
②运行
③测试
请求:http://127.0.0.1:8888/dialog
响应返回:Episode end
①首先安装python开发包
apt-get install python3.8-dev
②pip3 install uwsgi 安装uwsgi,注意不使用虚拟环境安装,在base中安装
③可以进行测试:
uwsgi --http :8888 --chdir /home/wi/Dialog/DialogDiagnosis/ --module DialogDiagnosis.wsgi:application --home /home/wi/Dialog/dialogdiagnosis_uwsgi/djangotest/
-chdir为django项目所在的文件夹
-module 为django项目的wsgi中的application
-home为虚拟环境路径
-http 可以跟ip:端口,为接收请求的ip和端口,接收外网浏览器请求直接省略ip(应该是这样的)
得到的结果与第4节运行django项目一致
①apt-get install nginx
安装nginx
②nginx有以下几个配置文件
主配置文件:/etc/nginx/nginx.conf一般不用动
可用配置文件:/etc/nginx/sites-available我们一般更改这里的配置文件 (安装完只有一个default)
已用配置文件:/etc/nginx/sites-enabled,已经启用的配置文件 (安装完只有一个default)
在可用配置文件目录,新建一个mysite.conf此文件用于配置我们的项目。
③编写nginx配置文件
cd /etc/nginx/sites-available
vim mysite.conf
(当然可以直接打开文件编写)
在文件中写入如下配置:
upstream django {
server 127.0.0.1:8888; # for a web port socket (we'll use this first)
}
server{
listen 80;
server_name **.***.189.6;
# server_name www.witest.cn;
charset utf-8;
client_max_body_size 75M; #上传文件大小限制
# 网站静态文件所在目录
location /static{
}
# 动态文件交给uwsgi处理
location / {
uwsgi_pass 127.0.0.1:8888;
include /etc/nginx/uwsgi_params;
# proxy_pass http://127.0.0.1:8888;
}
}
需要注意我注释掉的部分,会在第8部分进行解释
重要参数
-listen 需要监听的端口,一般http都是通过80端口
-server_name 经过测试,这里可以写服务器ip和域名(域名需购买,由于我买的域名还没备案所以不能使用),当然我也搜到说可以给ip进行命名然后请求http://别名/**就可以,但并没有成功,会在第8部分说到
-location / {} 会把传来的请求/之前的东西转为uswgi_pass(我的理解哈),例如你的server_name使56.167.189.6,传来的请求是:http://56.167.189.6/hello,nginx会把它转为http://127.0.0.1:8888/hello,然后交友uwsgi处理
-location / {} 中uwsgi_pass 与你uwsgi配置文件中的socket参数一致(第7部分会说到)
include 必须写nginx目录下的uwsgi_params
注释掉的proxy_pass在uwsgi配置文件使用参数http使用,且必须加http://(socket不加是因为其不是基于http协议的(听说来的))
==推荐使用uwsgi_pass==
-location /static{} 网站静态文件,我的网站主要是进行数据处理,没有前端,所以不需要静态文件。
④将此文件再sites-enabled中创建一个软连接,表示此配置文件已经启用:
ln -s /etc/nginx/sites-available/mysite.conf /etc/nginx/sites-enabled/mysite.conf
⑤需要将启动nginx的用户改为root,要不然会出现403 forbidden的错误。打开/etc/nginx/nginx.conf
文件,将第一行中user后面的用户改为root即可。
⑥测试配置文件写的是否正确
nginx -t
service nginx restart
启动nginx
⑦其他
在Ubuntu上卸载nginx
# 删除除了配置文件以外的所有文件。
sudo apt-get remove nginx nginx-common
# 删除所有与nginx有关的东西,包括配置文件。
sudo apt-get purge nginx nginx-common
# 在上面命令结束后执行,主要是删除与Nginx有关的且不再被使用的依赖包。
sudo apt-get autoremove
# 删除两个主要的包。
sudo apt-get remove nginx-full nginx-common
验证是否成功卸载nginx
#重启nginx,重启失败,说明已成功卸载nginx
sudo service nginx restart
在第6部分测试了使用uswgi启动django项目,但没有对其进行配置,本节对其进行配置,使其与Nginx连通。
①建立配置文件
目录自选,我在/home/wi/Dialog/dialogdiagnosis_uwsgi/
目录下建立diagnosis.ini
文件作为配置文件
②写配置文件,在建立的ini文件中写入如下内容
[uwsgi]
chdir = /home/wi/Dialog/DialogDiagnosis/ # 项目目录
home = /home/wi/Dialog/dialogdiagnosis_uwsgi/djangotest/ # 项目需要的虚拟环境
module = DialogDiagnosis.wsgi:application #application
master = True
processes = 1 # 进程数
max-requests = 5000 # 最大请求数
harakiri = 60 # 设置的自中断时间
# socket = /home/wi/Dialog/dialogdiagnosis_uwsgi/uwsgi.sock # 这个不好用
socket = 127.0.0.1:8888 # 与nginx配置文件中的uwsgi_pass一致,转发接口?
# http = :8888 #指定ip和端口,这个不是很好用,我最终选择的socket,如果不使用nginx,使用该项,启动后外网可通过http:*.**.***.*:8888/**访问服务器web
# http = 127.0.0.1:8888 # 如果使用这个,需要配置nginx中的proxy_pass http://127.0.0.1:8888;
uid = root # 启动uwsgi的用户名和用户组
gid = root
pidfile = /home/wi/Dialog/dialogdiagnosis_uwsgi/master.pid # 进程id
daemonize = /home/wi/Dialog/dialogdiagnosis_uwsgi/mysite.log # log文件
vacuum = True # 自动移除unix Socket和pid文件当服务停止的时候
③配置完以后可以进行测试,启动uswgi
uwsgi --ini /home/wi/Dialog/dialogdiagnosis_uwsgi/diagnosis.ini
使用ps -aux | grep uwsgi
检查是否启动成功,若存在多个进程,则表示成功。
注意此时不能通过外网浏览器访问http://外网ip:8888/dialog(如第5节所示),因为socket写的是本机ip,主要通过nginx转发才可以(当uwsgi配置socket时,外部浏览器将无法直接访问)。
启动nginx,外网浏览器访问http://**.***.189.6/dialog
(与第5节相比少了端口号,其实**.***.189.6是写的server_name)
④其他
停止uswgi uwsgi --stop xxx.pid
,或sudo pkill -f uwsgi -9
重启uswgi uwsgi --reload xxx.pid
①server_name
可以使用服务器ip及买的域名(备案后)。除此之外我看有人说可以修改服务器etc/hosts
文件,对服务器ip进行命名,而后修改nginx配置文件中的server_name为修改的名字,但是没成功。感兴趣的可以参考列出的博客,不知道是否有用。
②关于uwsgi使用socket与http,使用不同的参数,对应的nginx要不同,具体见参考2.
①使用https需要购买域名及ssl证书,ssl可以在腾讯云免费申请,申请完以后进行下载,将密钥文件.key及.crt文件放置到etc/nginx路径下。而后重新配置第六步中提到的/etc/nginx/sites-available/mysite.conf
文件,在其中加入以下内容,设置https监听端口,一般是443.
server{
listen 443 ssl;
# server_name www.w******ig*****is.com,w******ig*****is.com; # 购买的域名
server_name **.***.189.6;
ssl_certificate /etc/nginx/w******ig*****is.com_bundle.crt;
ssl_certificate_key /etc/nginx/w******ig*****is.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
charset utf-8;
client_max_body_size 75M;
location / {
uwsgi_pass 127.0.0.1:8888;
include /etc/nginx/uwsgi_params;
}
}
由于我买的域名备案未完成,所以server_name先用ip测试。
重启nginx及uwsgi的ini文件,就可以了,外网输入https://****/dialog可以得到响应。
②还有提到可以在在/etc/nginx/nginx.conf文件里的http模块中写入下面的配置文件,将http请求转到https请求(感觉非必须)
server{
listen 80;
server_name **.***.189.6;
# server_name www.w******ig*****is.com,w******ig*****is.com;
rewrite ^(.*) https://$host$1 permanent;
}
以上都是使用的ip测试,如果自己买了域名,可以将server_name设为自己的域名。
1、使用python manage.py runserver 0.0.0.0:8888
运行报错from exc ^ SyntaxError: invalid syntax
在网上搜索后有人说缺乏相应的库,但pip list 里有,后来发现原因是应该使用python3 manage.py runserver 0.0.0.0:8888
Django + Uwsgi + Nginx 的生产环境部署 - amchen - 博客园 (cnblogs.com)
Nginx+UWSGI配置问题-uwsgi配置文件中的http和socket的区别 - 简书 (jianshu.com)
nginx配置文件nginx.conf之server及server_name的意义详解_我在关山口开摇摇车的博客-CSDN博客_nginx配置server_name
Nginx配置server_name详细教程 (itheima.com)
How nginx processes a request
Django项目使用nginx和uwsgi配置生产环境(https/http)_jelly_lzy的博客-CSDN博客
Django线上部署教程:腾讯云+Ubuntu+Django+Uwsgi - 腾讯云开发者社区-腾讯云 (tencent.com)