前端 web项目 + 后端Django项目 部署

Web 部署

前端项目以vue 为示例:

  1. 安装node he npm
  2. git clone web项目
  3. 进入项目跟目录, 执行npm install (编译安装生成 node_modules 目录)
  4. 执行npm run build (生成disk)
  5. 配置nginx, html为disk/index.html

 

安装nginx

  1. 安装依赖:  yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 
  2. 下载nginx: http://nginx.org/download/nginx-1.18.0.tar.gz
  3. 解压并编码:
    1. tar -zxvf nginx-1.18.0.tar.gz
    2. ./configure
    3. make && make install

  4.  启动nginx:

  可以查找nginx 执行目录: find / -name nginx

  执行: /usr/sbin/nginx

  5. 直接浏览器访问: 127.0.0.1:80   

  PS:  注意: 1、虚拟机端口开放, 2、关闭防火墙, 

nginx 配置

配置文件: 一般默认在: 、/etc/nginx/nginx.conf, 也可以直接find 查找 nginx.conf

文件结构:

...              #全局块

events {         #events块
   ...
}

http      #http块
{
    ...   #http全局块
    server        #server块
    { 
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局块
}

1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。

2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。

5、location块:配置请求的路由,以及各种页面的处理情况。

 

示例:

########### 每个指令必须有分号结束。#################
#user administrator administrators;  #配置用户或者组,默认为nobody nobody。
#worker_processes 2;  #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大连接数,默认为512
}
http {
    include       mime.types;   #文件扩展名与文件类型映射表
    default_type  application/octet-stream; #默认文件类型,默认为text/plain
    #access_log off; #取消服务日志    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
    access_log log/access.log myFormat;  #combined为日志格式的默认值
    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #热备
    }
    error_page 404 https://www.baidu.com; #错误页
    server {
        keepalive_requests 120; #单连接请求上限次数。
        listen       4545;   #监听端口
        server_name  127.0.0.1;   #监听地址       
        location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           #root path;  #根目录
           #index vv.txt;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip           
        } 
    }
} 

借鉴: 链接

 

uwsgi 安装

uwsgi 安装依赖包:  python-dev

安装方式一:

pip innstall uwsgi

ps: 也可以通过源码安装, 这里不做介绍了, 链接

使用:

  一个简单的 "Hello World" 开始,创建文件 foobar.py,代码如下:

# python 3.x
def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello World"]

# python 2.x
def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return "Hello World"

启动: (uWSGI 来运行一个 HTTP 服务器,将程序部署在HTTP端口 9090)

  uwsgi --http :9090 --wsgi-file foobar.py

直接访问: 9090 端口 会直接看到: ” Hello World “

PS:  如果在虚拟环境中使用, 那么需要在虚拟环境中安装, 否则无法直接使用

 

uwsgi 配置

这里只介绍 ini file 类型 ( 项目目录, 即manage.py的同级目录创建文件 uwsgi.ini )

示例:

[uwsgi]
# 监听端口 - 套接字
socket = 127.0.0.1:9090
# 监听端口 - http, 可以直接访问 # http = :10000 # 运行状态 #stats = 127.0.0.1:9191 # 工作路径 chdir = /root/blog # django wsgi 路径 wsgi-file = /root/blog/App/wsgi.py # python 虚拟环境路径 virtualenv = /root/.virtualenvs/blog # uwsig pid 号 pidfile = /root/blog/uwsgi.pid # post 请求超过 字节 就缓存值磁盘 post-buffering = 8192 # 缓冲区大小 buffer-size = 32768 # 设置进程 processes 和 workers 一样的意思 # processes = 2 workers = 2 # 每个进场下面的线程数 threads = 4 # 未使用 systemd 时日志文件,会一直保持在后台,使用 docker 应该使用 logto daemonize = /var/logs/uwsgi.log # 使用 systemd、docker 等时的 日志文件 # logto = /root/blog/uwsgi.log # 设置平滑启动 (处理完接受到的请求) 的等待时间(秒) reload-mercy = 10 # 设置工作进程使用虚拟内存超过 MB 就回收重启 reload-on-as = 1024 # python 文件修改后自动重启 py-autoreload = 1 # 设置一个请求超时(秒),就丢弃掉 harakiri = 60 # 当一个请求被 harakiri 掉,输出一条日志 harakiri-verbose = true # 静态文件 uwsgi 自己处理(推荐使用 nginx) static-map = /static=/root/blog/static_root

