亲测!!通过pycharm将Django项目部署到云服务器 uwsgi+nginx+mysql

前言: 前段时间为了帮大学生将项目部署起来,我又实践了一遍,踩了各种坑,最后成功实现,文档写的很详细,
读者可以进行一步操作,这次我使用的pycharm解释器上传到云端,真的是超级方便,还可以修改代码后上传到服务器,然后到服务器重启下nginx就行。
这里使用到技术 nginx+uwsgi+mysql 本篇没有使用mysql主从和docker。 大家可以访问 ip 47.103.98.8

1 远程登录阿里云服务器(终端)

1 这里我用的是macOS,可能命令会有所不同,不同系统的同学百度怎么远程登录。

image-20200802111032538

2 在上一层目录中 创建 /data 文件,存放我们的项目目录,在实际工作中我们的项目也是放在data目录下

  • 在当前的目录返回上一层目录 cd .. 查看当前目录 ls 创建文件夹 mkdir data 进入某一个文件夹 cd

    image-20200802111957145

2 使用pycharm 将项目上传到 远程服务器 /data 目录中

注意只有Pycharm专业版才具有部署的功能,社区版(无需破解)是没有此功能

image-20200729173829772

添加配置,起个名字

image-20200729173929231

image-20200802113304423

image-20200802113916087

以上都配置好了,然后我们将我们本地的项目上传到远程服务器中

image-20200802114629410

成功上传

image-20200802115048136

远程登录服务器下

image-20200802115248040

image-20200802115423220

3 远程服务器安装所需项目的环境

1 安装python3.6

一般的linux系统都会默认安装python2.7,而现在python3已经大行其道,我们的项目也是使用python3的,所以我们来给云主机安装python3.6。

进入到终端服务器中,我们先检查一下云主机目前的python版本,使用命令:python --version,查看:

image-20200802120144911

提醒千万不要将python2删除,因为有些系统功能依赖python2,所以我们只要添加python3.6就可以

安装步骤

1 apt-get install software-properties-common

1.1 sudo add-apt-repository ppa:jonathonf/python-3.6

image-20200802122356237

2 更新系统软件包并安装python3.6.4

1、sudo apt-get update
2、sudo apt-get install python3.6

3 验证是python3.6 安装成功

python3.6 -V

image-20200802125434757

安装成功后需要更改默认python版本,现在输入python还是显示2.7版本,我们要改为默认3.6版本

root@Linux:~# which python
/usr/bin/python
root@Linux:~# which python3.6
/usr/bin/python3.6
root@Linux:~# cd /usr/bin/
root@Linux:/usr/bin# sudo rm python
root@Linux:/usr/bin# sudo ln -s /usr/bin/python3.6 /usr/bin/python
root@Linux:/usr/bin# PATH=/usr/bin/:$PATH
root@Linux:/usr/bin# python
Python 3.6.11 (default, Jun 29 2020, 05:15:03) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
root@Linux:/usr/bin# 

image-20200802125938837

2 安装mysql

前言:后面我们的项目是用的mysql,所有此时我们需要在服务器中安装mysql,然后到我们的项目中的数据导入进去,才能让项目完整运行。 这里我们的数据库密码是 python

sudo apt-get install mysql-server

image-20200802131418847

等待提示设置密码,此密码是以后登录数据库的密码 python

image-20200802131509888

重复上一步设置的密码 python

image-20200802131546053

安装成功

image-20200802131657959

2 安装数据库客户端

sudo apt-get install mysql-client

image-20200802131746565

3 sudo apt-get install libmysqlclient-dev

image-20200802131836599

以上就安装上了mysql 数据库,让我们进入测试数据库是否成功

mysql -u root -p

提示输入之前第一条命令设置的密码,出现如下界面则安装成功

image-20200802132051189

查看数据库 show databases; 退出数据库 exit()/quit

image-20200802132153662

3 安装Nginx

什么是nginx?

1 nginx 是一个高性能HTTP服务器和反向代理服务器,最终的目的是实现网站的负载均衡;

