云服务器部署Python项目(nginx+uwsgi+mysql+项目)

python项目部署到云服务器

关注公众号“轻松学编程”了解更多。

云服务器部署Python项目(nginx+uwsgi+mysql+项目)

一、硬件准备

云服务器,系统ubuntu_16_04 。

注意:要在安全组中开放Http的80端口。

二、软件准备

1、两个工具

XShell:控制远程Linux主机,SSH工具 ;

Xftp :上传代码到远程主机;

下载地址一:

https://www.netsarang.com/download/down_form.html?code=622&downloadType=0&licenseType=1

下载地址二:

https://github.com/liangdongchang/tools

注:以下shell命令都在xshell软件中编写

云服务器部署Python项目(nginx+uwsgi+mysql+项目)

打开xshell软件,新建会话,连接服务器ip就可以远程操控云服务器。

2、软件源

a.软件源更新

apt clean
apt update

b.(可跳过)如果有些模块找不到,可切换软件源

# 在修改source.list前,最好先备份一份
sudo cp /etc/apt/sources.list /etc/apt/sources.list.old
#打开
sudo vim /etc/apt/source.list
#然后可以去找清华或豆瓣的源,覆盖原文件
3、Python-Web开发环境

a.建虚拟环境

#创建文件夹
mkdir apps
cd apps
mkdir mysite
cd mysite
#.mysitevenv表示文件夹是隐藏的,可通过命令ls -a来查看
mkdir .mysitevenv
cd .mysitevenv
#导入venv
apt install python3-venv
#安装venv,命名为mysitevenv
sudo python3 -m venv mysitevenv

b.安装pip3

#安装
sudo apt install python3-pip
#对pip3进行升级,也可以不升
sudo pip3 install --upgrade pip
#如果遇到这个错误,可以按照以下方法解决
pip 10.0.0 BUG
Traceback (most recent call last): File "/usr/bin/pip3", line 9,
in <module>
from pip import main
ImportError: cannot import name main
解决方案:
修改: /usr/bin/pip3
打开:vim /usr/bin/pip3

from pip import main
if __name__ == '__main__':
sys.exit(main())
改为:
from pip import __main__
if __name__ == '__main__':
sys.exit(__main__._main())

c.导出项目中关联的模块

在终端输入以下命令,生成模块关联文件

pip3 freeze > requirements.txt

云服务器部署Python项目(nginx+uwsgi+mysql+项目)

生成requirements.txt。

d.通过xftp把requirements.txt文件上传到服务器中。

云服务器部署Python项目(nginx+uwsgi+mysql+项目)

e.在虚拟环境中导入项目需要的模块

#进入虚拟环境
cd mysitevenv
#启动虚拟环境
source ./mysitevenv/bin/activate
#找到requirements.txt的路径
find / -name requirements.txt
#导入模块
pip3 install -r /root/apps/mysite/requirements.txt
#查看是否导入成功
pip3 freeze

云服务器部署Python项目(nginx+uwsgi+mysql+项目)

注意:如果项目中有xadmin(站点管理模块),不能直接通过pip3 install xadmin来安装,如果安装了先pip3 uninstall xadmin卸载,到https://github.com/sshwsfc/xadmin下载安装包,然后把安装包拖到云服务器中的当前目录下,直接通过

pip3 install xadmin-master.zip

安装。

原因:pip3 install xadmin安装的是python2.0版本的xadmin,在python3.6版本中不适用。

4、服务器

a.安装Nginx

apt install nginx

如果安装成功

使用http://tool.chinaz.com/port/

站长工具测试80端口,应该是开启的状态,否则要到服务器安全组里添加配置。

b.安装uwsgi

启动虚拟环境,然后再安装

pip3 install uwsgi

云服务器部署Python项目(nginx+uwsgi+mysql+项目)

pip install uwsgi出错

plugins/python/uwsgi_python.h:2:20: fatal error: Python.h: No such file or directory

首先安装python3环境

apt install python3-dev

然后在虚拟环境中

pip install uwsgi
5、数据库

a.安装MySQL

apt install mysql-server
apt install mysql-client
apt install libmysqlclient-dev

ubuntu系统下MySQL开启远程连接

可参考:https://blog.csdn.net/xsj_blog/article/details/52753088

b.安装redis缓存数据库

apt install redis-server
#server和client都会安装上

三、项目导入

1、通过xFtp把项目导入云服务器中

云服务器部署Python项目(nginx+uwsgi+mysql+项目)

2、数据迁移

a.先在MySQL数据库中新建一个对应项目的数据库。

b.在应用中的migrations中删除以前的表模块

云服务器部署Python项目(nginx+uwsgi+mysql+项目)

