Linux -- 项目部署
一 . 负载均衡
负载均衡其实就是把其中一个服务器用做反向代理, 然后通过访问这个服务器实现负载均衡.
1.准备三台虚拟机
192.168.81.130
192.168.81.131
192.168.81.132
2.分别配置这三台机器
通过修改nginx.conf文件来实现:
130配置反向代理
131,132分别返回页面
3.配置关键点如下:
130负载均衡配置修改nginx.conf:
# 添加负载均衡地址池的参数
#默认是轮询方式,两台服务器
upstream s18django { # 和server同一级别 upstream 是关键字
server 192.168.81.131;
server 192.168.81.132;
}
# 添加反向代理参数如下
# 要写在server里面
location / {
proxy_pass http://s18django # proxy_pass是关键字, 这个http后的参数就是upstream后面的参数
}
当访问192.168.81.130这个负载均衡器的时候,他会找upstream中的地址池的ip,然后轮询
nginx负载均衡算法
# 1.轮询方式,你一次我一次
# 2.加权轮询(权重大的机会大)
upstream s18django {
server 192.168.226.128 weight=2;
server 192.168.226.130 weight=8;
}
# 3.ip_hash方式,对你访问的ip进行hash,不能与加权公用
upstream s18django {
server 192.168.226.128;
server 192.168.226.130;
ip_hash;
}
二 . crm项目部署
1.nginx + uwsgi + django + 虚拟环境 + supervisor + mysql
2.关闭防火墙
# 一定要关闭防火墙,不然在你进行访问的时候,会连接不上
iptables -F #清空规则
systemctl stop firewalld #关闭防火墙服务
systemctl disable firewalld #禁止开机自启
3.django的启动方式为什么 python3 manage.py runserver 为什么不能在生产环境中用?
django只是一个web逻辑框架,它通过python3 manage.py runserver命令启动的socket服务端
是借助python内置的wsgi框架 wsgiref框架实现的
它是一个单机模块,单进程模块,性能很低
# 因此在线上需要借助通过C语言编写的uwsgi这个web服务器软件,启动django python框架按照性能从高到底排序
1.sanic
2.tornado
3.flask
4.django
4.在进行uwsgi启动django的时候,是需要找到wsgi.py这个文件模块的
如果你报错提示 找不到application ,就是因为uwsgi 找不到wsgi.py
解决: 要进入自己的项目(cd /opt/crm) # 然后在执行uwsgi --http :8088 --module Crm_Project.wsgi
5.为什么要用nginx 和 uwsgi?
nginx 可以解决uwsgi的静态文件问题,不用总去请求django,减轻压力,并且支持高并发请求,还能限流,保障后台服务器安全等等 uwsgi 因为uwsgi支持多进程, 多线程的方式,性能很高,启动django性能更好,但是uwsgi不解析django的静态文件 我们以后会收集所有的django项目静态文件,丢给nginx去处理
6.准备crm代码
7.准备一个新的虚拟环境,去启动crm, 使用virtualenvwrapper创建新的虚拟环境(mkdir nginx_crm)
1.解决虚拟环境依赖的问题,也就是保障本地开发环境和线上一致性的问题,
在windows本地 通过
pip3 freeze > requirements.txt
# 这样就将python3解释器中所有模块导出到这个文件中 2.创建虚拟环境 mkvirtualenv nginx_crm 3.将这个 requirements.txt 文件传输到服务器上,进行安装,就可以自动解决所有模块问题
pip3 install -r requirements.txt
8.安装uwsgi
# 一定要确保进入虚拟环境(nginx_crm)
workon nginx_crm
# 下载uwsgi
pip3 install uwsgi
9.使用uwsgi命令启动django项目
# 自己测试用
uwsgi支持热加载的启动方式命令如下
uwsgi --http :8000 --module Crm_Project.wsgi --py-autoreload=1 uwsgi --http :8088 --module Crm_Project.wsgi # 这个Crm_Project在第二层
--http指定http协议启动在 8088端口
--module 找到项目第二层的目录,里面的wsgi.py文件
# 测试就用--http参数
三 . 正式启动环境
# 如果结合了nginx反向代理就需要用的--socket, 为了一劳永逸, 把他写到项目下uwsgi.ini文件中去
1. cd 到项目下 cd /opt/Crm_Project
2.创建uwsgi.ini
3.把下述数据写到uwsgi.ini中去:
[uwsgi]
# Django-related settings
# the base directory (full path)
#填写项目的绝对路径(第一层路径)
chdir = /opt/Crm_Project
# Django's wsgi file
#填写crm第二层目录下的wsgi.py文件的路径
module = Crm_Project.wsgi
# the virtualenv (full path)
#填写虚拟环境的绝对路径
home = /root/Envs/nginx_crm
# process-related settings
# master
master = true
# maximum number of worker processes
#基于uwsgi的多进程,根据cpu来优化
processes = 4
# the socket (use the full path to be safe) #如果你用了nginx反向代理,就填写socket参数
#如果你用了nginx反向代理,就填写socket参数
#如果你用了nginx反向代理,就填写socket参数
socket = 0.0.0.0:8000 #如果你没用nginx,想直接通过浏览器测试后端,使用http
#http = 0.0.0.0:8000 # ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
uwsgi.ini数据
启动代码
uwsgi --ini uwsgi.ini
四 . 配置crm收集所有crm的静态文件
1. 在/opt下创建crmstatic文件夹
2.编辑项目中的settings.py ,写入如下参数
STATIC_ROOT= '/opt/crmstatic'
3.收集crm所有的静态文件
python3 manage.py collectstatic
五 . 配置nginx, 一是支持反向代理,二是支持静态文件加载
修改nginx.conf
#当用户访问 www.s18dnf.com的时候,就进入这个虚拟主机
location / {
uwsgi_pass 0.0.0.0:8000; # 这个8000端口是因为uwsgi.ini里面写的是8000
include uwsgi_params;
} #这个location是解决crm的静态文件的问题的
location /static {
#alias参数 就是将/static转化为/opt/crmstatic ,也就找到了我们所有的静态文件
alias /opt/crmstatic;
}
六 . 重启
!!! 操作完事后一定要重启 (nginx -s reload)
七 . 配置supervisor工具
!!! 注意要退出虚拟环境
# 这个工具只能用python2下载
1.安装easy_install
# pip3是python3的软件包
# easy_install是python2的软件包
yum install python-setuptools
2.安装supervisor
easy_install supervisor
3.创建supervirsor的配置文件
echo_supervisord_conf > /etc/supervisor.conf
4.修改/etc/supervisor.conf的配置文件,添加启动uwsgi的命令
# supervisor其实就是帮咱们执行了,需要手动执行的命令而已
vim /etc/supervisor.conf
# 写入如下内容,在最底部写 # command两边必须是绝对路径
[program:s18crm]
command=/root/Envs/nginx_crm/bin/uwsgi --ini /opt/Crm_Project/uwsgi.ini
stopasgroup=true
killasgroup=true
!!! 测试用supervisor启动uwsgi ,注意要确保此时uwsgi已经退出
supervisord -c /etc/supervisor.conf #这是启动supervisor服务端命令
supervisorctl -c /etc/supervisor.conf #这是supervisor客户端管理命令
supervisor的命令
# 下面这些命令需要在执行supervisorctl -c /etc/supervisor.conf 后执行
status s18crm #查看状态 status后面的参数就是写入到supervisor.conf中program后的参数
start s18crm #启动任务
stop s18crm #停止任务 start all
stop all #启停所有的任务
Linux -- 项目部署的更多相关文章
- Linux项目部署发布
Linux项目部署发布 1.部署环境准备,准备python3和虚拟环境解释器,virtualenvwrapper pip3 install -i https://pypi.douban.com/sim ...
- linux项目部署(非前后端分离crm)
参考博客 参考博客2---部署过程 导论:看参考博客1 WSGI是Web服务器网关接口.它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收 ...
- linux 项目部署问题
1.ubuntu 安装 pillow 报错 缺少依赖包 pip install Pillow ValueError: zlib is required unless explicitly disabl ...
- linux项目部署常用命令
原文出处:http://blog.csdn.net/u013628152/article/details/45847013 1:执行命令#find / -name tomcat,系统将列出所有tomc ...
- Linux项目部署 jdk tomcat 安装配置 linux下 failed connect to localhost:8080;Connection refused
ONBOOT=yes 5.安装wget (1)安装 yum -y install wget (2) 查看版本 wget --version或 wget -V 一.安装jdk 配置 (1)安 ...
- (转)linux中项目部署和日志查看
1 查找进程 ps -ef | grep java 查看所有关于java的进程 root 17540 1 0 2009 ? 01:42:27 /usr/java/ ...
- linux下部署项目问题
1. 今天linux下部署thinkphp项目,数据库用的mysql. 页面其他都是正常的,但是从数据库中取出的数据都是乱码.最后查了资料 解决方案: 在ThinkPHP里面 Library\Thin ...
- linux系统tomcat项目部署和tomcat访问日志
一.只用ip地址访问 先把端口号改成80,然后用 <Host name="localhost" appBase="webapps" 137 ...
- Linux tomcat部署War包,Linux在Tomcat部署JavaWeb项目,Linux部署War包
Linux tomcat部署War包,Linux在Tomcat部署JavaWeb项目,Linux部署War包 >>>>>>>>>>>& ...
随机推荐
- Android开发——获得Json数据,并显示图片
流程介绍 使用okhttp网络框架进行get请求,获得json数据 //一个封装好的工具类的静态方法 public static void sendOkHttpRequest(final String ...
- 调用EntityManagerFactory错误:The import javax.persistence cannot be resolved
缺少jar包:hibernate-jpa-2.0-api-1.0.0.Final.jar
- Javascript异步编程之一异步原理
本系列的例子主要针对node.js环境,但浏览器端的原理应该也是类似的. 本人也是Javascript新手,把自己这段时间学习积累的要点总结下来,希望可以对同样在学习Javascript/node.j ...
- 【Dojo 1.x】笔记1 入门
Dojo是个框架 ,是个js框架,现在除了这一点什么都不知道,就这么上手了. ps:不建议Web初学者看我的笔记,这个要有一定积累才能看. 在<body>标签内写这么一点代码: <b ...
- iOS-----------计算两个时间的时间差
UIButton * nameButton = [UIButton buttonWithType:UIButtonTypeCustom]; nameButton.frame = CGRectMake( ...
- Python枚举类
Enum可以把一组相关常量定义在一个class中,且class不可变,而且成员可以直接比较. 定义枚举类: from enum import Enum, unique @unique class We ...
- Eclipse插件开发教程-插件的导出和安装应用
Eclipse插件可以给开发人员提供不少便利,在很多场景下,插件甚至是必不可少的.那么怎么自己开发一个插件呢?前面两篇讲了怎么开发插件,那么开发完了Eclipse插件之后,怎么使用呢?下面就讲讲插件的 ...
- MySQL 基础知识梳理学习(四)----GTID
在日常运维中,GTID带来的最方便的作用就是搭建和维护主从复制.GTID的主从模式代替了MySQL早期版本中利用二进制日志文件的名称和日志位置的做法,使用GTID使操作和维护都变得更加简洁和可高. 1 ...
- Oracle根据符合条件的数据循环批量更新
--批量对符合条件的表记录进行更新 --aa代表查询出的符合条件数据的别名 --aa后的表示需要符合的条件 --loop后开始写更新操作 begin for aa in (select a.objec ...
- c/c++ 继承与多态 容器与继承3
c/c++ 继承与多态 容器与继承2 巩固了容器里放智能指针的用法,但是有个问题,对于使用Basket类的用户来说,必须添加的是智能指针,如果能直接添加一个普通的类的对象的话,用起来就方便的多了,所以 ...