四十五、docker之nginx手动部署前端项目

news2025/1/23 4:53:07

 nginx的作用:

一、静态文件服务器和反向代理django服务

django框架中的静态文件服务只在开发调试时提供服务,当以生产模式运行时需要将静态文件部署到静态文件服务器上。

1. 收集django项目中的静态文件

在配置文件中配置STATIC_ROOT

我们在我的项目中里base_setting的配置文件中添加一下。

STATIC_ROOT = BASE_DIR / 'static'

然后运行命令 python manage.py collectstatic,会将项目中所需要的静态文件收集到STATIC_ROOT目录下。

大家看我后端项目中是不是多了一个static这个文件夹~

u 运行完之后,我们就把 STATIC_ROOT = BASE_DIR / 'static' 这行代码删掉,然后git add . 等提交代码到gitee远程仓库上面去。然后在云服务器上面的当前项目里再git pll拉取下来,这个时候我们云服务器上面的当前项目里就有static这个文件夹啦。

在服务器上创建nginx 文件夹,将static目录拷贝到其中。

cp -r ./django_app/static ./nginx/

 

2. 配置静态文件服务器

Nginx 入门系列 - 测试派[链接] [链接] [链接] [链接] [链接]。欢迎来到testingpai.com! 。这是一个属于测试人员的小众社区,大家相互信任,以平等自由,热情奔放的价值观进行分享交流。希望大家能够找到与自己志同道合的伙伴,共同成长。http://testingpai.com/article/1652102129778下载 nginx:alpine

docker pull nginx:alpine

启动nginx容器  

docker run -it --name ck13_nginx --network ck13 nginx:alpine /bin/sh

查看配置文件存放路径: 

 把nginx的配置文件拷贝到当前目录下:

docker cp ck13_nginx:/etc/nginx/nginx.conf ./

我们查看一下配置文件的结构: 

