django+nginx+uwsgi+MySQL 项目部署


最近因为完成了一个小项目的云服务器部署,在中间踩了很多的坑,所以写这篇文档,梳理一下自己的思路,好了废话不多,开始正文。

1. 首先你需要找一个自己喜欢的云服务器(我喜欢免费的),所以我就选择了腾讯云服务器的免费15天体验,这里我选择了Ubuntu Server 18.04.1 LTS 64位的服务器,这个版本的服务器自带了Python3.6和Pythonon 2.7哦,经过巴拉巴拉登录等操作,领取服务器等动作以后就可以看到下图的界面啦。

云服务器

2.上述的图片中箭头表示的是后面后续需要用到的比较重要的地方,这里如果是微信等登录方式的,需要重置一下密码,重置后就可以登录啦,登录后就能得到一个终端的界面在浏览器中,这个时候的系统是一个纯净版的Ubuntu,我们需要自己来安装各种我们需要的库和软件。

3.说起安装Python3第三方库的话,就需要用到pip3啦,这里有坑注意

首先安装pip3:sudo apt-get install python3-pip

pip3 install --upgrade pip 更新pip3版本

更新pip3至最新版本后 - 需要修改 pip3 文件,流程如下

sudo vi /usr/bin/pip3

from pip import __main__

if __name__ == '__main__':

    sys.exit(__main__._main())

这样一来我们的pip3就能顺利的使用啦

4.这里就可以开始安装自己需要的库啦,如果没有用库导出的方法的话,就只能自己打命令来下载咯~

安装django:sudo pip3 install Django==1.11.8

安装jwt:sudo pip3 install pyjwt

安装uwsgi:sudo pip3 install uwsgi

安装pymsql:sudo pip3 install pymysql

官网下载 django-cors-headers-3.0.2.tar安装源码包,方法如下10.1 解压 tar -zxvf django-cors-headers-3.0.2.tar10.2 cd 至 解压后的目录 并执行 sudo python3 setup.py install

安装nginx:sudo apt-get install nginx

5.这里注意就是跨域请求头插件cors如果直接打命令的话会直接强制升级Django项目到最新版本的哦,所以如果项目是用其他Django版本创建的话,最好不要直接打命令的方式来下载哦,需要去官网下载包来安装,对了,这里的话来提一下如何传输文件到远程服务器吧,上传文件到服务器的方法有很多,比如windows操作系统中的WinSCP方法,XFTP一样可以提供在windows与Linux之间传输的文件的工具,同样提供有图形化的操作界面,操作起来会比较方便。

这里就介绍一个在Linux系统里比较简单的方法好啦!

操作步骤

在 Linux 操作系统的计算机上,执行以下命令,向 Linux 云服务器上传文件。

scp本地文件地址 云服务器登录名@云服务器公网 IP/域名:云服务器文件地址

例如,您需要将本地文件/home/lnmp0.4.tar.gz上传至 IP 地址为129.20.0.2的 CentOS 系统云服务器对应目录下,则执行的命令如下:

scp /home/Inmp0.4.tar.gz root@129.20.0.2:/home/Inmp0.4.tar.gz

Enter,并输入登录密码,即可完成上传,这样一来,到时候项目也可以打包一起上传到服务器上咯。

如果需要从云服务器下载文件的话也是这样哦!

scp root@服务器地址:/服务器上文件名字或路径+空格+/本地路径

例如:

scp root@255.1.1.1:/opt/cheery/sys.log /d/workspace

6.这个项目中我用的是MySQL的数据库,所以当然必须要安装一下MySQL咯~

#命令1

sudo apt-get update

#命令2

sudo apt-get install mysql-server

安装好后当然需要先初始化配置一下咯~

sudo mysql_secure_installation

配置项较多,如下所示:

#1

VALIDATE PASSWORD PLUGIN can be used to test passwords...

Press y|Y for Yes, any other key for No: N (我的选项)

#2

Please set the password for root here...

New password: (输入密码)

Re-enter new password: (重复输入)

#3

By default, a MySQL installation has an anonymous user,

allowing anyone to log into MySQL without having to have

a user account created for them...

Remove anonymous users? (Press y|Y for Yes, any other key for No) : N (我的选项)

#4

Normally, root should only be allowed to connect from

'localhost'. This ensures that someone cannot guess at

the root password from the network...

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y (我的选项)

#5 默认情况下,MySQL附带一个test的数据库,任何人都可以访问,可以选择是否需要删除

By default, MySQL comes with a database named 'test' that

anyone can access...

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y(我的选项)

#6

Reloading the privilege tables will ensure that all changes

made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y (我的选项)

好了,那么让我们来检查一下MySQL服务状态

systemctl status mysql.service


MySQL服务状态

当然啦,如果你觉得每次都需要启动远程服务器来进入MySQL太麻烦的话呢,就要做配置远程访问啦

在Ubuntu下MySQL缺省是只允许本地访问的,如果你要其他机器也能够访问的话,需要进行配置;

首先用根用户进入

sudo mysql -uroot -p

登入root进行其他设置:

GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY "123456";

其中root@localhos,localhost就是本地访问,配置成%就是所有主机都可连接;第二个'123456'为你给新增权限用户设置的密码,%代表所有主机,也可以是具体的ip;不过这随设置了%但我root通过工具还是登陆不进去,可能是为了安全性,所以新建数据库和用户;

新建数据库和用户

##1 创建数据库CREATE DATABASE movieserver;

