亲测!!通过pycharm将Django项目部署到云服务器 uwsgi+nginx+mysql
前言: 前段时间为了帮大学生将项目部署起来,我又实践了一遍,踩了各种坑,最后成功实现,文档写的很详细,
读者可以进行一步操作,这次我使用的pycharm解释器上传到云端,真的是超级方便,还可以修改代码后上传到服务器,然后到服务器重启下nginx就行。
这里使用到技术 nginx+uwsgi+mysql 本篇没有使用mysql主从和docker。 大家可以访问 ip 47.103.98.8
1 远程登录阿里云服务器(终端)
1 这里我用的是macOS,可能命令会有所不同,不同系统的同学百度怎么远程登录。
2 在上一层目录中 创建 /data 文件,存放我们的项目目录,在实际工作中我们的项目也是放在data目录下
-
在当前的目录返回上一层目录
cd ..
查看当前目录ls
创建文件夹mkdir data
进入某一个文件夹cd
2 使用pycharm 将项目上传到 远程服务器 /data 目录中
注意只有Pycharm专业版才具有部署的功能,社区版(无需破解)是没有此功能
添加配置,起个名字
以上都配置好了,然后我们将我们本地的项目上传到远程服务器中
成功上传
远程登录服务器下
3 远程服务器安装所需项目的环境
1 安装python3.6
一般的linux系统都会默认安装python2.7,而现在python3已经大行其道,我们的项目也是使用python3的,所以我们来给云主机安装python3.6。
进入到终端服务器中,我们先检查一下云主机目前的python版本,使用命令:python --version
,查看:
提醒千万不要将python2删除,因为有些系统功能依赖python2,所以我们只要添加python3.6就可以
安装步骤
1 apt-get install software-properties-common
1.1 sudo add-apt-repository ppa:jonathonf/python-3.6
2 更新系统软件包并安装python3.6.4
1、sudo apt-get update
2、sudo apt-get install python3.6
3 验证是python3.6 安装成功
python3.6 -V
安装成功后需要更改默认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#
2 安装mysql
前言:后面我们的项目是用的mysql,所有此时我们需要在服务器中安装mysql,然后到我们的项目中的数据导入进去,才能让项目完整运行。 这里我们的数据库密码是 python
sudo apt-get install mysql-server
等待提示设置密码,此密码是以后登录数据库的密码 python
重复上一步设置的密码 python
安装成功
2 安装数据库客户端
sudo apt-get install mysql-client
3 sudo apt-get install libmysqlclient-dev
以上就安装上了mysql 数据库,让我们进入测试数据库是否成功
mysql -u root -p
提示输入之前第一条命令设置的密码,出现如下界面则安装成功
查看数据库 show databases;
退出数据库 exit()/quit
3 安装Nginx
什么是nginx?
1 nginx 是一个高性能HTTP服务器和反向代理服务器,最终的目的是实现网站的负载均衡;
2 nginx 作为web服务器,对处理索引文件和静态文件效率非常高,例如我们项目中的静态文件(HTML、CSS、JS)就交给nginx进行处理。
3 强大的反向代理和负载均衡功能,平衡集群中各个服务器的负载压力。
1 安装nginx
sudo apt-get install nginx
2 运行(启动)nginx
nginx
3 服务器查看运行状态 或浏览器打开
curl 47.103.98.8:80
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
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,才能让项目跑起,所以我们需要在阿里云服务器下先开放 对应的端口(安全组端口)才能成功让项目跑起。
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操作,请查找命令保存退出)
3 连接数据库进入数据库
mysql -u root -p python
数据库里执行操作
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'python' WITH GRANT OPTION;
--> root 用户名 ‘%’ 表示任何ip都可以访问 BY ‘密码’
flush privileges;
exit
退出
---------> 下面这句不是在数据库里执行
service mysql restart
重启mysql服务器
4 本地navicat 连接远程数据库,并上传sql到远程数据库
5 添加一个数据表到远程数据库中
远程数据库查看是否成功
6 将项目所需的数据库添加到远程数据中
看看远程服务器是否有此数据库
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
7 单独启动uwsgi 运行项目(不加nginx情况下)
# 启动项目 uwsgi --ini uwsgi.ini
# uwsgi --stop/reload xxx.pid 停止/重启uwsgi
# ps -ef|grep uwsgi 查看确认是否uwsgi启动
启动
看到这里,是能够成功显示了,但是没有达到我们的预期呀,你看,js、css都没有显示出来呀,别担心,这个时候我们可以添加nginx 来进行处理静态文件了,这样你就知道nginx的强大了吧(其实也可以不加,只需在uwsgi.ini,处理静态文件就行)
8 uwsgi 还有一步,因为我们现在是单独运行uwsgi,后面我们需要加nginx,所有把http停掉,stock开启(在uwsgi.ini文件中) 然后在上传服务器
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 表示成功开启
浏览器显示的是:
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配置文件部分截图内容:
注意重要的一点,这里部分截图的最后有两行文件
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/*;
下添加如下信息,路径你需要自己改成自己项目存放的路径。
步骤:
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;
}
}
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 后期我们改动代码
栗子:
然后我们在服务器中,需要重启nginx 。
如果网站中还没有看到我们改动代码后的效果的话
进入项目目录 cd /data/mytest
重启uwsgi之后,
uwsgi -- reload uwsgi.pid
再次重启下nginx 。
nginx -s
最近访问网站就可以看到改动的效果了。
6、额外篇 -- 从服务器下载项目到本地
以上的操作,我是将django项目 上传到了到服务器中,然后你的话就不需要再次上传到服务器,避免冲突,你要做的就是,从服务器中下载项目到我们的本地中,然后后期你要改代码的话那就直接上传就行(看四、后期维护)
步骤一:pycharm 创建一个项目,用于存放我们从服务器下载下来的文件
第二、pycharm连接服务器
起个名字
配置信息
将项目下载到我们的本地
下载成功
7 uWsgi和Nginx服务器之间如何配合工作
首先浏览器会发起一个http请求发送到nginx服务器,nginx根据接收到请求的包,进行url分析,判断访问的一个资源类型,如果判断的是一个静态类型,nginx会直接读取静态资源返回给浏览器进行展示,如果判断请求的是一个动态资源类型的话,就会转交给uwsgi服务器,uwsgi服务器会根据自身的wsgi和uwsgi协议,找到对应的django框架,Django框架下进行逻辑处理之后,再转交给uwsgi服务器,uwsgi服务器在转交给nginx服务器,最后nginx服务器将返回值给浏览器渲染展示给用户