Nginx+uwsgi+ssl配置https

Stella981
• 阅读 796

使用原始django,太过于笨重和杂多
nginx是一个轻量级的web服务器,在处理静态资源和高并发有优势
uwsgi是一个基于python的高效率的协议,处理后端和动态网页有优势
所以这里采用静态网页交给nginx解析,动态网页交给uwsgi解析,并且nginx配置ssl,即可以使用出高安全,高效率的部署。

步骤

我这里使用的是Ubuntu18.04版本,服务器在阿里云
没用centos的原因是Ubuntu我用的更顺手

1.在Ubuntu上安装Django生产环境
python3.6 django3 mysql5.7 nginx uwsgi

这里安装就落入了第一个坑,Ubuntu系统带了好多python和pip工具,很乱。
我先按照python3.8----->修改pip3指定的编译器,将python3.6改成python3.8
从官网安装MySQL----->下载官网的deb包------>dpkg一下这个包------->系统update------>系统获取安装mysql8。
安装virtualenv和virtualenvwrapper。windows上面习惯了用这两个包,linux上自然也安上,但后面却报错了,很无奈,只能再删除掉,等会你就懂了
pip安装django uwsgi,sudo apt 安装nginx。这步我觉得是这一天里最简单的
pip安装mysql依赖包 mysqlclient。这步真的是酸辛泪,一上午全费到这里了。我这里是在virtualenv虚拟环境中进行安装的。但,它就是报错,哪怕我百度之后,安装了再多的系统依赖包,它还是报错。等我绝望的时候,退出虚拟环境,在本来的编译器中试了一下pip3 install mysqlclient,结果缺成功了,就很绝望。想着是不是外面的pip list里面有可能这个的依赖包?然后我把pip list所有的包记下来,再进虚拟环境按一遍,之后再安装mysqlclient,结果还是报错。绝望。只能删除了virtualenv,然后把mysqlclient安装到了外面的环境(至于为什么这里不用pip freeze ->去安装,我原环境在windows,ubuntu里面还有好多都有的包,网上没用,这样一回推安装就报错,很绝望。)
2.测试一下这些包都有没有问题
先生成数据库迁移文件,makemigrations 之后迁移migrate 成功
先测试django,直接runserver manage, 测试url, 成功访问
再测试nginx,打开服务,直接访问ip。成功访问到
测试uwsgi,现在项目文件夹里写一个xxx.ini,内容如下

[uwsgi]
#项目根目录,要绝对地址
chdir = /root/xiangmu
#根目录下的wsgi
module = xiangmu.wsgi
http = :80

之后uwsgi --init xxx.ini就行了,结果成功~~

3.为nginx生成静态文件
这里需要你现在你项目的settings文件里,最下面加一行数据
STATIC_ROOT=os.path.join(BASE_DIR,'你想取的文件夹名')
之后运行命令 python manage.py collectstatic会在你的项目根目录生成一个你上面指定的文件夹
这个文件夹包含你会用到的所有静态资源,用来调给nginx使用

4.修改nginx配置文件
在/etc/nginx/conf.d/文件夹下生成一个叫[你项目名].conf的项目配置文件
将中文修改成你所需要的

upstream 自定义1{
server 127.0.0.1:8001;
#上面的这个端口号需要记得,等会uwsgi要写一样的
}
server {
listen 80;
server_name [写你自己要上线的网站ip或者域名];
charset utf-8;
client_max_body_size 75M;

location /static/ {
alias /项目的绝对路径/static_dist/;
}
location / {
uwsgi_pass 自定义1;
include uwsgi_params;
uwsgi_read_timeout 30;
}
}

这段话的意思我来概述一下,