2 nginx 作为web服务器,对处理索引文件和静态文件效率非常高,例如我们项目中的静态文件(HTML、CSS、JS)就交给nginx进行处理。

3 强大的反向代理和负载均衡功能,平衡集群中各个服务器的负载压力。

1 安装nginx

sudo apt-get install nginx

image-20200802133308448

2 运行(启动)nginx

nginx

image-20200802133406085

3 服务器查看运行状态 或浏览器打开

curl 47.103.98.8:80

image-20200802133649793

3 停止/重启 nginx

nginx -s stop/reload

4 安装uwsgi

概念:uWSGI 是一个 Web 服务器,它实现了 WSGI 协议、uwsgi、http 等协议。Nginx 中 HttpUwsgiModule 的作用是与 uWSGI 服务器进行交换。 简单来说:uwsgi 是处理 web应用中的动态资源类型(数据库的资源),uwsgi 会根据自己的uwsgi和WSGI协议 到对应的Django框架,Django框架下应用进行逻辑处理,然后将返回值进行发送到uwsgi服务器,然后uwsgi服务器发送给nginx服务器,最后nginx服务器将返回值给浏览器进行渲染展示给用户。

安装:

sudo apt-get install uwsgi

添加一个文件test_uwsgi.py 到 manage.py 同级目录下 测试uwsgi是否安装成功:

# 测试py文件
# test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"] # python3
    #return ["Hello World"] # python2

image-20200802134338927

image-20200802134541937

2 运行uwsgi测试 (在项目中下与manage同级):

uwsgi --http :8001 --wsgi-file test_uwsgi.py
# 显示 [uWSGI] getting INI configuration from uwsgi.ini 表示运行uwsgi成功

测试uwsgi运行状态是否正常 或 浏览器查看 :

注意:这里可能不会有response 响应,因为我们还要去阿里云开启安全组端口

curl 127.0.0.1:8001    # curl 是一种命令行工具,作用是发出网络请求,然后获取数据,显示在"标准输出"(stdout)上面

查看确认uwsgi进程是否启动成功:

ps -ef|grep uwsgi

注意: 端口占用使用:

lsof -i :8001   

kill占用端口

sudo	kill -9 pid # pid 端口号

4 Django项目启动

前言:在项目启动之前呢,我们最终要运行起来服务器中的myslq、uwsgi,nginx,才能让项目跑起,所以我们需要在阿里云服务器下先开放 对应的端口(安全组端口)才能成功让项目跑起。

image-20200802173319862

image-20200802174511699

1 下载项目库

  • 安装Django2.2

    pip install Django==2.2

2 项目settings.py 配置

DEBUG = False  # 改为False 

# 填写自己的域名或ip 或者直接*
ALLOWED_HOSTS = ["47.103.98.8"]
# 或者下面操作,接收全部 ------ 推荐这种
ALLOWED_HOSTS = ["*"]

# 数据库更改
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 数据库引擎
        'HOST': '47.103.98.8',  # 数据库主机
        'PORT': 3306,  # 数据库端口---> 这里要求阿里开放端口
        'USER': 'root',  # 数据库用户名
        'PASSWORD': 'python',  # 数据库用户密码
        'NAME': 'punch_system'  # 数据库名字

    }
}

3 远程配置mysql

上面已经开放了安全组3306端口,此时我们就需要将我们本地的数据库导入到云服务器中

1 编辑mysqld.cnf配置文件
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

2.注释掉bind-address = 127.0.0.1 然后保存退出(vim操作,请查找命令保存退出)

image-20200802193234949

3 连接数据库进入数据库

mysql -u root -p python

image-20200802194047999

数据库里执行操作

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'python' WITH GRANT OPTION; --> root 用户名 ‘%’ 表示任何ip都可以访问 BY ‘密码’

flush privileges;

exit 退出

---------> 下面这句不是在数据库里执行

service mysql restart 重启mysql服务器

image-20200802194247005

image-20200802194352930

4 本地navicat 连接远程数据库,并上传sql到远程数据库

image-20200802194925803

image-20200802195331133

