django项目部署上线与性能调优(pm2进程管理)

确保django项目可以正常启动

#项目gitee地址:https://gitee.com/地址/izufang.git

项目上线准备

#控制台输入:	python manage.py check --deploy     #检查项目上线前的准备



#当前项目有9处可以处理的问题
#settings.py中  
	
DEBUG = False    		  #调试模式
ALLOWED_HOSTS = ['*']     #指定那些主机可以访问,*代表所有,可以指定那些IP地址可以访问


注释掉INSTALL_APPS = #debug_toolbar  这个应用

注释掉MIDDLEWARE = #debug_toolbar.middleware.DebugToolbarMiddleware

注释掉debug_toolbar调试工具栏 #DEBUG_TOOLBAR_CONFIG = {JQUERY_URL:....}

#在urls.py中注释掉debug_toolbar

# if settings.py DEBUG:
# 	import debug_toolbar
# 	urlpatterns.insert(0,path('__debug__/',include(debug_toolbar.urls)))

在settings.py中添加跨域访问的配置

#pip install djang-cors-headers

# # 配置允许跨域访问接口数据
CORS_ORIGIN_ALLOW_ALL = True
# # 跨域访问允许的请求头
CORS_ALLOW_HEADERS = (
     'accept',
     'accept-encoding',
     'authorization',
     'content-type',
     'dnt',
     'origin',
     'user-agent',
     'x-csrftoken',
     'x-requested-with',
     'token',
 )

# # 跨域访问支持的HTTP请求方法
CORS_ALLOW_METHODS = (
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
)

LOGGING = {		# sql语句在控制台打印
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}


# # 避免浏览器自作聪明推断内容类型(避免跨站脚本攻击风险)
SECURE_CONTENT_TYPE_NOSNIFF = True


##避免跨站脚本攻击
SECURE_BROWSER_XSS_FILTER = True


# # 防止点击劫持攻击手段(不允许使用<iframe>标签进行加载)
X_FRAME_OPTIONS = 'DENY'



#同步代码到gitee仓库中

Linux服务器上

#克隆项目到指定文件夹
#注意有git环境  没有的话  yum -y install git

mkdir -p project/{conf,code,static,logs}   --新建project父文件/子文件为conf,code,staric,logs

cd code    							       --进入code文件夹

git clone --depth=1 地址              	   --  配过免密直接SSH,depth只要最新版本

cd.. 执行两次                               --回到project目录下









#给项目创建虚拟环境(在project目录下)
	
#		python -m venv venv             --  使用venv模块创建venv虚拟环境名为venv(这里不用这种方法)

pip3 install virtualenv        			-- 安装virtualenv模块
pip3 install -U virtualenv              --更新这个模块


whereis python3                 		--查看当前python3解释器路径			


virtualenv --python=/usr/local/python3 venv    --刚才找到的python3路径,创建venv的文件夹


source venv/bin/activate                 --激活当前虚拟环境


pip install -r code/izufang/requirements.txt		--python装依赖


pip install uwsgi                            --实现和服务器进行通信

Uwsgi配置

#在虚拟环境中
	
vim conf/uwsgi.ini          - 配置uwsgi



#文件中写入以下内容:
[uwsgi]
#配置前导路径
base=/root/project
#配置项目名称
name=izufang
#守护进程
master=true
#进程个数
processes=4
#虚拟环境
pythonhome=%(base)/venv
#项目地址
chdir=%(base)/code/%(name)
#指定python解释器
pythonpath=%(pythonhome)/bin/python
#指定wsgi文件
module=%(name).wsgi
#通信的地址和端口(自己服务器的IP地址和端口)
http=0.0.0.0:8000
#日志文件地址
#logto=%(base)/logs/uwsgi.log                       #暂时注释掉

-------------------------------------------------------------------------------

#保存退出后


uwsgi --ini conf/uwsgi.ini              --启动项目,可以在浏览器输入服务器地址:8000 访问


#确定可以访问后,修改uwsgi配置文件 
	vim conf/uwsgi.ini     --打开文件
	
				#修改通信的地址和端口(自己服务器的IP地址和端口)
					socket=0.0.0.0:8000

-----------------------------------------------------------------------