#flask 项目 application 的变量名 如:app = Flask(__name__)
callable=app

详解:

master = true 
#启动主进程,来管理其他进程,其它的uwsgi进程都是这个master进程的子进程,如果kill这个master进程,相当于重启所有的uwsgi进程。

chdir = /web/www/mysite 
#在app加载前切换到当前目录, 指定运行目录

module = mysite.wsgi 
# 加载一个WSGI模块,这里加载mysite/wsgi.py这个模块

py-autoreload=1  
#监控python模块mtime来触发重载 (只在开发时使用)

lazy-apps=true  
#在每个worker而不是master中加载应用

socket = /test/myapp.sock 
#指定socket文件,也可以指定为127.0.0.1:9000,这样就会监听到网络套接字

processes = 2 #启动2个工作进程,生成指定数目的worker/进程

buffer-size = 32768 
#设置用于uwsgi包解析的内部缓存区大小为64k。默认是4k。

daemonize = /var/log/myapp_uwsgi.log 
# 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器

log-maxsize = 5000000 #设置最大日志文件大小

disable-logging = true #禁用请求日志记录

vacuum = true #当服务器退出的时候自动删除unix socket文件和pid文件。

listen = 120 #设置socket的监听队列大小(默认:100)

pidfile = /var/run/uwsgi.pid #指定pid文件

enable-threads = true 
#允许用内嵌的语言启动线程。这将允许你在app程序中产生一个子线程

reload-mercy = 8 
#设置在平滑的重启(直到接收到的请求处理完才重启)一个工作子进程中,等待这个工作结束的最长秒数。这个配置会使在平滑地重启工作子进程中,如果工作进程结束时间超过了8秒就会被强行结束(忽略之前已经接收到的请求而直接结束)

max-requests = 5000 
#为每个工作进程设置请求数的上限。当一个工作进程处理的请求数达到这个值,那么该工作进程就会被回收重用(重启)。你可以使用这个选项来默默地对抗内存泄漏

limit-as = 256 
#通过使用POSIX/UNIX的setrlimit()函数来限制每个uWSGI进程的虚拟内存使用数。这个配置会限制uWSGI的进程占用虚拟内存不超过256M。如果虚拟内存已经达到256M,并继续申请虚拟内存则会使程序报内存错误,本次的http请求将返回500错误。

harakiri = 60 
#一个请求花费的时间超过了这个harakiri超时时间,那么这个请求都会被丢弃,并且当前处理这个请求的工作进程会被回收再利用(即重启)
View Code

 

使用 ini file :

启动
uwsgi --ini ./uwsgi.inic

重启:
uwsgi --reload ./uwsgi.pid

 

 

django 项目部署

  • git clone 你的项目
  • cd 到项目中
  • 安装依赖包
  • 迁移数据库
    • python manage.py makemigrations
    • python manage.py migrate
    • PS: makemigtaions 容易失败请注意
  • 测试: python manage.py runserver 127.0.0.1:80
  • 直接访问127.0.0.1:80/admin  可直接进入admin 页面

 

联合部署:

nginx.conf

server {
        listen       80;
        server_name  127.0.0.1;
        location  / {
     include      uwsgi_params;
     uwsgi_pass   127.0.0.1:8888;   
        }
}

 

 

uwsgi.ini

[uwsgi]
socket = 127.0.0.1:8888
chdir = /root/blog/myproject/
wsgi-file = myproject/wsgi.py
pidfile=/root/bolg/uwsgi.pid
virtualenv=/root/.virtualenvs/blog
processes = 4
threads = 2

# 更多配置自行选择

Django  保证: python manage.py runserver  可以正常运行项目

 

启动:

# 启动
uwsgi --ini uwsgi.ini

# -d 后台运行
uwsgi -d --ini uwsgi.ini  

 

 

PS: 整个流程其实很简单

  1. 使用nginx 监听80(开放)端口
  2. 通过nginx 配置转发请求到uwsgi
  3. 使用uwsgi 启动django 项目, uwsgi接受到nginx的请求会直接转给django 处理

 

posted @ 2021-10-10 22:22  萤huo虫  阅读(202)  评论(0编辑  收藏  举报