django + uwsgi + vue + nginx + centos7

Nginx 中 upstream 机制的负载均衡 · 理解 Nginx 源码 · 看云  nginx源码网址,详细记录

此项目类似于前后端分离,要部署前端路由和后端接口。单项目部署一个server
多项目部署在加多个server。其余类似
在nginx.conf中首先第一行设置访问的权限,不设置的会出现Forbidden
然后再server中设置如下,因为我vue请求后端接口的时候都以api开头,
代表的开发环境时测试的IP,所以这里必须以api开头,把他部署在哪个
服务器应该就代表哪个服务器的IP,所以这里必须以api开头,测试其他不行

https 如下:

listen 本地IP:443 ssl;
server_name  申请的域名;
ssl_certificate  证书路径;
ssl_certificate_key  证书key路径;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;

http如下:
nginx.conf中如下:
server{
    listen 8996;
    server_name localhost; # 随便服务器名字,
    charset utf-8;
    client_max_body_size 75M;
    location / {
    root /home/edwin/project_server/dist;
    # vue打包的dist文件的路径,这里和项目放在一起,也可以放别处
    index index.html index.htm
    }
    location /api/{
        rewrite  ^/api/(.*)$ /$1 break;     重定向。去掉后端路径开头携带的api
        include    uwsgi_params;   # 加载uwsgi模块
        uwsgi_pass 127.0.0.1:8996;
        与uwsgi中的socket一样。代表访问这转发给uwsgi处理。
    }
    }
}
在浏览器访问8996端口时,首先/是返回一个index.html首页,
访问/api/时交给uwsgi处理

django端配置project.ini名字随便取,与manage.py同路径
[uwsgi]   不要忘记写这行
# 项目路径
chdir=/home/lisheng/project/project_server/
# 固定project_server是项目名
module=project_server.wsgi:application
master=true
processes=3
threads=2
socket=0.0.0.0:8997 # 与uwsgi_pass一样
env = DJANGO_SETTINGS_MODULE=djangoDms.conf.local   # 可能测试环境和正式环境单独一个setting配置文件
home=/home/edwin/.virtualenvs/quotationEnv
vacuum=true
enable-threads=true
pidfile=uwsgi.pid   # 运行时的主进程号,会自动创建文件
daemonize = project.log # 日志,以前的日志不管用了,会自动创建文件记录日志
此时运行 uwsgi --ini project.ini(创建软连接)
项目目录下再创建几个.sh文件。start.sh  stop.sh  restart.sh等。方便管理运行
start.sh里面直接uwsgi --ini project.ini     stop.sh里面uwsgi --stop uwsgi.pid    restart.sh里面uwsgi --reload uwsgi.pid
chmod +x start.sh 赋予可执行权限

可能会出现[uWSGI] getting INI configuration from project.ini
表明运行成功,通过 ps aux|grep uwsgi 查看确认是否uwsgi启动。

上面有的可要可不要,具体网上找查。
setting中可以关闭debug=False.可以不要静态文件的所有配置,
也就是django纯粹不用管前端事,只管发送数据。差不多就是个前后端分离.

如果不分离,html css js什么的都在django中一起完成时,配置又不相同,这时django
配置中要收集静态文件,python manage.py collectstatic具体百度。

正向代理:某人向有钱人借钱,不借,某人的同学刚好认识那个有钱人,于是让他的同学向那个有钱人借钱,然后再借给某人。OK
反向代理:某人打10086,总部10086会根据你的请求分发各地的服务商。比如你是重庆的,那么就会分发重庆的客服接听。OK。
反向代理跟负载均衡相辅相成,总部分发给下面的部门的时候,怎么发,如何发,这就到了负载均衡。
centos7 下安装Python
先安装依赖:yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
2.wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz
3.解压 tar -xvf Python-3.6.4.tgz
4.一般装在 /usr/local/python3  没有可以自己创建
5.进入到文件目录 cd Python-3.6.4
6.配置./configure --prefix=/usr/local/python3
此时如果报错安装 yum install gcc
7.make   8.  make install
9.做软连接 ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3
10.设置pip软连接 ln -s /usr/local/python3/bin/pip3.6 /usr/bin/pip3
11.测试安装成功 python3 -V
12.因为yum源使用的Python2,替换为Python3以后,会导致其无法正常工作。需要修改以下信息:
修改yum配置文件: vi /usr/bin/yum第一行改为python2.7
就OK了 就可以正常使用yum安装其他软件了。

CentOS下安装django-obdc-azure时需安装依懒
yum install gcc
yum install gcc-c++
yum install unixODBC-devel
连接sqlserver数据库时除了上面三个,还要安装FreeTDS
1.wget http://ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable.tgz
2.tar zxvf freetds-stable.tgz
3.cd freetds-0.91/
4../configure --prefix=/usr/local/freetds0.91  --enable-msdblib  --with-tdsver=7.3 
        7.3好像很适合连接sqlserver