我们看到最下面一行include /etc/nginx/conf.d/*.conf ,所以我们再把此目录下的conf文件复制过来看下是啥意思。

docker cp ck13_nginx:/etc/nginx/conf.d/ ./

一个server{} 代表一个服务

listen: 80          # 监听端口

server_name:localhost         # 可以写你的主机也可以写你的域名。一个端口配几个域名就需要几个server{}

location / : 定位的指令。 /代表根

        root /usr/share/nginx/html        # root是指文件的根目录

 修改端口为9400:

vi default.conf

修改完之后需要重新加载配置:

nginx -s reload

 试了一下 好像不行,那我们只能关掉nginx,再重新启动

排查问题发下我们上面还没映射端口,删掉容器 重新创建一个:(记得云服务器安全组去开放9400端口)

docker run -it --name ck13_nginx -p 9400:80 --network ck13 nginx:alpine /bin/sh

 我们查看上述说的 conf文件中 location 里    root /usr/share/nginx/html  # root是指文件的根目录

此时我们访问 www.hhxpython.com 返回/usr/share/nginx/html/index.html文件

 

 

我们在当前目录下创建一个aaa.txt

那此时 如果我们访问的路径是:

www.hhxpython.com/aaa.txt  返回/usr/share/nginx/html/aaa.txt

 这个时候我们去访问,就出来了。

其实这就是我们说的静态文件服务

那如果我们把配置文件改成这样子

 

 

修改云服务器上面刚才把nginx配置文件目录复制到云服务器里面的项目里面的nginx目录下配置文件

 

我们把原来创建的nginx干掉,重新创建一个。

docker ps | grep nginx

docker stop ck13_nginx

docker rm ck13_nginx

 

在重新生成容器之前,我们希望把上面我们刚刚创建的static目录和conf.d目录拷贝过去。

我们重新启动一个nginx容器

 

docker run -d --name ck13_nginx -p 9400:80 -v /ck13/manual/nginx/conf.d:/etc/nginx/conf.d -v /ck13/manual/nginx/static:/usr/share/nginx/html/static --network ck13 nginx:alpine

 进入这个容器发现default.conf已经映射过来了。

接下来我们再看static有没有映射进来, cd到/usr/share/nginx/html/。

是不是映射进来啦。

 好,那我们现在想在浏览器上随便访问下面这一张图片,我该怎么办呢?

 我们现在直接访问,为什么访问不了?因为我们现在还没有配。

 

 那现在我们想找到怎么办呢?输入以下网址:

http://123.60.113.190:9400/static/admin/img/icon-addlink.svg

加号+ 是不是出来啦。

怎么实现的呢?我们来讲解一下:

所以最后找的文件就是/usr/share/nginx/html/static/admin/img/icon-addlink.svg

有些人会问,那你怎么知道admin/img/icon-addlink.svg? 因为你后端django项目这个图片存放路径就是这个哇。

 

有些人还会问,那为啥location里面不用root呢?为什么改成alias?

因为你用root的话是指文件的根目录,不管匹配路径,都是把域名后面的路径和根目录拼接到一起。 但是你有/static/这个前缀哇。当然了你要用root写的话也可以改成这样子。

你可以这么访问:

地址:  域名:端口/static/admin/img/icon-addlink.svg

但是这样子的话,有一个不好的地方,是不是别人都能知道你的路径啦?

 

 3. 配置django后端服务

那这个后端服务是怎么配的呢?其实跟上面静态服务配置是一样的。

以前我们启动django后台服务是不是这么操作的?点击绿色三角形图标 ,那我们点击一下看看效果,然后打开这个地址 。

 

我们看到这些都是静态文件,访问接口也是直接返回一个html页面,这个是前后端不分离。

可以看到静态文件和接口访问的域名都是在同一个域名上面。

所以我们现在配置的时候,需要配置到同一个server{}里面。

 所以我们上面在server{}里面配置了静态文件的服务,我们还要在这个server{}里面配置django的服务。所以我们还要再加一个location。

第二个location里面,

try_files $uri @proxy_to_app 检查静态文件,如果不是的话就代理到应用。

下面应用做了哪些事情?设置代理头、请求的协议。这里我们可以去看一些文档。

我们看下gunicorn的官方文档。 

proxy_pass http://app_server;配置成proxy_pass http://ck13_django:8000;为啥可以这么写,之前说过了,可以直接配成容器名(ck13_django)进行解析。端口是8000。这样子我们就做到了反向代理。

 

 

在etc/nginx/conf.d/defaultconf新增配置之后,需要重新启动。

然后我们直接云服务器域名:端口,是不是能直接访问啦。

 那为啥我们之前云服务器域名:9321,是这个样子的呢。

那是因为你少了静态文件。

 

4. 部署前端项目

(1)打包前端项目

打包前端项目,会有一个dist文件夹。将dist文件夹拷贝到nginx容器中里的nginx文件夹中。

# 打包前端项目, 自动生成一个dist文件夹。
npm run build

 此时我们需要将dist文件夹也要映射到nginx容器里,所以我们需要停止和删除nginx容器,重新去创建一个nginx容器

# 1.停止nginx容器
docker stop ck13_nginx
# 2.删除nginx容器
docker rm ck13_nginx
# 3.重新创建一个容器(将dist文件夹映射到nginx容器里)
docker run -d --name ck13_nginx -p 9400:80 -v /ck13/manual/nginx/conf.d:/etc/nginx/conf.d -v /ck13/manual/nginx/static:/usr/share/nginx/html/static -v /ck13/manual/nginx/dist:/usr/share/nginx/html/dist --network ck13 nginx:alpine 

 

 

(2)配置nginx

1. 在default.conf(/ck13/manual/nginx/conf.d,也就是云服务器中的项目和nginx存放路径)中增加如下配置。我们需要再写一个server{}。

server {
    listen 81;  # 配置前端项目服务的监听端口
    server_name   localhost;  # 配置域名(没有一样的端口,所以地址可以不管他)
    root /usr/share/nginx/html/dist;            # 配置文件根路径

    location / {

       try_files $uri $uri/ @router; #需要指向下面的@router否则会出现vue的路由在nginx中刷新出现404
       index index.html;  # 如果是 斜杠/的话 就会直接返回index.html
    }

    #对应上面的@router,主要原因是路由的路径资源并不是一个真实的路径,所以无法找到具体的文件
    #因此需要rewrite到index.html中,然后交给路由在处理请求资源
    location @router {
             rewrite ^.*$ /index.html last;
    }
}

2. 然后我们又需要重新启动一下nginx容器。为什么呢?因为我们需要映射上面配置文件中的81端口。

# 1.停止nginx容器
docker stop ck13_nginx
# 2.删除nginx容器
docker rm ck13_nginx
# 3.重新创建一个容器(将dist文件夹映射到nginx容器里)
docker run -d --name ck13_nginx -p 9400:80 -p 9500:81 -v /ck13/manual/nginx/conf.d:/etc/nginx/conf.d -v /ck13/manual/nginx/static:/usr/share/nginx/html/static -v /ck13/manual/nginx/dist:/usr/share/nginx/html/dist --network ck13 nginx:alpine 

备注:如果是先重新启动nginx容器,后去修改配置文件的话(先走上述2再走1的操作的话),我们就需要重启nginx。

# 进入容器
docker exec -it ck13_nginx sh

# 重新加载
nginx -s reload

都配置完之后,我们去访问域名:9500,就跳转到了首页。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/413978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在低代码平台上构建ERP软件?

ERP软件是企业管理日常运营需求的关键组件。然而,对于许多企业,尤其是资源有限的企业来说,尝试构建和管理ERP平台可能要担负较高的成本的。幸运的是,低代码平台可以使这个过程变得容易得多。今天我们来解释如何在低代码平台上构建…

细粒度软件缺陷预测模型构建方法

在软件缺陷预测领域,粒度指的是缺陷库中每条样本的项目粒度.其中可以分为类粒度、文件粒度或者包粒度等。不同的开发语言有不同的层级的模块粒度,在软件缺陷预测领域,一般来说,在预测效果能够满足要求的情况下,粒度越小…

map容器(重要)

1、map容器简介 Map容器中所有的元素都会根据元素的键值自动实现排序。Map中所有的元素都是pair,pair的简介 同时拥有实值和键值,而前面的 set 只是拥有 键值,pair 中的 第一个元素是键值,而第二个值是 实值。Map 中是不允许有两…

Maven的进阶操作

系列文章目录 Maven进阶操作的学习 文章目录系列文章目录前言一、分模块开发与设计二、依赖管理1.依赖传递2.可选依赖3.排除依赖三、继承与聚合1.聚合2.继承四、属性1.属性2.版本管理五、多环境配置与应用1.多环境开发2.跳过测试六、私服1.私服简介2.私服仓库分类3.资源上传与…

IDEA的基本使用

IDEA的基本使用IDEA的基本使用1 IDEA概述2 IDEA的下载和安装2.1 下载2.2 安装3 IDEA中层级结构介绍3.1 结构分类3.2 结构介绍project(项目、工程)module(模块)package(包)class(类)3…

C#基础学习--委托

委托 什么是委托 可以认为委托是持有一个或多个方法的对象。 委托和类一样,是一种用户自定义的类型。但类表示的是数据和方法的集合,而委托则持有一个或多个方法,以及一系列预定操作。 可以通过一下擦欧总来使用委托: 可以把d…

度量,我们如何以终为始,以始为终?

你好,我是黄俊彬。 很多时候在研发过程中,我们都习惯性地用“拍脑袋”的方式来看待一个事情。例如这个代码写得不好、这个自动化测试覆盖不充分、版本的发布频率太差了等等。往往只知道哪里有问题,但是却不知如何去找出根因,真正…

14、MyBatis-Plus入门到进阶

1、Mybatis的问题 【简介】: 每个实体类对应一个实体类,对应一个mapper接口,对应一个mapper.xml文件,每个mapper接口都有重复的crud方法,每一个mapper.xml都有重复的crud的sql配置。 2、Mybatis-plus简介 1、官网 Mybatis-plusMybatis-plus 2、MyBatis是什么&a…

JS常用字符串方法

📝个人主页:爱吃炫迈 💌系列专栏:数据结构与算法 🧑‍💻座右铭:道阻且长,行则将至💗 文章目录移除字符串首尾空白符trim()trimStart()trimEnd()获取字符串指定位置的值ch…

记2023第十四届蓝桥杯感受

弱校ACM队员,曾获CB国二,CG国优第六。(我是fw) ------------------------------------------------------------------------分割线 2023.04.09 今年再次参加CG组,估计g了,盲猜一波省二前排,出…

基于BenchmarkSQL的Oracle数据库tpcc性能测试

基于BenchmarkSQL的Oracle数据库tpcc性能测试安装BenchmarkSQL及其依赖安装软件依赖编译BenchmarkSQLBenchmarkSQL props文件配置数据库用户配置BenchmarkSQL压测装载测试数据TPC-C压测(固定事务数量)TPC-C压测(固定时长)生成测试…

C++轻量级Web服务器TinyWebServer源码分析之http篇

文章目录http篇简介一、服务器接收http请求和http报文解析解析报文整体流程从状态机逻辑主状态机逻辑二、服务器响应请求报文http篇简介 http类这篇个人觉得是最难同时也是最繁琐的一篇,本篇在基础知识方面,包括epoll、HTTP报文格式、状态码和有限状态机…

Python 小型项目大全 71~75

七十一、声音模拟 原文:http://inventwithpython.com/bigbookpython/project71.html 类似于西蒙电子玩具,这款识记游戏使用第三方playsound模块,播放四种不同的声音,分别对应键盘上的A、S、D、F键。当你成功地重复游戏给你的图案时…

驱动保护 -- 通过PID保护指定进程

一、设计界面 1、添加一个编辑框输入要保护的进程PID,并添加两个按钮,一个保护进程,一个解除保护 2、右击编辑框,添加变量 二、驱动层代码实现 1、声明一个受保护的进程PID数组 static UINT32 受保护的进程PID[256] { 0 }; 2…

Python Web开发技巧II

Postman安置Cookie 对于大型项目而已,所携带的cookie往往都不止一个,而是一堆,甚至特别特别长,postman文档提供的cookie操作是全局的,但需要一个一个打(折磨),唯一的优点就是作用域…

tocbot生成文章目录

学习链接 github上的tocbot npmjs上的tocbot 效果图 使用步骤 1. 安装tocbot npm install tocbot --save2. vue组件中使用引入tocbot 只需要引入tocbot,然后调用tocbot.init(…),指定提取的文章内容所在的dom,以及要把生成的目录放到哪个…

4月第1周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩平台)发布!

飞瓜轻数发布2023年4月3日-4月9日飞瓜数据UP主排行榜(B站平台),通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况,为用户提供B站号综合价值的数据参考,根据UP主成长情况用户能够快速找到运营能力强的B站…

Flink (十一) --------- Table API 和 SQL

目录一、快速上手1. 需要引入的依赖2. 一个简单示例二、基本 API1. 程序架构2. 创建表环境3. 创建表4. 表的查询5. 输出表6. 表和流的转换三、流处理中的表1. 动态表和持续查询2. 将流转换成动态表3. 用 SQL 持续查询3. 将动态表转换为流四、时间属性和窗口1. 事件时间2. 处理时…

PDF怎么转换成word格式?这三个方法转换效率很高

在日常办公生活中,我们经常需要对文件进行格式转换,尤其是将PDF文件转换为可编辑的Word文件。虽然在Office软件中将Word文件转换为PDF很容易,但是将PDF文件转换为Word文件却需要一些技巧。在保证安全性能的前提下,如何将PDF文件转…

回溯算法编程题集合(leetcode)

给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。 示例 1: 输入: nums [4, 3, 2, 3, 5, 2, 1], k 4 输出: True 说明: 有可能将其分成 4 个子集&#x…