c.在项目根目录中运行

python3 manage.py makemigrations

生成数据表sql模块

云服务器部署Python项目(nginx+uwsgi+mysql+项目)

执行数据迁移

python3 manage.py migrate

注意:如果出现错误,有可能是MySQL数据库中的的数据库与settings.py中设置的数据库名称不一致导致。

四、uwsgi服务器

1、Django配置

在Django项目中添加uwsgi.ini文件

文件内容为:

[uwsgi]
# 使用nginx连接时 使用
;socket=0.0.0.0:8000
# 直接作为web服务器使用
http=127.0.0.1:8000
# 配置工程目录
chdir=/root/apps/mysite
# 配置项目的wsgi目录。相对于工程目录
wsgi-file=MySites/wsgi.py virtualenv = /root/apps/mysite/.mysitevenv/mysitevenv #配置进程,线程信息,最好与云服务器的一致
processes=1
threads=1 ;启用多线程
enable-threads=True
;允许主进程开子进程
master=True ;进程日志
pidfile=uwsgi.pid
;业务日志
daemonize=uwsgi.log

注意:如果uwsgi.ini用不了有可能是编码问题,python3支持utf-8,如果用记事本编辑,可能编码是其它编码格式,这可能会用不了uwsgi.ini文件。

2、Flask配置

在flask项目中添加uwsgi.ini文件

[uwsgi]
socket = 127.0.0.1:5000
wsgi-file = manage.py
callable = app
3、运行和停止

运行命令:

在项目目录下

uwsgi --ini uwsgi.ini

云服务器部署Python项目(nginx+uwsgi+mysql+项目)

停止运行:

方式1:

uwsgi --stop uwsgi.ini
  • 实测中进程并未停止

方式2:

#寻找uwsgi主进程pid
ps -ef | grep uwsgi
#杀死进程
kill -9 1932

注意:修改了代码或配置,都要杀死和重启uwsgi服务器

五、Nginx服务器

1、关于
1.1简介

​ Nginx是由伊戈尔.塞索耶夫开发的,于2004年10月4日公开源码,以类BSD许可证形式发布
Nginx是一款轻量级、高性能的HTTP/反向代理服务器
也是一个IMAP/POP3/SMTP服务器
其特点是占用内存少,并发能力强,在同类型的网页服务器中表现优秀
Nginx因它的稳定性,丰富的功能,示例配置文件和低系统资源的消耗而闻名
*使用Nginx的网站
淘宝,京东,腾讯,百度,新浪,网易…

1.2 为什么使用 Nginx

​ 作为We服务器:相比Apache,Nginx使用资源更少,支持更多的并发连接,体现更高的效率,使Nginx倍受欢迎,能够支持高达50000个并发连接数的响应
作为负载均衡服务器:Nginx既可以在内部直接支持Redis和PHP,也可以支持作为HTTP代理服务器对外进行服务,Nginx使用C编写,不论是系统资源开销还是CPU使用效率都处理的非常优秀
Nginx安装非常简单,配置文件非常简洁,Bug非常少:Nginx启动非常容易,并且几乎可以做到7 * 24小时不间断运行,即使运行数个月也不需要重新启动

1.3安装
 apt install nginx
1.4参考

​ 官网
http://nginx.org/
中文资料
http://tengine.taobao.org/book/
静态资源服务
开发者服务器默认集成了静态资源服务
关闭后静态资源服务失效(只能处理动态代码)
静态代码交给Nginx实现动静分离

2、配置
2.1 寻找配置文件所在的位置
find / -name nginx.conf
2.2 默认使用的配置文件

/etc/nginx/nginx.conf

2.3 自定义路径无法定位uwsgi_params

​ 如果要给uwsgi做反向代理,就不能使用自定义位置的配置文件

2.4 /etc/init/nginx.conf

​ 后台启动的相关配置(使用较少)

2.5 测试配置是否有效

​ nginx -t -c 配置文件的位置

云服务器部署Python项目(nginx+uwsgi+mysql+项目)

2.6 配置样本

找到要修改的default文件

vi /etc/nginx/sites-enabled/default