5 添加一个数据表到远程数据库中

image-20200802195446241

远程数据库查看是否成功

image-20200802195609270

6 将项目所需的数据库添加到远程数据中

image-20200802202547455

image-20200802202625510

看看远程服务器是否有此数据库

image-20200802203458992

4 远程配置 uwsgi

在manage同级目录 中创建一个uwsgi.ini 文件,用来在云服务器运行 的uwsgi.ini

uswgi.ini文件如下

[uwsgi]
;使用nginx连接时使用,Django程序所在服务器地址
;选择内网IP和端口
;http = :8001  # -- 这里是 单独uwsgi 运行开启的
socket = 0.0.0.0:8001   # ----这里是与nginx服务器相通进行写的

; 项目所在根目录,与manage.py同级, 查找自己存放的路径, pwd (-----要修改为自己的路径-----)
chdir = /data/mytest

; 环境所在目录(-----要修改为自己的路径-----)  使用which 'python3'
home = /usr/
PYTHONHOME = /usr/bin/

; 主应用中的wsgi文件(-----要修改为自己的路径-----)
wsgi-file = mysite/wsgi.py

; 启动一个master进程,来管理其余的子进程
master = True

# 进程
processes = 4
# 线程
threads = 2

; 保存主进程的pid,用来控制uwsgi服务
pidfile = uwsgi.pid

; 设置后台运行,保存日志
daemonize = uwsgi.log

--enable-threads

image-20200802175048366

image-20200802203539275

7 单独启动uwsgi 运行项目(不加nginx情况下)

# 启动项目 uwsgi --ini uwsgi.ini
# uwsgi --stop/reload xxx.pid  停止/重启uwsgi
# ps -ef|grep uwsgi 查看确认是否uwsgi启动

image-20200802203746992

启动

image-20200802203835413

image-20200802203928980

看到这里,是能够成功显示了,但是没有达到我们的预期呀,你看,js、css都没有显示出来呀,别担心,这个时候我们可以添加nginx 来进行处理静态文件了,这样你就知道nginx的强大了吧(其实也可以不加,只需在uwsgi.ini,处理静态文件就行)

image-20200802210119735

8 uwsgi 还有一步,因为我们现在是单独运行uwsgi,后面我们需要加nginx,所有把http停掉,stock开启(在uwsgi.ini文件中) 然后在上传服务器

image-20200802211715126

5 添加nginx配置(实现负载均衡)

概念:nginx是一个HTTP服务器和反向代理服务器。是实现网站的负载均衡,减轻服务器压力, nginx处理静态文件(html、css、js)索引效率非常高。通常nginx是结合uwsgi一起使用的。

sudo apt-get update  #  更新
sudo apt-get nginx

2 启动nginx 默认开启的是80端口

# 启动
nginx
# 停止
nginx -s stop
# 重启
nginx -s reload

可以查看下nginx运行的进程

ps -ef|grep uwsgi

ps -ef  # 查看的是服务器中所有运行的进程

kill 进程

sudo  kill -9 pid # pid 端口号

可以通过浏览器访问下 或者 使用 curl -I 112.124.18.209:80 显示 200 OK 表示成功开启

浏览器显示的是:

屏幕快照 2019-12-19 下午6.28.52

3 查询nginx路径

nginx -t   # 腾讯云的同学要加sudo
# 第一个文件路径是等会我们要去添加配置的文件
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok 
# nginx: configuration file /etc/nginx/nginx.conf test is successful

修改nginx.conf 文件 /etc/nginx/nginx.conf 使用sudo vim

nginx.conf配置文件部分截图内容:屏幕快照 2019-12-20 下午2.59.28

注意重要的一点,这里部分截图的最后有两行文件

