【Django 天天生鲜项目06】项目部署(uwsgi服务器、Nginx服务器)、总结

关键:uwsgi的使用、Nginx的使用......

仅作为个人笔记

目录

1.最基本的部署架构

2.uwsgi作web服务器

3.使用Nginx

3.1.Nginx配置转发请求给uwsgi

3.2.Nginx配置处理静态文件

3.3.nginx转发请求给其他地址

3.4. nginx配置upstream实现负载均衡


1.最基本的部署架构

【Django 天天生鲜项目06】项目部署(uwsgi服务器、Nginx服务器)、总结_第1张图片

 

2.uwsgi作web服务器

uwsgi是一个遵循wsgi协议的web服务器。

 

uwsgi的安装

在虚拟环境中,执行以下命令安装:

pip install uwsgi

 

uwsgi的配置

(1)项目部署时,需要关闭调试模式,并允许访问,在settings.py配置文件下:

DEBUG =  False

ALLOWED_HOSTS = ['*']

(2)新建配置文件 uwsgi.ini ,可以放在项目目录下,具体值根据自己项目修改即可:

[uwsgi]
# 使用nginx连接时使用
#socket=127.0.0.1:8080
# 直接做web服务器使用
http=127.0.0.1:8080
# 项目目录
chdir=/home/python/Desktop/python/DjangoTest/dailyfresh
# 项目中wsgi.py文件的目录,相对于项目目录
wsgi-file=dailyfresh/wsgi.py
# 指定启动的工作进程数
processes=4
# 指定工作进程中的线程数
threads=2
master=True
# 保存启动之后主进程的pid的文件
pidfile=uwsgi.pid
# 设置uwsgi后台运行,uwsgi.log保存日志信息
daemonize=uwsgi.log
# 设置虚拟环境的路径
virtualenv=/home/python/.virtualenvs/dailyfresh

tips:

  • 在虚拟环境中,执行以下命令安装:
  • 在项目目录中,使用pwd即可查看项目目录;
  • 在根目录中 cd .virtualenvs/ ,再cd到虚拟环境,使用pwd查看虚拟环境目录;

 

uwsgi的启动和停止

启动: uwsgi --ini 配置文件路径         例如:uwsgi --ini uwsgi.ini

停止: uwsgi --stop uwsgi.pid路径    例如:uwsgi --stop uwsgi.pid

关不掉则强制关闭:killall -s INT uwsgi

填坑:

如果没法正常启动,查看log发现报错: no internal routing support, rebuild with pcre support !!!

Ubuntu可以尝试:

pip uninstall uwsgi

sudo apt-get install libpcre3 libpcre3-dev

pip install uwsgi --no-cache-dir

 centos可以尝试:

pip uninstall uwsgi
yum install -y pcre pcre-devel pcre-static
pip install uwsgi --no-cache-dir

注意:pip install uwsgi 要加上 –no-cache-dir,这样 pip 才可以强制下载重新编译安装的库,不然pip会直接从缓存中取上次编译后的 uwsgi 文件,并没有重新编译一份。

 

启动之后,就可以通过uwsgi配置的地址来进行访问了。这时就会发现样式都不起作用了,这是因为setting.py的 DEBUG =  False 时,Django不能再帮我们处理静态文件了。这时候就要使用Nginx了。

 

3.使用Nginx

3.1.Nginx配置转发请求给uwsgi

Nginx和uwsgi进行对接。

(1)需要更改uwsgi的配置文件,配置为socket而非http

# 使用nginx连接时使用
socket=127.0.0.1:8080
# 直接做web服务器使用
# http=127.0.0.1:8080
......

(2)配置Nginx的配置文件,Ubuntu 下,配置文件为 /usr/local/nginx/conf 下的 nginx.conf 。修改http中的server(每个server相当于一个服务器),部分如下:

sudo vi /usr/local/nginx/conf/nginx.conf

location / {
    include uwsgi_params;
    uwsgi_pass uwsgi服务器的ip:port;
}