第一个大代码块:配置一个等会和uwsgi响应的地址
第二个大代码块:监听80号端口,设置访问域名和ip
第一个location:遇见网页需要static的(我django静态资源都在这个文件夹下面),转到咱们设置的新的static_dist里面使用。(这样是不是就不会请求uwsgi动态网页了)。
第二个location:遇见网页其他的,返回给uwsgi动态网页解析去。(这样动态静态是不是就分开了)
在nginx配置文件写完以后,就可以service nginx configtest测试一下正确不,如果显示正常,那么就没问题。就可以重新启动服务了service nginx restart
重启服务完,你访问网页应该还是404,别着急,因为我们还没有配置uwsgi

5.修改前面项目路径下的配置文件(前面的那个xxx.ini)
上面的http=:80这里就不用了

[uwsgi]
#项目根目录,要绝对地址
chdir = /root/xiangmu
#根目录下的wsgi
module = xiangmu.wsgi
#下面的这个,一定要和你刚才nginx配置里的自定义1一样
socket = 127.0.0.1:8001
chmod-socket = 666
#底下三个不加会运行默认值
master = true
processes = 4
vacuum = true

之后就可以运行了,uwsgi --ini xxx.ini。
这里你的网页应该就能访问了。如果不能访问,请自己再捋一次逻辑关系,看看自己写错没
如果发现css和js这些静态文件没加载,别着急,看下面

可能出现的错误

css、js、等静态文件没加载
这里我们要弄清一个事情,网页都是从nginx转发出去的,如果没有静态文件,说明nginx出了问题。
打开你浏览器的f12的网络窗口,刷新一下,看看你的静态文件是403错误还是404错误。

如果是404错误的话,没找到,那问题就出现在配置路径上,核对nginx里的location static和你生成的静态文件路径
如果是403错误,说明这会你的静态文件禁止加载,nginx权限不够,所以我们修改两个地方
打开/etc/nginx.conf,注意,这里是/etc/nginx.conf!! /etc/nginx.conf!! /etc/nginx.conf!!不是你上面那个你项目的配置文件,是nginx的整体配置文件!!!!!!我一开始一直以为是上面的那个项目配置文件,在这里走了很多弯路。。晕。
在打开的文件里,最上面的 user xxx;改成user root; (如果你没有这个,说明你打开错了!!)
找到原始的static和生成的static_dist这些静态文件目录,给目录整体赋权限
chmod -R 777 static chmod -R 777 static_dist
这样403错误应该就搞定了~

将项目部署成https,也就是443端口
1.首先先从服务器提供商处申请一下证书。这个可以百度一下,阿里云,腾讯云都有免费的。
2.将从运营商拿到的两个证书(pem和key),放在你/etc/nginx/cert/这个目录下。
3.修改你项目的nginx配置文件

#后面的中文不用修改,其他中文修改成你自己的

upstream 自定义1{
server 127.0.0.1:8001;
}
server {
listen 443;
server_name 网站域名或者ip;

ssl on;
ssl_certificate cert/尾缀为pem的那个文件.pem;
ssl_certificate_key cert/尾缀为可以的那个文件.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#密码加密方式
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码
ssl_prefer_server_ciphers on;

charset utf-8;
client_max_body_size 75M;
location /static/ {
alias /项目的绝对路径/static_dist/;
}

location / {
uwsgi_pass 自定义1;
include uwsgi_params;
uwsgi_read_timeout 30;
}
}
#监控80端口,强制跳转到443端口
server {
listen 80;
server_name 域名或ip;
rewrite ^(.*)$ https://www.$server_name$1 permanent;
}

监听443端口,然后将两个证书加进来
监听80端口,强制转到443上面来

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
Tomcat & SVN
1\.Tomcat简介tomcat是一个web服务器,类似nginx,apache的httpnginx,http只能处理html等静态文件(jpg)网页分为静态网页(以.html或者.htm结尾的url地址)和动态网页nginx和http配合php就能够处理动态的网页(.php结尾)tomcat也可以处
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
Django + Uwsgi + Nginx 实现生产环境部署
本节内容uwsgi介绍uwsgi安装使用nginx安装配置djangowithnginx如何在生产上部署Django?Django的部署可以有很多方式,采用nginxuwsgi的方式是其中比较常见的一种方式。uwsgi介绍uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。N
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这