include /etc/nginx/conf.d/*.conf;

include /etc/nginx/sites-enabled/*; 

先说下原因: 因为nginx中有个默认配置文件default, 里面的默认监听端口是80端口,那么我们需要在阿里云配置的端口也是80端口,此时就会出现上我们自身配置的80端口是起冲突的,也就是说最终我们配置好了nginx信息,访问的时候还是nginx最初的页面 welcome to nginx 。 所以我们需要删除掉nginx默认的配置文件,让nginx访问我们配置的端口信息。

步骤:

步骤:

cd 进入 /etc/nginx/sites-enabled/ 路径下能够看到有个default文件, 通过cat default 能够看到默认配置信息, 我们需要做的就是 删除 或者 对文件进行移动到上一层, mv deault ../ 此时nginx就不会加载默认的配置了,通过curl 122.51.67.247:80 是不会访问最初的配置了,而是显示的拒绝连接的了。

现在我们要做的就是加载Nginx 配置信息,在上面截图 include /etc/nginx/sites-enabled/*; 下添加如下信息,路径你需要自己改成自己项目存放的路径。

步骤:

Xnip2020-07-31_17-12-01

2 vim 编辑 vim /etc/nginx/nginx.conf (不行就加sudo) 进行添加配置

server {
            # 监听端口
            listen      80;

            # 服务器域名或者ip地址 -- 没有就填localhost
            server_name localhost;

            # 编码
            charset     utf-8;

            # 静态文件 
            location /static {
                alias  /data/mytest/static/;
           }

           # 主目录
           location / {
           # 此处为uwsgi运行的ip地址和端口号
           uwsgi_pass  47.103.98.8:8001;  # 这里请读者修改自己的ip地址
           include uwsgi_params;
         }
}

image-20200802211349876

3 配置好nginx信息后 通过 nginx -t 检测配置是否正确

# 测试nginx配置文件是否正确
sudo nginx -t

# 如打印以下内容,表示配置没有问题
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
  
# 这时我们需要重新加载下nginx配置
sudo nginx -s reload 

4 然后访问 ip 地址就可以成功运行项目了,哈哈哈哈哈

5 、后期维护

后面我们需要改写代码的时候,肯定要上传到服务器。那么这里选择的是 pycahrm 解释器进行上传

粟子:

1 结合 2步骤 pycharm 项目上传到阿里云服务器截图

2 后期我们改动代码

栗子:

Xnip2020-07-31_18-09-50

Xnip2020-07-31_18-11-05

然后我们在服务器中,需要重启nginx 。

Xnip2020-07-31_18-14-08

如果网站中还没有看到我们改动代码后的效果的话

进入项目目录 cd /data/mytest

Xnip2020-07-31_18-21-48

重启uwsgi之后,

uwsgi -- reload uwsgi.pid

Xnip2020-07-31_18-22-26

再次重启下nginx 。

nginx -s

最近访问网站就可以看到改动的效果了。

6、额外篇 -- 从服务器下载项目到本地

以上的操作,我是将django项目 上传到了到服务器中,然后你的话就不需要再次上传到服务器,避免冲突,你要做的就是,从服务器中下载项目到我们的本地中,然后后期你要改代码的话那就直接上传就行(看四、后期维护)

步骤一:pycharm 创建一个项目,用于存放我们从服务器下载下来的文件

Xnip2020-07-31_19-43-34

第二、pycharm连接服务器

起个名字

image-20200729173929231

配置信息

image-20200729174439593

image-20200729174717052

将项目下载到我们的本地

Xnip2020-07-31_19-53-47

下载成功

Xnip2020-07-31_19-57-14

7 uWsgi和Nginx服务器之间如何配合工作

首先浏览器会发起一个http请求发送到nginx服务器,nginx根据接收到请求的包,进行url分析,判断访问的一个资源类型,如果判断的是一个静态类型,nginx会直接读取静态资源返回给浏览器进行展示,如果判断请求的是一个动态资源类型的话,就会转交给uwsgi服务器,uwsgi服务器会根据自身的wsgi和uwsgi协议,找到对应的django框架,Django框架下进行逻辑处理之后,再转交给uwsgi服务器,uwsgi服务器在转交给nginx服务器,最后nginx服务器将返回值给浏览器渲染展示给用户

posted @ 2020-08-06 17:15  阿Hua  阅读(2835)  评论(4编辑  收藏  举报