在里面修改server配置

      server {
# 监听在80端口
listen 80;
# 主机地址
server_name xxx.xxx.xxx.xxx;
# 如果有域名,可以使用域名代替主机地址
# server_name www.xxx.com xxx.com; # 接下来的都是路由派发
# 访问路由就是主机地址时(反向代理)
location / {
#root /apps/mysite;
#index apps/templates/main/index.html;
# 反向代理监听在127.0.0.1:8000位置的uwsgi服务器
# 前提是uwsgi已经运行并监听在8000端口
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
}
# 访问路由就是指定的app时(反向代理)
location /mysite {
include uwsgi_params;
uwsgi_pass 127.0.0.1:5001;
}
# 访问静态资源(正向代理)
location /static {
#root html/blog;
# 静态资源目录
alias /apps/mysite/static;
}
# 访问指定文件夹下的任意资源(正向代理)
location /fresh{
alias /apps/mysite/fresh;
# 默认访问某个页面
index index.html;
}
#使用富文本下的静态资源
location /tiny_mce {
alias /root/apps/mysite/.mysitevenv/mysitevenv/lib/python3.5/site-packages/tinymce/static/tiny_mce;
}
}

注意
Django静态资源收集:
由于第三方的静态资源路径不统一,所以使用Nginx访问静态资源时需要特殊配置:

a.首先在settings.py中设置一个存放所有静态资源的目录;

STATIC_ROOT = '/root/apps/static/'

b.在linux中的目录/root/apps/下新建一个static目录

mkdiv /static

c.在项目根目录下运行

python manage.py collectstatic

云服务器部署Python项目(nginx+uwsgi+mysql+项目)

d.在/etc/nginx/sites-enabled/default文件中的server里设置

# 访问静态资源(正向代理)
location /static {
# 静态资源目录
alias /root/apps/static/;
}
3、Nginx指令
 #  启动
nginx

注意:如果要为uwsgi做反向代理,要提前启动uwsgi

#使用指定的配置文件启动
nginx -c 配置文件位置

注意:只有正向代理才能自定义配置文件位置,如果配置文件不在/etc/nginx/下,就无法定位uwsgi_params。如果要为uwsgi做反向代理,则配置文件位置最好使用默认位置/etc/nginx/nginx.conf

#测试配置文件是否有效
nginx -t -c 配置文件的位置
#暴力停止
nginx -s stop
#正常退出
nginx -s quit
#重启(配置文件已经被修改)
nginx -s reload
4、使用systemctl去操作Nginx
 #  启动
systemctl start nginx
# 停止
systemctl stop nginx
#重启
systemctl restart nginx
#查看状态
systemctl status nginx

六、常用shell命令

#查看端口使用情况
netstat -atpl | grep 6379
#编辑器打开
vim uwsgi.int
#启动uwsgi服务器
uwsgi --ini uwsgi.ini
#查看进程
ps -ef | grep uwsgi
#杀进程
kill -9 1932
#导出设置
pip3 freeze > requirements.txt
#解包
tar -zxvf nginx-1.14.0.tar.gz
#全局查找
find / nginx
sudo find / -name nginx.conf
#查看状态
systemctl status nginx
#停止
systemctl stop nginx
#启动
systemctl start nginx
#重启
systemctl restart nginx
#回到上级目录
cd -
#更新源
apt update
#删除
rm -rf migrations
#修改字段
alter table axf_goods modify onSale bool default 1 vim中
i 进入编辑
esc退出
:wq 保存
:q!退出
:set nu 打开行号
G 到末尾 #使用配置文件启动
nginx -c /root/code.nginx.conf
#测试配置环境是否能用
nginx -t -c /root/code.nginx.conf
#启动虚拟环境
source path activate
#退出虚拟环境
deactivate linux python3.5更新到3.6 https://blog.csdn.net/shenqiongniujiahui/article/details/50494172 https://www.linuxidc.com/Linux/2017-07/145453.htm
ubuntu 16版默认使用的是python3.5 #连接远程地址
ssh -l root ip地址 #更新
apt update
apt upgrade #更改源 使用国内的源快些 #虚拟环境管理工具
pip3 install virtualenvwr apper #查看隐藏文件夹
ls -a #修改环境变量
vi ~/.bashrc
#刷新变量
source ~/.bashrc #查找文件
whereis 文件
#查看
more 文件
#改文件名
mv 文件名 文件名2
#查看当前目录路径
pwd

####七、效果图
云服务器部署Python项目(nginx+uwsgi+mysql+项目)

注意:
uwsgi中配置listen=1024时,启动uwsgi时可能会报错:

django + uwsgi + nginx 日志Listen queue size is greater than the system max net.core.somaxconn (128).

解决方法:

修改系统参数

/proc/sys/net/ipv4/tcp_max_syn_backlog  原来2048    改为8192
/proc/sys/net/core/somaxconn 原来128 改为262144

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。

也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!

公众号

云服务器部署Python项目(nginx+uwsgi+mysql+项目)

云服务器部署Python项目(nginx+uwsgi+mysql+项目)

关注我,我们一起成长~~

上一篇:Tfs服务器迁移(更改IP)后客户端(vs2013)配置方法


下一篇:Python的一些高级特性以及反序列化漏洞