5.make &&make install 安装好之后可以测试一下
cd /usr/local/freetds/bin
./tsql -C
6.修改配制文件vi /usr/local/freetds0.91/etc/freetds.conf
[server2008]
    host = 192.168.6.22
    port = 1433
    tds version = 7.3
然后可以连接试一下
./tsql -H 192.168.6.22 -p 1433 -U sa -P Wc123456
或者/usr/local/freetds0.91/bin/tsql -S server2008 -U sa -P Wc123456
7.参见https://blog.csdn.net/u014305812/article/details/78020509
8.将freeTDS的so作为driver cd /etc/  下面有odbcinst.ini  也可以whereis和find找
在最下面添加如下内容
[FreeTDS]
Description=FreeTDS
Driver=/usr/local/freetds0.91/lib/libtdsodbc.so
Setup=/usr/lib64/libtdsS.so
FileUsage=1
client charset = utf-8
测试 
odbcinst -d -q 应该有
[FreeTDS] 
查看unixODBC驱动odbc_config --version --longodbcversion --cflags --ulen --libs --odbcinstini --odbcini
2.3.1
3.52
....
这里测试连接,连接上了django才能连接
isql -v server2008 sa Wc123456


数据库操作:
1、乐观锁
总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,
因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改
2、悲观锁
总是假设最坏的情况,每次取数据时都认为其他线程会修改,所以都会加锁(读锁、写锁、行锁等),
当其他线程想要访问数据时,都需要阻塞挂起。可以依靠数据库实现,如行锁、读锁和写锁等,都是在操作之前加锁

一、未提交读READ UNCOMMITTED(脏读)
意义:包含未提交数据的读。例如,在多用户环境下,用户B更改了某行。用户A在用户B提交更改之前读取已更改的行。
如果此时用户B再回滚更改,则用户A便读取了逻辑上从未存在过的行。
其他事务提交了对数据的修改后,本事务就能读取到修改后的数据值

二、提交读(READ COMMITTED)
意义:指定在读取数据时控制共享锁以避免脏读。此隔离等级的主要作用是避免脏读。
其他事务只要修改了数据,即使未提交,本事务也能看到修改后的数据值

三、Repeatable read 可重复读,无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响
四、Serializable 串行化,一个事务一个事务的执行
Mysql默认是三,如果要使用乐观锁和悲观锁则要把级别修改为二(提交读)
SqlServer默认是二,可以查看当前隔离级别,做修改

Nginx + uWSGI部署:

1.wsgi:wsgi是一个网关接口,定义服务器与应用程序之间的通信规范(我和你沟通规定用中文沟通,如果用英语,我听不懂就无法沟通)。
   wsgi是web服务器与应用程序之间的一种简单而通用的接口,浏览器无法直接访问应用程序,         wsgi负责接收HTTP请求,并向浏览器发送HTTP响应,具体的逻辑处理,调用相应的处理程序。
2.uWSGI:是一个web服务器,实现了HTTP、wsgi、uwsgi协议
   是一种全功能的HTTP服务器,可以将HTTP协议转化为python可以识别的WSGI协议可以用来部署分布式集群。
   特点:超快的性能、低内存的占用、多APP管理、详尽的日志功能、高度可定制化。
3.uwsgi:是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型。
4.实现:
     1.首先nginx 是对外的服务接口,外部浏览器通过url访问nginx,

     2.nginx 接收到浏览器发送过来的http请求,将包进行解析,分析url,
       如果是静态文件请求就直接访问用户给nginx配置的静态文件目录,直接返回用户请求的静态文件,

       如果不是静态文件,而是一个动态的请求,那么nginx就将请求转发给uwsgi,uwsgi 接收到请求之后将包进行处理,处理成wsgi可以接受的格式,并发给wsgi,wsgi 根据请求调用应用程序的某个文件,某个文件的某个函数,最后处理完将返回值再次交给wsgi,wsgi将返回值进行打包,打包成uwsgi能够接收的格式,uwsgi接收wsgi 发送的请求,并转发给nginx,nginx最终将返回值返回给浏览器。

     3.要知道第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程,
       但是要考虑到某些情况

       1.安全问题,程序不能直接被浏览器访问到,而是通过nginx,nginx只开放某个接口,uwsgi本身是内网接口,这样运维人员在nginx上加上安全性的限制,可以达到保护程序的作用。

       2.负载均衡问题,一个uwsgi很可能不够用,即使开了多个work也是不行,毕竟一台机器的cpu和内存都是有限的,有了nginx做代理,一个nginx可以代理多台uwsgi完成uwsgi的负载均衡。

     4.静态文件问题,用django或是uwsgi这种东西来负责静态文件的处理是很浪费的行为,
       而且他们本身对文件的处理也不如nginx好,所以整个静态文件的处理都直接由nginx完成,静态文件的访问完全不去经过uwsgi以及其后面的东西。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值