##2 创建用户luckyxxxx(密码123456) 并允许luckyxxxx用户可以从任意机器上登入mysql的movieserver数据库GRANT ALL PRIVILEGES ON movieserver.* TO luckyxxxx@"%" IDENTIFIED BY "123456";

MySQL
MySQLuser


7.好啦,这里我就不写数据库表的建立或者数据库的迁移的内容啦~如果你的项目不想使用nginx映射呢,下一个8的内容就不需要看啦,如果需要用呢就请继续耐心看下去哦,这里先写一个不需要用nginx的方法吧,这里注意可以把Django项目setting中的DEBUG改成False咯,还有这里ALLOWED_HOSTS = ['*']修改一下

项目部置在软件开发完毕后,将开发机器上运行的开发板软件实际安装到服务器上进行长期运行,用 uwsgi 替代python3 manage.py runserver 方法启动服务器,使用 python manage.py runserver 通常只在开发和测试环境中使用,当开发结束后,完善的项目代码需要在一个高效稳定的环境中运行,这时可以使用uWSGI,uWSGI是WSGI的一种,它可以让Django、Flask等开发的web站点运行其中

让我们来到项目的目录下 cd 项目文件夹,创建一个名字叫做uwsgi.ini的文件吧

[uwsgi]

#Http通信方式的 IP地址:端口号

http=127.0.0.1:8000

#项目当前工作目录

chdir=/home/ubuntu/project/movie2.0/movieserver ... 这里需要换为项目地址

#项目中wsgi.py文件的目录,相对于当前工作目录

wsgi-file=movieserver/wsgi.py

进程个数

process=4

每个进程的线程个数

threads=2

服务的pid记录文件

pidfile=uwsgi.pid

服务的目志文件位置

daemonize=uwsgi.log

uwsgi

好啦,当我们配置完成这个文件以后就不需要像以前一样在终端中输入python3 manage.py runserver来启动一个项目啦,这里就直接启动uwsgi文件就好啦,那么我们来到项目目录下吧

启动uwsgi

sudo uwsgi --ini uwsgi.ini

停止uwsgi

sudo uwsgi --stop uwsgi.pid

说明:当uwsgi 启动后,当前django项目的程序已变成后台守护进程,在关闭当前终端时此进程也不会停止

在浏览器端输入http://127.0.0.1:8000 进行测试,uwsgi还有很多很多的功能,这里就不一一介绍啦~哈哈

**注意,此时端口号为8000

8.好啦,这样我们的服务器差不多就布置完成了,但是我们的网站总有一个端口号让我们感觉比较差呢~那就让我们来布置一下新的东西,那就是nginx 反射代理

Nginx是轻量级的高性能Web服务器,提供了诸如HTTP代理和反向代理、负载均衡、缓存等一系列重要特性,在实践之中使用广泛。因为它是C语言编写,所以执行效率高。

nginx 作用

**负载均衡, 多台服务器轮流处理请求

反射代理

原理:客户端请求nginx,再由nginx 请求 uwsgi, 运行django下的python代码

nginx反射代理

uwsgi配置

这里因为我这个小项目是用了前后端分离来实现的,所以正好一个用到了nginx,这里就来写一下我的nginx配置,这里一样cd到项目目录下来创建一个uwsgi.ini的文件,然后用vim打开

这里我就不再复述很多uwsgi的配置了,就是需要注意把HTTP那一行改成socket

修改项目文件夹/uwsgi.ini下的Http通信方式改为socket通信方式,如:

[uwsgi]

# 去掉如下

# http=127.0.0.1:5000

# 改为

socket=127.0.0.1:5000

uwsgi 2.0版本

nginx配置

修改nginx 的配置文件 /etc/nginx/sites-available/default

# 在server节点下添加新的location项,指向uwsgi的ip与端口。
server {...

        server_name xxx.xxx.xxx.xxx;#这里就可以写你的公网IP或者域名咯

        location / {

               # First attempt to serve request as file, then

               # as directory, then fall back to displaying a 404.

               # try_files $uri $uri/ =404;

               uwsgi_pass 127.0.0.1:5000; # 重定向到127.0.0.1的8000端口

               include uwsgi_params; # 将所有的参数转到uwsgi下

              }

        location /static {

                    # root static文件夹所在的绝对路径,如:

                    alias /home/ubuntu/project/movie2.0/movie/static; # 重定向/static请求的路径,这里改为你项目的文件夹}

...}


nginx


这里要注意一定要注释掉try_files $uri $uri/ =404;这句话哦,然后还有在location的后面和 / 的后面都是有空格的哦,千万注意要加上哦,还有static上面也是有的哦

启动 nginx

$ sudo /etc/init.d/nginx start

$ sudo service nginx restart

查看nginx进程

$ ps aux | grep nginx

$ sudo /etc/init.d/nginx status

$ sudo service nginx status

停止nginx

$ sudo /etc/init.d/nginx stop

$ sudo service nginx stop

重启nginx

$ sudo /etc/init.d/nginx restart

$ sudo service nginx restart

9.好啦,万事大吉啦,那么就让我们来重启和启动uwsgi和nginx吧,这里要注意修改前端html中带有http协议的地址把地址【127.0.0.1:5000 更换 公网IP】(这里注意连端口号都不需要了哦),铛铛,结束啦~

这里加上我最爱的座右铭

Nothing is impossible to a willing heart!

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

推荐阅读更多精彩内容