......
server {
		# 默认监听端口
        listen       80;
        server_name  localhost;
		location / {
			# 包含uwsgi请求的参数
			include uwsgi_params;
			# 转交请求给uwsgi服务器的ip:port;
			uwsgi_pass 127.0.0.1:8080;
		}
        ......

 

配置好之后,启动或重启Nginx:

sudo /usr/local/nginx/sbin/nginx -s reload

启动uwsgi:

uwsgi --ini uwsgi.ini   

(启动:uwsgi --ini 配置文件路径  停止: uwsgi --stop uwsgi.pid路径

浏览器请求 127.0.0.1/index 即可访问首页。(不写端口会访问默认监听端口)

 

3.2.Nginx配置处理静态文件

(1)django项目的 settings.py中配置收集静态文件路径

STATIC_ROOT=收集的静态文件路径

# 配置收集静态文件路径
STATIC_ROOT = '/var/www/dailyfresh/static'

没有目录可以先创建:sudo mkdir -p /var/www/dailyfresh/static

(2)django 收集静态文件的命令

python manage.py collectstatic

执行上面的命令会把项目中所使用的静态文件收集到STATIC_ROOT指定的目录下。

注意:

1.不能直接复制项目下的static目录,因为除此之外还有其他的静态文件

2.如果没有该目录的操作权限,更改权限:sudo chmod 777 /var/www/dailyfresh/static/

 

(3)收集完静态文件之后,让nginx提供静态文件,需要在nginx配置文件中增加如下配置

sudo vi /usr/local/nginx/conf/nginx.conf

location /static {
			# 指定静态文件存放的目录: alias 静态文件存放的目录;
			alias /var/www/dailyfresh/static/;	
		}

 

(4)重启Nginx:sudo /usr/local/nginx/sbin/nginx -s reload


3.3.nginx转发请求给其他地址

【Django 天天生鲜项目06】项目部署(uwsgi服务器、Nginx服务器)、总结_第2张图片

Nginx可以将请求转发给其他地址。比如将请求转发至提供静态文件的服务器。

之前做了首页的静态化,提供静态文件的Nginx和项目调度的Nginx可能在同一台电脑(本项目都在一台电脑),也可能不同。在该如何调度呢?约定当 访问/ 时访问的是静态化的首页。访问 /index 时访问Django首页视图。

下面在调度Nginx的 location 对应的配置项中增加 proxy_pass 配置转发的服务器地址,指向提供静态化首页的nginx服务器。

如当用户访问ip 如 127.0.0.1 时,在调度的nginx中配置,把这个请求转发给提供静态化首页的nginx服务器(http://ip:port,如172.16.179.131:8001)。

配置如下:

        # =表示精确匹配
        location = / {
            # 传递请求给静态服务的Nginx: proxy_pass http://ip:port;
            proxy_pass http://172.16.179.131:8001;	
        }

 

 

3.4. nginx配置upstream实现负载均衡

Nginx可以配置代理多台服务器,当一台服务器宕机之后,仍能保持系统可用。如上面的部署项目流程图所示,Nginx可以配置8080、8081等多个服务器。

在项目中,再创建配置一个uwsgi的配置文件 uwsgi2.ini ,修改该端口和文件名等之后,就可以通过他再启动一个服务了:uwsgi --ini uwsgi2.ini 。这样就启动了两个服务器了。

通过以下配置实现负载均衡。

 

ngnix 配置负载均衡时,在server配置的前面增加upstream配置项。

......
upstream dailyfresh {
		server 127.0.0.1:8080;
		server 127.0.0.1:8081;
	}
server {
		# 默认监听端口
        listen       80;
        server_name  localhost;
		location / {
			# 包含uwsgi请求的参数
			include uwsgi_params;
			# 转交请求给uwsgi服务器的ip:port;
			#uwsgi_pass 127.0.0.1:8080;
			uwsgi_pass dailyfresh;
		}

        ......

重启 Nginx:sudo /usr/local/nginx/sbin/nginx -s reload

启动第二个uwsgi:uwsgi --ini uwsgi2.ini  

这样,基本的负载均衡初步完成了。upstream按照轮询(默认)方式进行负载,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。虽然这种方式简便、成本低廉。但缺点是:可靠性低和负载分配不均衡。适用于图片服务器集群和纯静态页面服务器集群。

通过 tail -f uwsgi.log 和 tail -f uwsgi2.log 打开两个log日志文件,从浏览器进行访问,可以发现两个服务器是轮流来进行处理的。

这样,项目就算是部署完了。

 

注意,如果开发完了在服务器部署,注意各个涉及到文件路径等地方,是否和本地的设置一样,注意各种配置文件的路径等。(最好养成习惯,这些都从配置文件或setting.py中加载)

比如:

(1)搜索功能使用了jieba分词模块,要将虚拟环境下的haystack目录即 /home/python/.virtualenvs/dailyfresh/lib/python3.5/site-packages/haystack/backends ,中的ChineseAnalyzer.py、whoosh_cn_backend.py也放到线上对应目录中。

(2)MySQL数据库的ip等

(3)数据库的导入可以先执行迁移,再导入数据。注意新建数据库时设置字符类型:create database 数据库名 charset=utf8;

mysqldump -u用户  -p密码  数据库名 表名 参数 >导出的文件

只导出数据示例:

mysqldump -uroot  -p --skip-extended-insert --complete-insert dailyfresh --no-create-info >dailyfresh.sql

导入:mysql -uroot -p database_name < 文件,如果完整备份数据库,则无需使用特定的表名称;

完整导出:mysqldump -u root -p database_name table_name > 文件名

导入:mysql -u root -p database_name < 文件名,使用该 命令需要确认数据库已经创建;

参考:https://blog.csdn.net/weixin_40482816/article/details/87074689

(4)python和FastDFS的交互需要安装相关的包,由于我的是从zip文件安装的,直接导入requirements.txt不一定成功。所以在云服务器中还要安装一次。

(5)当我在腾讯云部署时,发现注册邮件不能发送了。注意!!!发送邮件需要在腾讯云申请解封25端口!在云服务器管理平台中点击“25端口解封”,进行解封申请

(6)如果写死了注册的激活连接,记得重新改为正确的;

 

 

 

 

简单总结

生鲜类产品  B2C  PC电脑端网页

功能模块:用户模块  商品模块(首页、 搜索、商品) 购物车模块  订单模块(下单、 支付)

用户模块注册、登录(redis用作缓存和session、login_required 装饰器、LoginRequired Mixin类的使用)、激活(发送邮件)、退出、个人中心、地址

商品模块:首页、详情、列表、搜索(haystack+whoosh

购物车:数据库的 增加、删除、修改、查询

订单模块:确认订单页面、提交订单MySQL事务、高并发的库存问题 (悲观锁、乐观锁请求支付(支付宝的使用)查询支付结果评论

django默认的认证系统 AbstractUser

itsdangerous  生成签名的token (序列化工具 dumps  loads)

邮件 (django提供邮件支持 配置参数  send_mail)

 celery (重点  整体认识 异步任务)

 页面静态化 (缓解压力  celery  nginx

 缓存(缓解压力, 保存的位置、有效期、与数据库的一致性问题)

 FastDFS (分布式的图片存储服务, 修改了django的默认文件存储系统)

 搜索( whoosh  索引  分词)

 购物车使用redis 的哈希类型 历史记录(redis list)

 ajax 前端、ajax请求后端接口

 高并发的库存问题 (悲观锁、乐观锁

 支付的使用流程

 nginx (负载均衡  提供静态文件)

 

01 框架、数据表设计、项目框架笔记

02 注册、登录、用户中心 (itsdangerous模块加密、celery异步、 Django 的验证系统、redis作为缓存等)

03 FastDFS文件存储-首页-详情页-列表页

04 搜索(搜索引擎、分词包的使用)、购物车

05 订单(Mysql事务、并发处理、支付宝支付、评论)

06 项目部署(uwsgi服务器、Nginx服务器)

 

-----end-----

 

你可能感兴趣的:(Django实战)