uwsgi --ini conf/uwsgi.ini &              --uwsgi这个进程放在后台运行 
或
nohup uwsgi -ini conf/uwsgi.ini &        --同上,当这个进程收到中断信号时,它依然要运行

jobs可以看到状态

Nginx的配置

systemctl stop nginx          --停止Nginx服务器

vim /etc/nginx/nginx.conf        --打开nginx配置文件


#修改server中的配置
	...
	server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;

        location / {
             include uwsgi_params;
             uwsgi_pass 172.16.101.72:8000;     #阿里云本机内网IP,命令为:ifconfig.eth0
        }

        location /static/ {
             alias /root/project/static/;
             expires 30d;
        }
   }
}       #底下的配置是配置HTTPS的配置,暂时删除

在这里插入图片描述

把静态资源全部放置 project/static目录下

#进入code/izufang/izufang                -- 进入项目主文件夹



vim settings.py                         -- 编辑项目配置文件


-------------------------------------------------------------------
#在配置文件中找到静态资源配置
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), ]
#配置下面这句话      静态资源存放路径
STATIC_ROOT = '/root/project/static'

				#改好之后,保存退出
---------------------------------------------------


cd ..                                    -- 回到project/izufang的目录下

python manage.py collectstatic           --  把原来配置的静态资源迁移到刚才配置的文件路径下

----------------------------------------------------------------

修改静态资源static的所有者

systemctl start nginx                       -- 启动aginx
#这时可以用浏览器访问 服务器IP:80 访问静态资源,出现403错误,因为nginx的配置文件中我们静态资源是放置
在root目录下,nginx没有权限访问, 可以吧root/project/static的所有者修改为nginx就可以,


chown -R nginx static                       --  在project目录下,修改static的所有者为nginx


#这是在不考虑https的情况下,项目已经部署成功

解决Nginx请求体最大文件限制:

http{}中加入 client_max_body_size 10m;
重启nginx

用pycharm来连接服务器上传代码

在这里插入图片描述

在这里插入图片描述
如果有一个项目有多台服务器,那么选择Server group组,来管理多台服务器

在这里插入图片描述

Gunicorn配置(附录)

也可以用gunicorn代替uwsgi,根据个人喜好选择;

gunicorn参数详解

pip install gunicorn   # 安装


# coding:utf-8
import multiprocessing

# 绑定的ip与端口
bind = "0.0.0.0:8100"   

# 进程数  cpu数量*2+1 推荐进程数
workers = multiprocessing.cpu_count() * 2 + 1  

# 指定每个进程开启的线程数
threads = 3 

# 处理请求的工作线程数,使用指定数量的线程运行每个worker。为正整数,默认为1。
worker_connections = 2000

# 最大客户端并发数量,默认情况下这个值为1000。此设置将影响gevent和eventlet工作模式
max_requests = 2000

# 设置pid文件的文件名,如果不设置将不会创建pid文件
pidfile = '/home/chenxinming/项目名/script/gunicorn.pid'

# 要写入错误日志的文件目录。
errorlog = '/home/chenxinming/项目名/script/gunicorn.error.log' 

# 要写入的访问日志目录
accesslog = '/home/chenxinming/项目名/script/gunicorn.access.log' 

# 监听队列
backlog = 512                

#进程名
proc_name = 'gunicorn_项目名_project'   

# 设置超时时间120s,默认为30s。按自己的需求进行设置timeout = 120
timeout = 120      

# 超时重启
graceful_timeout = 300

# 使用gevent模式,还可以使用sync 模式,默认的是sync模式
worker_class = 'gevent'
 
# 日志级别,这个日志级别指的是错误日志的级别,而访问日志的级别无法设置
loglevel = 'info' 

# 设置gunicorn访问日志格式,错误日志无法设置
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"'

# 在keep-alive连接上等待请求的秒数,默认情况下值为2。一般设定在1~5秒之间。
keepalive = 3

# HTTP请求行的最大大小,此参数用于限制HTTP请求行的允许大小,默认情况下,这个值为4094。
# 值是0~8190的数字。此参数可以防止任何DDOS攻击
limit_request_line = 5120

