python uwsgi+nginx部署
typora-root-url: ./
项目环境部署
一、MySQL5.7安装
1、安装方式
1.1 方式一 yum安装(推荐使用该方式)
在CentOS中默认安装有MariaDB,这个是MySQL的分支
如果必须要安装MySQL,首先必须添加mysql社区repo通过输入命令:
rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
然后再yum install -y mysql-server
# yum安装,需要外网环境
1.2 方式二 rpm安装(不建议)
rpm -ivh perl-*.rpm
#安装所有perl依赖rpm -Uvh mysql-libs-5.1.73-7.el6.i686.rpm
#更新mysql的类库rpm -ivh mysql-5.1.73-7.el6.i686.rpm mysql-server-5.1.73-7.el6.i686.rpm
#安装mysql主服务
2、启动MySQL服务
systemctl start/stop/restart/status mysqld
查看MySQL运行状态:
systemctl status mysqld.service
3、使用MySQL
注意:以下方式针对mysql5.7
初次使用,需要找到root的密码:
grep "password" /var/log/mysqld.log
找到密码后,连接数据库 mysql -uroot -p密码
输入初始密码,此时不能做任何事情,因为MySQL默认必须修改密码之后才能操作数据库:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';
遇到错误:
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
解决方案:
1、首先需要设置密码的验证强度等级,设置 validate_password_policy 的全局参数为 LOW 即可,
输入设值语句 “ set global validate_password_policy=LOW; ” 进行设值
2、当前密码长度为 8 ,如果不介意的话就不用修改了,按照通用的来讲,设置为 6 位的密码,设置 validate_password_length 的全局参数为 6 即可,
输入设值语句 “ set global validate_password_length=6; ” 进行设值
3、再重置密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';
4、查看 mysql 初始的密码策略,
输入语句 “ SHOW VARIABLES LIKE 'validate_password%'; ” 进行查看
- 选择数据库
use mysql
- 选择表
- 查询表
4、MySQL远程连接
- 到mysql库的user表中
update user set host='%' where user='root';
#添加可以远程访问的账号 MySQL5.7版本flush privileges;
#刷新权限,保证新添加的账号可用- 关闭linux的防火墙,保证3306可以访问
5、MySQL卸载
rpm -e mysql-server需要完整的包名 通过rpm -qa | grep mysql查找包名
#只需卸载主服务即可rm -rf /var/lib/mysql
#删除所有mysql的数据
6、MySQL root密码找回(重置)
找到/etc/my.cnf
[mysqld]
...
skip-grant-tables //注意,建议在拆除网线的情况下添加 (而且添加配置后,需要重启mysqld服务)
[root@Server ~] mysql -uroot
mysql> use mysql;
mysql> update user set password=password('123') where host='localhost'; //修改密码
mysql> flush privileges;
然后将如上配置删除或注释
# 将开发好的项目部署到Linux系统 Linux 而不是windows (开发)
# Day01 - Linux基本指令 -- 字符界面 无法使用鼠标
# Day02 - 安装环境MySQL Python 上传项目 部署运行项目
二、Python安装
1、安装依赖
- yum -y install python-devel openssl-devel bzip2-devel zlib-devel expat-devel ncurses-devel sqlite-devel gdbm-devel xz-devel tk-devel readline-devel gcc
- yum -y groupinstall “Development tools”
如上两步,汇总安装了python生产环境的各种第三方依赖包
2、安装Python
将python的tar包发送给linux (建议位置:/usr/local/)
解压tar包:
tar -zxvf Python-3.5.2.tgz
cd到解压目录中配置:
./configure --prefix=/usr/local/python3 --enable-optimizations
目的:检测环境中依赖是否完整,设置python的安装位置,
同时生成一个编译文件,用于进行python编译:make在解压目录中:先
make
编译 然后make install
安装
安装后的日志如下
....
Collecting setuptools
Collecting pip
Installing collected packages: setuptools, pip
Successfully installed pip-8.1.1 setuptools-20.10.1
将python3 设置为系统默认python解释器
将/usr/bin下的
python
文件改名mv /usr/bin/python /usr/bin/python2.7.5
将python3的执行文件链接到 /usr/bin/python
ln -s /usr/local/python3/bin/python3 /usr/bin/python
# 执行以上两步操作并不是把python3安装目录添加到环境变量中
# 而是将python3安装目录下python3解释器软链接到某一个环境变量的目录下
- 设置环境变量:/etc/profile中添加配置
在文件末尾追加,不要改动文件的其他内容!!!!!!!
export python_home=/usr/local/python3
export PATH=$PATH:$python_home/bin
注意,设置好后,为了让环境变量生效:source /etc/profile
,然后 python3
即可进入python3的环境
- 更新pip
pip3 install --upgrade pip
补充:
安装
yum install mysql-devel
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DrVCQlZd-1615266405651)(/Linux_pic/1581412165432.png)]
由于
yum
用python2编译执行,所以需要单独为yum
设置为python2,找到/usr/bin/yum
文件,修改文件头:#!/usr/bin/python2.7.5
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IFCzmEXe-1615266405661)(/Linux_pic/1581412262020.png)]
修改 /usr/libexec/urlgrabber-ext-down 文件的第一行改为 ‘
#!/usr/bin/python2.7.5
’
# 总结Python安装步骤:1. 安装依赖 两长串复制过去直接执行 -- 注意需要外网2. 将python3.6+的tar包发送到linux系统中 建议放在/usr/local下3. 解压tar包4. 进入解压目录,执行 ./configure --prefix=/usr/local/python3 --enable-optimizations5. 执行 make 指令 -- 注意时间较长6. make install 即可完成安装 -- 安装完后在/usr/local/python3下就是python的安装文件# 发软链接1. 将默认的Python2版改名 mv /usr/bin/python /usr/bin/python2.7.5 2. 再将python3下的解释发快捷方式到/usr/bin下ln -s /usr/local/python3/bin/python3 /usr/bin/python# 配置环境变量1. vi /etc/profile文件下 在最后面添加下面的内容:export PATH=$PATH:/usr/local/python3/bin/2. 让环境变量生效 执行 source /etc/profile即可# 更新pip 1. 执行 pip3 install --upgrade pip# 修改yum文件头 yum默认是基于python2 1. vi /usr/bin/yum 的第一行的最后面改为python2.7.52. vi /usr/libexec/urlgrabber-ext-down 同上即可
三、Django安装
安装数据库驱动:
pip install mysqlclient
pip install django=="2.0.6"
测试使用:
django-admin startproject testproj
在当前目录下创建一个project:“testproj”cd到testproj目录下的testporj目录下settings.py 修改配置:
ALLOWED_HOSTS = ["*"]
启动django内置的web服务器。cd到testproj目录下,执行:
python manage.py runserver 0.0.0.0:port
在Windows的浏览器中访问:
ip:port
– ip为Linux系统的ip地址
四、uWSGI服务器
1、WSGI协议
使用Django或Flask框架编写的Web应用程序,在
python manage.py runserver
时都启动的是框架内置的服务器来运行Web应用程序,而内置的服务器遵循了WSGI协议(WSGI Server)。WSGI:全称是
Web Server Gateway Interface
,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web server如何与web application通信的规范。WSGI server
负责从客户端接收请求,将request
转发给application
,将application
返回的response
返回给客户端;WSGI application
接收由server
转发的request
,处理请求,并将处理结果返回给server
。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AU40NIVA-1615266405664)(Linux_pic\wsgi.png)]
要实现WSGI协议,必须同时实现web server和web application,当前运行在
WSGI
协议之上的web
框架有Bottle
,Flask
,Django
。
**总结:**WSGI是Web 服务器(uWSGI)与 Web 应用程序或应用框架(Django)之间的一种低级别的接口。
2、uWSGI服务器安装
WSGI协议下web服务器很多:django内置,uWSGI,gunicorn。
2.1 服务器安装
将uWSGI的tar包发送linux
解压tar:
tar -zxvf uwsgi-2.0.17.tar.gz
cd到解压目录下,编译:
make
为了可以更方便的执行 uwsgi 启动uWSGI服务器,定制链接:
ln -s /usr/local/uwsgi-2.0.17/uwsgi /usr/bin/uwsgi
则可以在任意目录下执行
uwsgi
去启动uWSGI服务器测试使用python的wsgi服务器-uWSGI
在任意的一个目录中定义一个python脚本:hello.py
def application(env, start_response):start_response('200 OK', [('Content-Type','text/html;charset=utf-8')])return [bytes('你好啊!!','utf-8'),b'Mr_lee'] # 基于wsgi协议规范实现的代码
启动uWSGI服务器,并部署hello.py程序
uwsgi --http 192.168.248.128:8001 --wsgi-file hello.py
#注意hilo.py可以写成绝对路径浏览器访问:
192.168.248.128:8001
3、 uWSGI部署django项目
在数据库中建好项目需要的database:“ems”
- 使用Navicat创建即可,注意字符集为 utf8
在Django项目的settings.py中修改配置
DEBUG = False #去掉开发模式 ALLOWED_HOSTS = ["*"] #开放访问host DATABASES = { #合适数据库参数'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'ems','USER': 'root','HOST': 'localhost','PORT': '3306','PASSWORD': '123456'} }
发送项目到linux并做移植
python manage.py makemigrations
python manage.py migrate
编写uWSGI的配置文件
#随意找一个目录,创建一个文件:config.ini -- 建议放在项目的根目录下 [uwsgi] http = 192.168.134.128:9000 # uWSGI服务器访问地址 #uWSGI和nginx通信的port socket = 192.168.134.128:9001 # the base directory (full path) chdir = /usr/local/django_projects/ems #项目所在目录 # Django's wsgi file wsgi-file = ems/wsgi.py #基于项目目录的相对路径 # maximum number of worker processes processes = 4 #thread numbers startched in each worker process threads = 2 #monitor uwsgi status 通过该端口可以监控 uwsgi 的负载情况 stats = 192.168.134.128:9002 # clear environment on exit vacuum = true pidfile = /usr/local/django_projects/ems/uwsgi.pid #进程ID存放于此文件,位置可以自定义 #daemonize-run ,file-to-record-log daemonize = /usr/local/django_projects/ems/uwsgi.log #后台启动模式,日志文件记录位置自定义 #http://ip:port/static/...请求会进入该目录找资源,此处可以指向某个app下的static目录 #或是将所有静态文件汇总到项目的某一个目录下,然后配置在此是更好的选择 #汇集所有已安装app的静态资源到一个目录下,请参见后续内容 #http://ip:port/static/a/b/c/d.png ==> /usr/local/xxxx/static/a/b/c/d.png static-map =/static=/usr/local/xxx/static # 只在你写的static-map中找静态资源
根据如上配置启动uWSGI服务器
uwsgi --ini config.ini
#注意:config.ini是一个相对路径关闭服务器
uwsgi --stop uwsgi.pid
#通过进程id文件使用uwsgi服务器运行项目后,出现静态资源无法加载的问题
# 分析原因: 1.在django内置的服务器中,调试模式,django查找静态资源默认在每个app的static目录2. 或者可以在setting.py文件中 STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')] 将项目根目录下的static目录作为静态资源的查找路径# 但是uwsgi服务器有自己的静态资源的处理方式,也就是它不会在上述的两个地方查找静态资源
- uwsgi如何处理静态资源
# 在config.ini配置文件的最后面来告诉uwsgi服务器要在哪里去找静态资源
[uwsig]
http = xxx:9000
socket = xxx:9001
...
...
...
# 写你的静态资源的绝对路径,如果在项目根目录下,直接写项目根目录/static即可
# 如果是每个app自己管理,把所有的app的static目录添加进来,有几个app加几个static-map
static-map=/static=/usr/local/xxx/static url可以分为两大类:
1. 普通url-动态资源url 会在urls.py文件中匹配访问路径 最终找到视图函数
2. 静态资源url-- /static/ 告诉django当url中有/static/时django会在静态资源的目录下去查找资源
- 如果你的app过多,每个app自己管理静态资源,此时需要添加的static-map太多
# 只需要做两步操作就可以把所有app下的静态资源static目录的文件收集到某一个目录下1. 在项目的setting.py文件中添加 STATIC_ROOT=os.path.join(BASE_DIR,'static')用于告诉django,将来收集到的静态资源往哪里放2. 执行收集的指令 python manage.py collectstatic
STATIC_URL = ‘/static/’ # 每个静态资源URL的访问前缀
STATICFIELS_DIRS = [os.path.join(BASE_DIR,‘static’)] # 添加django内置服务器查找静态资源的路径
STATIC_ROOT = os.path.join(BASE_DIR,‘static’) # 收集静态资源时的路径
static-map=/static=xxxx # 告诉uwsgi服务器到哪里去找静态资源
Nginx服务器
一、Nginx概述
1、简介
1.1 什么nginx
Nginx是一款轻量级的Web服务器/反向代理服务器 ,其特点是占有内存少,并发能力强。
2.2 nginx的作用
静态HTTP服务器( 处理静态资源 - 动静分离):
首先,Nginx是一个HTTP服务器,可以将服务器上的静态文件(图片、CSS、JS文件等)通过HTTP协议展现给客户端。 将静态资源的处理交给Nginx服务器
# 一个项目中的资源可以为两大类:1. 动态资源的请求 普通URL -- uwsgi2. 静态资源的请求 /static/ -- nginx
Nginx提供的动静分离是指把动态请求和静态请求分离开,合适的服务器处理合适的请求,使整个服务器系统的性能、效率更高。
uWSGI更适合做动态内容的执行,nginx更适合做静态内容的处理,客户端请求直接访问nginx服务器,留下静态部分处理,动态部分转发给uWSGI服务器,最终实现“动静分离”。
反向代理服务器:
反向代理是指以代理服务器nginx来接受internet上的请求,然后将请求转发给内部网络上的其它服务器uWSGI,并将从uWSGI服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
负载均衡 :
多在高并发情况下需要使用。其原理就是将数据流量分摊到多个服务器执行,减轻每台服务器的压力,多台服务器(集群)共同完成工作任务,从而提高了数据的吞吐量。
2、安装步骤
将tar包发送的linux
解压
tar -zxvf nginx-1.11.1.tar.gz
安装依赖
yum install gcc zlib-devel pcre-devel
cd到解压目录:
./configure
#配置检测cd到解压目录:
make && make install
#编译并安装安装完成,安装路径为
/usr/local/nginx
,日志路径为/usr/local/nginx/logs
,可执行文件路径为
/usr/local/nginx/sbin
,配置文件路径为/usr/local/nginx/conf
欢迎页面路径为
/usr/local/nginx/html
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
制作连接,便于执行nginx
指令nginx #启动
nginx -s stop #关闭
nginx -s reload #重启
http://ip:80即可访问nginx欢迎页面
二、nginx与uWSGI
nginx配置–到配置路径中的nginx.conf
/usr/local/nginx/conf/nginx.conf
upstream ems{server 192.168.157.141:9001; # uWSGI's socket = #server 192.168.157.142:9001; #192.168.x.x:9001#可以在添加其他的uWSGI的服务器
}server {listen 80;server_name 192.168.157.142; # nginx服务器的ipcharset utf-8;location / {uwsgi_pass ems; #和上面的upstream转接 include /usr/local/nginx/conf/uwsgi_params; # the uwsgi_params file you installed} location /static { #http://ip:80/static/a/b/c/d.png ==> /usr/local/static/a/b/c/d.png alias /usr/local/static; # your Django project's static files - amend as required}...
}
配置好后,重启nginx即可,可以使用Nginx服务器来访问项目
注意关闭防火墙!!
两台虚拟主机,一个运行nginx,其中保存project的静态资源;一个运行uwsgi,其中保存并部署project。
三、集群和负载均衡策略
搭建uWSGI集群,只需要多做几份uWSGI的配置文件,文件中设置不同的ip:port,指向相同的project,然后启动多个uWSGI即可。
*默认:轮询upstream django {server 192.168.0.103:8989; server 192.168.0.104:8989;}
*iphash:基于ip的负载均衡. upstream django {ip_hash;server 192.168.0.103:8989;server 192.168.0.104:8990;}
*权重轮询:upstream django {server 192.168.0.103:8989 weight=1; server 192.168.0.104:8990 weight=2; }
*最小连接数:upstream django {least_conn; server 192.168.0.103:8989;server 192.168.0.104:8990;}
至此,一个uWSGI集群搭建完成,nginx作为反向代理服务器和web服务器接收请求,然后处理静态的部分,动态部分按照负载均衡策略转发给某一个uWSGI服务器。
# 集群解决了什么问题:1. 高并发2. 高完整性(高可用性)
至此python-web-project成功运行于 一个对高并发有更好支持,具有高可用性(high-available)的系统中
企业级项目部署:1. 买一台电脑,装上centos7系统,部署项目(上传项目,装Nginx/uwsgi),但该电脑的ip是局部网ip, 老板也可以访问,但不能给用户用直接把主网络插到这台电脑上,它就有一个外网ip,外网ip给用户可以吗?不可以 -- 动态ip真想这么做,需要向三大运营商申请固定ip -- (监控) 2. 租云服务器 BAT华为等 大机房 电脑 花钱买服务 4G 8核 8M 它会给你提供一个ip地址 用户名和密码 此时你就可以运程操作它了secureCRT FileZillaip地址 ip+url访问 购买域名 www.baidu.com 绑定ip工信部备案 -- 公安备案
python uwsgi+nginx部署相关推荐
- django+uwsgi+nginx部署
最近线上部署运维工单系统,使用django+uwsgi+nginx部署,发现这篇文章,很详细,觉得不错,转载一下: 写了那么长时间的django,一直没跟nginx结合一下,访问的时候老是得加端口号, ...
- Django扩展 —— uwsgi+nginx部署
-- uwsgi+nginx部署(django) -- 服务器环境配置 -- 导出虚拟环境的所有包 pip freeze > list.txt -- 通过ftp软件将项目以及list.txt文件 ...
- 【django云服务器部署】django+uwsgi+nginx 部署的完整流程
本篇博客完整地记录了我从购买服务器到完成部署的全过程,需要的朋友可以参考一下我的流程,看这一篇文章就能成功部署项目啦. 写这个的本意是为备忘( 保姆级步骤),同时由于我在最开始部署项目时,没有找到一个 ...
- Centos django+uwsgi+nginx部署
Centos django+uwsgi+nginx部署 安装Python CentOS 7 Linux发行版默认包含Python 2.但是,Python 2将于2020年1月1日停产.尽管一些遗留应用 ...
- Ubuntu下Django+uWSGI+nginx部署
本文采用uwsgi+nginx来部署django 这种方式是将nginx作为服务端前端,将接受web所有的请求,统一管理,Nginx把所有的静态请求自己处理,然后把所有非静态请求通过uwsgi传递给D ...
- python nginx部署_Python 应用 uWSGI + Nginx 部署
新建一个 Django 应用部署 •使用 py 文件启动 uWSGI def application(env, start_response):start_response('200 ok', [(' ...
- Python 应用 uWSGI + Nginx 部署
新建一个 Django 应用部署 •使用 py 文件启动 uWSGI def application(env, start_response): start_response('200 ok', [( ...
- flask uwsgi nginx 部署在 ubuntu 上
flask 部署在 ubuntu 上 文章目录 flask 部署在 ubuntu 上 视频 创建部署目录 把项目放到部署目录中 安装虚拟环境 激活虚拟环境 安装python依赖库 安装uwsgi 创建 ...
- uwsgi+nginx部署django项目(有图原理的详细展示的)
1. 概念解析(wsgi协议,uwsgi协议,uWSGI) 参考:https://www.cnblogs.com/wspblog/p/8575101.html 1.1 现实世界的web请求: 1.2 ...
最新文章
- MySQL优化篇:锁机制
- vue根据不同权限显示图片_vue如何实现路由权限控制
- 【鸿蒙 HarmonyOS】UI 布局 ( 帧布局 StackLayout )
- C++利用双哈希表实现存储机制hash table的算法(附完整源码)
- HDU1058 Humble Numbers
- [Robot Framework] 怎么做数学运算?
- php适用于什么服务器,php – 找不到laravel类(适用于localhost但不适用于DO服务器)...
- python arima模型_Python时间序列处理之ARIMA模型的使用讲解
- 面试官 | JVM 为什么使用元空间替换了永久代?
- ubuntu安装sqoop1.4.7
- linux的进程/线程/协程系列5:协程的发展复兴与实现现状
- 08TensorFlow2.0基础--8.5张量运算
- 一次性补缴17万元办社保,每月可以领1400多,可否办理?
- Flutter进阶—质感设计之标签栏
- oracle报错注入的一些函数
- 物权法全文内容有哪些呢-广告外链_SEO优化的站外优化工作有哪些?
- Java后端面试题总结一
- 曲线任意里程中边桩坐标正反算(CASIO fx-4800P计算器)程序
- Foxit PDF SDK for Linux (C++ Library) 8.4.1 Crack
- Android - 使用PS修改PNG图片大小