Django+uswgi+Nginx(http→https)

Django+uswgi+Nginx(http→https)

1、配置

使用Ubuntu20.4云服务器、django2.1.7、python3.8、MobaXterm远程登陆平台,使用服务器的root用户,服务器开放8888端口

2、Django+uswgi+nginx流程

由于我不是专业做网络服务的,只是项目需要测试,所以只是自己的理解。

①通信流程:用户发送请求,被nginx监听到,由于nginx和uswgi通过socket连通,nginx监听到请求后会映射到uswgi,及Django端,而后django进行处理。

本文从Django构建(简单的请求和响应)→uwsgi使用→nginx部署→https(需要SSL证书)流程进行简单概述

3、构建Django所需虚拟环境

之前使用服务器的base环境运行django项目,但是uwsgi需要一个使用的环境路径,本来想通过

which python3找到了python3安装的位置

python3 -m pip list 查看python3安装的库及版本

在这里插入图片描述

pip3 show 库 找到库安装的位置。
在这里插入图片描述

但base环境的activate我没找到,所以只好重新建立一个django使用的虚拟环境

pip3 install virtualenv 安装虚拟环境包

virtualenv djangotest 新建名为djangotest的虚拟环境

source activate 激活虚拟环境,安装需要的库

注意虚拟环境的路径

4、Django只使用简单的请求和响应:

使用云服务器,MobaXterm登录可以直接上传文件。到相应目录激活环境,运行python3 manage.py runserver 0.0.0.0:8888(使用0.0.0.0可以使外网浏览器访问),注意一定要使用python3,否则会报错

①激活环境

在这里插入图片描述

②运行

在这里插入图片描述

③测试

请求:http://127.0.0.1:8888/dialog

响应返回:Episode end

由于使用了云服务器所以可以外网访问,IP为服务器ip
在这里插入图片描述

5、安装uwsgi

①首先安装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项目一致

在这里插入图片描述

6、安装及初步配置nginx

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  
7、配置uswgi

在第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

8、关于server_name和uswgi的http或socket使用

①server_name

可以使用服务器ip及买的域名(备案后)。除此之外我看有人说可以修改服务器etc/hosts文件,对服务器ip进行命名,而后修改nginx配置文件中的server_name为修改的名字,但是没成功。感兴趣的可以参考列出的博客,不知道是否有用。

在这里插入图片描述

②关于uwsgi使用socket与http,使用不同的参数,对应的nginx要不同,具体见参考2.

9、https配置

①使用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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wavehaha

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值