# 限制HTTP请求中请求头字段的数量。
#  此字段用于限制请求头字段的数量以防止DDOS攻击,与limit-request-field-size一起使用可以提高安全性。
# 默认情况下,这个值为100,这个值不能超过32768
limit_request_fields=101

# 限制HTTP请求中请求头的大小,默认情况下这个值为8190。
# 值是一个整数或者0,当该值为0时,表示将对请求头大小不做限制
limit_request_field_size= 8190

# 设置gunicorn使用的python虚拟环境
pythonpath='/home/chenxinming/项目名//venv/bin/python3'

# 环境变量
raw_env = 'APE_API_ENV=DEV'

access_log_format

日志常见格式说明:

识别码	说明
h	远程地址
l	“-“
u	用户名
t	时间
r	状态行,如:GET /test HTTP/1.1
m	请求方法
U	没有查询字符串的URL
q	查询字符串
H	协议
s	状态码
B	response长度
b	response长度(CLF格式)
f	参考
a	用户代理
T	请求时间,单位为s
D	请求时间,单位为ms
p	进程id
{Header}i	请求头
{Header}o	相应头
{Variable}e	环境变量

worker_class

要使用的工作模式,默认为sync。可引用以下常见类型“字符串”作为捆绑类:

sync

eventlet:需要下载eventlet>=0.9.7

gevent:需要下载gevent>=0.13

tornado:需要下载tornado>=0.2

gthread

gaiohttp:需要python 3.4和aiohttp>=0.21.5

loglevel支持的级别名称为:

debug(调试)

info(信息)

warning(警告)

error(错误)

critical(危急)

实操:

创建gun_conf.py

import multiprocessing

bind = '127.0.0.1:8001'
workers = multiprocessing.cpu_count() * 2 + 1

backlog = 512 # 服务器中在pending状态的最大连接数,即client处于waiting的数目。超过这个数目, client连接会得到一个error 建议取值64-2048

worker_class = 'gevent'

timeout = 30

limit_request_line = 0  # http request line最大字节数。值范围0-8190, 0表示无限制。
limit_request_field = 32768  # http request中 header字段数的最大值。缺省为100,最大32768。
limit_request_field_size = 0  # http request header字段最大字节数。0表示无限制。

reload = True

直接用gunicorn做api服务器(静态资源配置)

在主项目urls.py中添加如下
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()

启动

source /root/project/venv/bin/activate

gunicorn -c gun_conf.py 项目名.wsgi:application

pm2进程管理工具

安装

1.在 root 目录下,下载Node.js安装包
wget https://nodejs.org/dist/v14.15.1/node-v14.15.1-linux-x64.tar.xz


2.解压文件
tar xvf node-v14.15.1-linux-x64.tar.xz


3.创建软链接,以便可以在任意目录下使用 node 和 npm 命令(类似在windows上配置全局环境变量)
ln -s /root/node-v14.15.1-linux-x64/bin/node /usr/local/bin/node
ln -s /root/node-v14.15.1-linux-x64/bin/npm /usr/local/bin/npm

# 软链接(类似windows下的快捷方式)  ln -s 原文件名 链接文件名


4. 查看版本(是否安装成功)
node -v
npm -v


5. 安装 cnpm 并创建软链接,至此安装成功!(可选)
npm install -g cnpm --registry=https://registry.npm.taobao.org
ln -s /root/node-v14.15.1-linux-x64/bin/cnpm /usr/local/bin/cnpm

# 配置淘宝镜像(方便我们用超音速的速度去下载这个小小的包)
npm config set registry https://registry.npm.taobao.org


6. 安装pm2
npm install -g pm2

7. 创建软链接
ln -s /root/node-v14.15.1-linux-x64/bin/pm2 /usr/local/bin/pm2

8. 常用命令
pm2 list #查看进程
pm2 stop/reload/restart/delete all #停止/重载/重启/删除 所有进程
pm2 stop/reload/restart/delete 0 #停止/重载/重启/删除 pm2进程列表中进程为0的进程
pm2 logs [--raw] #显示所有进程的日志
pm2 flush #清空所有日志文件
pm2 reloadLogs #重载所有日志

错误

在这里插入图片描述

清除npm缓存
npm cache clean --force
取消ssl验证:
npm config set strict-ssl false
之后再npm install 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像风一样的男人@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值