Ubuntu16.04下Nginx+uwsgi部署Django项目

之前写了一篇Pycharm远程调试django项目的,只是完成了Django项目在服务器上的运行。而且当时是用的虚拟机,有些坑并没有遇到。前几天买了阿里云的Linux服务器ubuntu16.04,一路搭建环境和部署过程搞了2天多,可以说是神坑无数,最有意思的网上的很多博客是叫踩坑记录,结果照着这些方式去搞出现了很多奇怪的问题,估计也和版本不同有关。这里为了避免少走一些弯路,我就来记录一下整个过程(这里都是默认root用户远程登录下进行操作,项目名为DjangoTest)。

Python环境的配置

因为Python环境都是Linux系统上面自带的,我这里项目用的设Python3.6,安装的过程就不多说了,这里基本没什么问题,安装好后只需把安装目录链接到系统自带的python3(系统自带的是Python3.5)即可。本来这里应该没什么问题的,但刚这个项目需要请求https的链接,因为在本地的时候会这里是不会出问题的,但是一旦放到服务器端,坑也就来了。请求时直接返回这么一句异常

SSLError("Can`t connect to HTTTPS URL because the SSL module is not available"))

可以看到用到是python中的ssl模块不存在,直接去安装好相应的openssl模块后,还是抛出这个异常。于是不停的去Google和百度,过程中也是按照类似的答案,结果还是没能解决这个问题。最后我就卸载了Python3.6, 直接用3.5的环境去运行,这个问题才得以解决。
具体应该是因为系统默认的是加载已存在的ssl模块,用3.6版本的虽然也依赖了,但是并不会识别,发现不是来自默认Python环境中自带的,就无法加载。这里感觉也是能配置的,但事实就是我不知道多少次的卸载重装,按照各种方式去安装和依赖,还是出现同样的问题,好在3.6版本的项目在3.5上还是基本兼容的,虽然暴力,但不失为一种办法。(如果哪位有更好的解决办法,欢迎给我留言)

这里完成后就是Python虚拟环境容器的安装和环境变量的配置

pip install virtualenvwrapper

这里的话,因为之前写过,就不多说了,可以参考我的之前的一篇博客Pycharm远程调试Django项目

Mariadb的配置

本来不想写数据库的,但这里我也是第一次用Mariadb,并且在配置文件方面发生了一些变化,也踩了一些坑。
Mariadb是MySQL的一个分支,开发者也是MySQL的作者,所以Mariadb是完全兼容MySQL的基本命令的。
安装

apt-get install mariadb-server

如果报本地不存在,就先更新下源

apt-get update

安装完成后直接启动服务

/etc/init.d/mysql start  
/etc/init.d/mysql stop
/etc/init.d/mysql restart

然后直接输入mysql进入数据库后

use mysql

更改mysql密码

update user set Password = PASSWORD('你的密码') where User ='root';

然后设置外部ip访问权限

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你的密码' WITH GRANT OPTION;
FLUSH PRIVILEGES;

这里完成后 重启一下 ,然后还需要修改一下配置文件中绑定的地址

vim /etc/mysql/mariadb.conf.d/50-server.cnf

找到这一行



直接注释掉就可以了。最后需要注意一下,如果是用的阿里云的服务器就需要配置一下安全组规则,开放3306端口。
这样就能完成数据库的远程连接了。
注意:
如果Django项目中用到Mysql的话,需要在服务器端的Python虚拟环境下安装一下

pip install mysqlclient

可能会安装出错,因为缺少一些依赖包,安装一下

apt-get install libmysqlclient-dev

然后重新安装mysqlclient,这样配置就完成了。

uwsgi的安装和配置

uwsgi也是一种web服务器,这里就不多介绍了,直接开始安装

pip install uwsgi

可以先来测试一下

uwsgi --http 0:80 --module DjangoTest.wsgi

然后使用配置文件的方式来启动django项目,可以直接在项目的目录下新建一个uwsgi.ini文件

# mysite_uwsgi.ini file
[uwsgi]
# Django-related settings
# 项目根目录的路径
chdir           = /你的路径/DjangoTest
# Django's wsgi file
module          = DjangoTest.wsgi
# the virtualenv (full path)

# process-related settings
# master
master          = true
# maximum number of worker processes
processes       = 10
# the socket (use the full path to be safe
socket          = :8000
# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true
# 虚拟环境的目录
pythonpath = /你的虚拟环境的路径/lib/python3.6/site-packages/

配置文件写好后,其实我们是可以直接用uwsgi就能完成部署的,使用命令

uwsgi -i uwsgi.ini

如果端口号被占用,就直接使用命令查看占用情况

lsof -i :8000

然后使用命令,销毁这些进程

killall -9 uwsgi

但是为了提高扩展性,我们继续下面的步骤

Nginx的安装与配置

nginx是一个强大的中间件,我们直接把它作为对外的服务接口。
开始安装

apt-get install nginx

然后看看启动、停止和重启命令

/etc/init.d/nginx start
/etc/init.d/nginx stop
/etc/init.d/nginx reload

这里注意,其它配置文件不要乱改!如果安装完成不能正常启动的话可以重启服务器看看。没问题的话,我们可以在项目目录下新建一个nginx.conf文件,然后按照下面的方式配置

# the upstream component nginx needs to connect to
upstream django {
#django项目的端口号 和uwsgi里面的端口号保存一致
server 0.0.0.0:8000; # for a web port socket (we'll use this first)
}
# configuration of the server

server {
# nginx服务的端口号 不用修改
listen 80;
# the domain name it will serve for
# 这里可以填写你的ip地址或者域名
server_name www.test.com;
charset     utf-8;

# max upload size
client_max_body_size 75M;   # adjust to taste

# Django media
location /media  {
    alias /你的路径/DjangoTest/media;  # 指向django的media目录
}

location /static {
    alias /你的路径/DjangoTest/static; # 指向django的static目录
}

# Finally, send all non-media requests to the Django server.
location / {
    uwsgi_pass  django;
    include     uwsgi_params; # the uwsgi_params file you installed
}
}

配置写好后,就需要把它链接到Nginx的启动配置文件中,

ln -s /你的目录/DjangoTest/nginx.conf  /etc/nginx/conf.d/

配置完成后,再去加载一下uwsgi文件。

总结

配置好后,直接输入IP地址或者解析到该IP的域名就能成功访问到Django项目了,这样你也会发现,通过nginx我们可以轻松地配置和部署多个环境不同的站点,只需要把配置文件写好后放入nginx的启动文件中。
最后来整理一下整个访问的过程

1.使用nginx作为外部接口,直接处理发送过来的请求,如果是静态请求,就直接根据配置的静态文件目录,返回相应的静态资源。
2.如果是动态请求,就通过配置文件将请求转移到uwsgi,uwsgi又会将接受到的请求传递给wsgi(Django项目默认通过wsgi启动服务的),wsgi就会根据请求来调用Django项目中的逻辑来处理请求。
3.处理完成后,又将结果返回给uwsgi,然后uwsgi又继续将结果返回给nginx
4.最后Nginx将处理后的结果返回给用户

虽然过程中遇到很多坑,但在多次的尝试中更能加深自己的经验和理解。
最后,祝大家在新的一年里,技术节节高升!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容