首页 > 系统相关 >【Mac实践Docker】使用Nginx部署Web应用

【Mac实践Docker】使用Nginx部署Web应用

时间:2025-01-09 21:01:20浏览次数:3  
标签:Web 配置文件 Nginx nginx Mac conf Docker 目录

Nginx部署Web应用

座右铭:悲观者正确,乐观者前行
一位尝试使用 ai+费曼学习法 努力进步的测试新人,路上永远都在hello world!

在Mac本机上实践Docker、Nginx和Apache的部署与配置,可以按照以下步骤进行:

学习资料参考

干货 | Docker 还可以搭建Web服务器nginx ?这么宝藏的吗?

快速上手!使用Docker和Nginx部署Web服务的完美指南_docker nginx部署web应用-CSDN博客

Docker 安装 Nginx | 菜鸟教程

mac环境下使用docker安装nginx - mickey007 - 博客园 【配置文件踩坑-解决指南】

一、安装Docker

下载Docker Desktop:

- 访问[Docker官网](https://www.docker.com/products/docker-desktop)下载Docker Desktop for Mac。
- 下载并打开Docker Desktop安装包,按照提示完成安装。

启动Docker:

- 打开Docker Desktop应用。
- 在菜单栏上,点击Docker图标并选择"Preferences"来配置Docker设置(如需要)。

验证安装:

- 打开终端,运行`docker --version`命令检查Docker版本。
- 运行`docker run hello-world`命令以确保Docker可以正常工作。
macOS

在macOS上,Docker实际上是运行在一个虚拟机中的。镜像文件存储在这个虚拟机的文件系统中,通常位于以下路径:

  • /Users/<your-username>/Library/Containers/com.docker.docker/Data/vms/0/docker.qcow2:这是Docker虚拟机的磁盘文件,镜像数据存储在这个虚拟磁盘中.

比如我的地址:

/Users/zhaohailin/Library/Containers/com.docker.docker/Data/vms/0/data

监控Docker存储路径的使用情况可以通过多种方法和工具来实现。以下是一些常用的方法和工具:

命令行工具
  • 使用**** **df** **du** ****命令
    • df -h:查看磁盘使用情况,包括Docker存储路径所在的分区。
    • du -sh /path/to/docker:查看Docker存储路径的总大小。
    • du -sh /path/to/docker/*:查看Docker存储路径下各个子目录的大小。
Docker命令
  • 使用**** **docker system df**
    • 这个命令会显示Docker对象的空间使用情况,包括镜像、容器、卷和网络

二、使用Nginx部署Web应用

Docker 安装 Nginx | 菜鸟教程

拉取 Nginx 镜像

直接拉取官方的 Nginx 镜像,获取最新版本:【官网公共库

docker pull nginx

创建挂载目录

在宿主机上创建用于挂载的目录,分别用于存放 Nginx 日志文件、配置文件和 Web 项目文件:

mkdir ~/nginx_conf
mkdir ~/nginx_logs
mkdir ~/nginx_web

在 macOS 的命令行中,如果你需要快速创建多层目录结构,可以使用 mkdir 命令结合 -p 选项。-p 选项允许你创建不存在的父目录,以便创建目标目录。以下是一个示例:

假设你想创建以下目录结构:

~/nginx_conf
~/nginx_logs
~/nginx_web

你可以使用以下命令:

mkdir -p /root/nginx_conf /root/nginx_logs /root/nginx_web

这条命令会创建 /root 目录(如果它还不存在),然后在其中分别创建 nginx_confnginx_logsnginx_web 目录。

请注意,/root 在 macOS 中是一个特殊目录,通常用于存储系统文件。如果你只是想在用户目录下创建这些子目录,可以使用相对路径或指定你的用户目录路径。例如:

mkdir -p ~/nginx_conf ~/nginx_logs ~/nginx_web

这里的 ~ 符号代表当前用户的主目录,通常是 /Users/your_username。这样,目录将被创建在你的用户目录下。

为这些目录授权,防止 Nginx 在操作文件夹时权限不足:

chmod 777 ~/nginx_conf
chmod 777 ~/nginx_logs
chmod 777 ~/nginx_web

创建容器并挂载目录

找资料学习过程中,不是很理解创建容器并挂载目录,为什么先创建启动容器,复制初始配置文件?

在使用 Docker 部署 Nginx 时,先创建并启动容器以复制初始配置文件的步骤,主要是为了确保宿主机上的配置文件目录能够正确地包含 Nginx 的配置文件。以下是这个步骤的详细解释和原因:

为什么需要复制初始配置文件?

  1. 避免配置文件丢失
    • 当你首次启动一个 Nginx 容器时,容器内部会包含一套默认的 Nginx 配置文件。这些默认配置文件位于容器的 /etc/nginx 目录中。
    • 如果你直接将一个空的宿主机目录挂载到容器的 /etc/nginx 目录,那么容器内部的默认配置文件会被覆盖(即同步为空目录),导致 Nginx 无法正常启动,因为 Nginx 需要有效的配置文件来运行。
    • 通过先启动容器并复制出这些默认配置文件,你可以确保宿主机的挂载目录中包含了完整的 Nginx 配置文件,从而避免了配置文件丢失的问题。
  2. 方便自定义配置
    • 复制出的初始配置文件可以作为自定义配置的基础。你可以根据自己的需求修改这些配置文件,例如调整监听端口、设置服务器名称、配置 SSL 证书等。
    • 由于这些配置文件已经存在于宿主机上,你可以使用任何文本编辑器方便地进行修改,而不需要进入容器内部进行编辑。

具体步骤解释

创建并启动容器:
docker run -itd --name nginx -p 8081:80 nginx

这一步创建并启动了一个名为 nginx 的容器,使用默认的 Nginx 配置文件运行。

复制配置文件到宿主机:
docker cp nginx:/etc/nginx ~/nginx_conf

这一步将容器内部的 /etc/nginx 目录复制到宿主机的 /root/nginx_conf 目录中。这样,宿主机的 /root/nginx_conf 目录就包含了完整的 Nginx 配置文件。

删除容器并重新启动:
docker rm -f nginx

删除之前创建的容器,因为它的任务已经完成(即复制配置文件)。

重新启动容器并挂载目录:

这一步重新创建并启动容器,同时将宿主机的配置文件目录 ~/nginx_conf/nginx 挂载到容器的 /etc/nginx 目录。由于宿主机目录中已经包含了完整的配置文件,Nginx 可以正常读取这些配置文件并启动。

通过这种方式,你可以确保 Nginx 容器在启动时能够使用正确的配置文件,同时方便地进行自定义配置的修改和管理.

docker run 
-itd --name nginx -p 8081:80 
-v ${PWD}/nginx_web:/usr/share/nginx/html 
-v ${PWD}/nginx_conf/nginx:/etc/nginx 
-v ${PWD}/nginx_logs:/var/log/nginx
 nginx

注意检查 -v 参数中挂载目录的路径是否有误.

- <font style="color:rgb(51, 51, 51);">参数说明:</font>
  • –name my-nginx:容器名称。
  • -p 8080:80: 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口。
  • -d nginx: 设置容器在在后台一直运行。
  • -v ~/nginx/conf:/etc/nginx/conf.d
  • -v ~/nginx/html:/usr/share/nginx/html
  • -v ${PWD}/html:/usr/share/nginx/html:
  • -v参数代表挂载一个目录到容器内,前面的目录 P W D / h t m l 代表宿主机的目录,后面的目录 / u s r / s h a r e / n g i n x / h t m l 代表容器内的目录。它们中间用分号隔开。其中 {PWD}/html代表宿主机的目录,后面的目录/usr/share/nginx/html代表容器内的目录。它们中间用分号隔开。其中 PWD/html代表宿主机的目录,后面的目录/usr/share/nginx/html代表容器内的目录。它们中间用分号隔开。其中{PWD}是一个系统变量,代表当前所在的目录。然后我们在访问宿主机的IP和端口查看一下状态。

自定义修改配置文件过程

[注意踩坑]mac环境下使用docker安装nginx - mickey007 - 博客园
一般情况下docker启动时进行配置,只要把配置文件的目录挂载出来就可以,但是nginx却是先加载一个主配置文件nginx.conf,在nginx.conf里再加载conf.d目录下的子配置文件(一般最少一个default.conf文件)。

docker拉取下来的nginx配置文件路径

日志文件位置:/var/log/nginx
配置文件位置: /etc/nginx
资源存放的位置: /usr/share/nginx/html

对应已经到主机挂载的目录

-v ${PWD}/nginx_logs:/var/log/nginx
-v ${PWD}/nginx_conf/nginx:/etc/nginx
-v ${PWD}/nginx_web:/usr/share/nginx/html 
方法一:只修改主配置文件nginx.conf

方法二:进入挂载的配置文件夹 ~/nginx_conf/conf.d 下,修改 <font style="color:#DF2A3F;">default.conf</font> 文件

方法三:新建一个以 .conf 为后缀的配置文件(例如 my-web-app.conf).

到挂载的配置文件夹/nginx_conf/conf.d下,修改default.conf,或者新建conf文件,在这个目录下,conf后缀的文件都会被读取为配置文件(因为/nginx_conf/nginx.conf中配置了include)

server{
    #监听的端口号
    listen 80;
    #要监听的服务器地址,域名也可行,根据实际情况修改
    server_name 154.111.111.111;
    client_max_body_size 20m;
    access_log /var/log/nginx/host.access.log main;
     #开启gzip功能(这段可选,如果web界面资源有压缩格式文件可开启)
  	gzip on; 
  	#开启gzip静态压缩功能
  	gzip_static on; 
  	#gzip缓存大小
  	gzip_buffers 4 16k;
  	#gzip http版本
  	gzip_http_version 1.1;
  	#gzip 压缩级别 1-10 r
  	gzip_comp_level 5;
  	#gzip 压缩类型
  	gzip_types text/plain application/javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
  	#配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持
  	gzip_disable   "MSIE [1-6]\.";
    #前端,根据实际情况修改
	  location / {
		# 项目地址,这里指的是nginx容器的地址
        root   /usr/share/nginx/html;
		try_files $uri $uri/ /index.html?s=$uri&$args;
		# 默认访问的资源
        index index.html index.htm index.php;
        
    }
    
    # 错误网页配置
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
(附加)nginx location配置详细说明

语法规则: location [=||*|^~] /uri/ { … }

● = 开头表示精确匹配
● ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
● ~ 开头表示区分大小写的正则匹配
● ~* 开头表示不区分大小写的正则匹配
● !和!*分别为区分大小写不匹配及不区分大小写不匹配 的正则
● / 通用匹配,任何请求都会匹配到。
多个location配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考):

首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

例子,有如下匹配规则:
location = / {
#规则A
}
location = /login {
#规则B
}
location ^~ /static/ {
#规则C
}
location ~ .(gif|jpg|png|js|css)$ {
#规则D
}
location ~* .png$ {
#规则E
}
location !~ .xhtml$ {
#规则F
}
location !~* .xhtml$ {
#规则G
}
location / {
#规则H
}
那么产生的效果如下:
访问根目录/, 比如http://localhost/ 将匹配规则A
访问 http://localhost/login 将匹配规则B,http://localhost/register 则匹配规则H
访问 http://localhost/static/a.html 将匹配规则C
访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用, 而 http://localhost/static/c.png 则优先匹配到 规则C
访问 http://localhost/a.PNG 则匹配规则E, 而不会匹配规则D,因为规则E不区分大小写。
访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。
访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。
所以实际使用中,个人觉得至少有三个匹配规则定义`

nginx的其他配置信息介绍

下面是可以用作判断的全局变量

例:http://localhost:88/test1/test2/test.php

解释

$host:localhost
$server_port:88
$request_uri:http://localhost:88/test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:D:\nginx/html
$request_filename:D:\nginx/html/test1/test2/test.php

Redirect语法

解释

server {
    listen 80;
    server_name start.igrow.cn;
    index index.html index.php;
    root html;
    if ($http_host !~ "^star\.igrow\.cn$" {
        rewrite ^(.*) http://star.igrow.cn$1 redirect;
    }
}

防盗链

解释

location ~* \.(gif|jpg|swf)$ {
    valid_referers none blocked start.igrow.cn sta.igrow.cn;
    if ($invalid_referer) {
        rewrite ^/ http://$host/logo.png;
    }
}

根据文件类型设置过期时间

解释

location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
    if (-f $request_filename) {
        expires 1h;
        break;
    }
}

禁止访问某个目录

解释

location ~* \.(txt|doc)${
root /data/www/wwwroot/linuxtone/test;
deny all;
}

附:一些可用的全局变量

解释

$args
$content_length
$content_type
$document_root
$document_uri
$host
$http_user_agent
$http_cookie
$limit_rate
$request_body_file
$request_method
$remote_addr
$remote_port
$remote_user
$request_filename
$request_uri
$query

如何检查docker挂载信息是否正确

启动成功后我们再通过命令来看下docker启动情况和挂载情况

docker ps

这里可以看到8089端口已经映射成功了,继续执行命令查看挂载情况

docker nginx | grep Mounts -A 60

上传 Web 文件到挂载目录中

将你的 Web 项目文件上传到 ~/nginx_web 这个目录中,例如可以使用 scp 命令从其他机器上传文件,或者直接在宿主机上将文件复制到该目录.

我使用allure,生成测试用例报告在 挂载目录中

allure generate ./allure-results  -o --clean /Users/zhaohailin/nginx_web

这是我生成的报告,能看到目录下的index文件

重启 Nginx 容器

重启 Nginx 容器,使配置文件的更改生效:

docker restart nginx

访问网页测试

通过浏览器访问 http://<宿主机IP>http://<server_name> 来查看 Web 应用是否正常运行。如果遇到问题,可以查看 Nginx 容器的日志来排查错误:

docker logs nginx

通过以上步骤,你就可以使用 Docker 和 Nginx 成功部署 Web 应用了.如果在保持容器启动,就可以在测试工作中,把测试报告给开发大哥看了。

四、配置与优化

  • 配置文件:根据需要编辑本地的Nginx配置文件,然后重新启动相应的容器以应用更改。
  • 性能优化:参考之前的Nginx性能优化建议,对Nginx进行配置优化。

域名配置

证书配置

五、注意事项

  • 端口冲突:确保选择的端口(如8080、8081)在本地没有被其他应用占用。
  • 文件权限:确保Docker容器有权限访问挂载的本地目录和文件。
  • 日志查看:可以使用docker logs my-nginxdocker logs my-apache命令查看容器的日志输出,帮助调试问题。
    通过以上步骤,你可以在Mac本机上实践Docker环境下的Nginx部署与配置。这样可以方便地进行学习和测试,而无需依赖远程服务器或虚拟机。

标签:Web,配置文件,Nginx,nginx,Mac,conf,Docker,目录
From: https://blog.csdn.net/2404_88943810/article/details/145017769

相关文章

  • Nginx:Stream模块
    什么是Stream模块?Stream模块是Nginx的一个核心模块,专为处理非HTTP协议的流量(TCP和UDP流量)而设计。它可以用来负载均衡和代理TCP或UDP连接,适用于多种应用场景,如:数据库集群(MySQL、PostgreSQL等)邮件服务器(SMTP、IMAP、POP3)游戏服务器VoIP服务自定义协......
  • 基于 WEB 开发的高校学籍管理系统设计与实现
    标题:基于WEB开发的高校学籍管理系统设计与实现内容:1.摘要摘要:随着信息技术的不断发展,高校学籍管理系统的信息化建设已成为必然趋势。本文以高校学籍管理系统为研究对象,探讨了基于WEB开发的高校学籍管理系统的设计与实现。通过对系统的需求分析,设计了系统的总体架构和功......
  • 一次web服务失去响应记录
    现象:线上服务无法对接口进行响应,接口全部超时,但是Java进程还是在运行中,jvmGC日志正常。jstack命令查看线程情况: 大量线程处于BLOCKED状态,等待锁0x00000000cbc9b9c8的释放;该锁被持有的线程:scheduling-1,是一个异步线程。 通过观察上图,发现锁在getAccessToken方法中被获取,该......
  • nginx中proxy_pass的斜杠详细说明
    一、proxy_pass后面有/location/api/{proxy_passhttp://localhost:8080/;}location/api/{proxy_passhttp://localhost:8080/xx/;}比如请求http://localhost/api/123.html经过处理后实际请求地址是http://loca......
  • webapi 集成 log4net 写入 ElasticSearch
    log4net.config<log4net><appendername="RollingLogFileAppender"type="log4net.Appender.RollingFileAppender"><!--定义文件存放位置--><filevalue="log/"/><appendToFilevalue="true"......
  • Nginx在选择处理请求的location时
    Nginx在选择处理请求的location时,遵循以下顺序和优先级规则:‌精确匹配(=)‌:如果请求的URI与location块中指定的URI完全匹配(区分大小写),则使用该location块处理请求。这是最高优先级的匹配方式。‌前缀匹配(无修饰符)‌:如果请求的URI以location块中指定的URI开头,则使用该location......
  • 如何在nginx上设置html/json不缓存
    一、简介前端项目发布以后,经常会遇到访问不到最新的版本,这主要是由于我们项目的入口文件index.html被浏览器或者代理缓存了,没有实时拉取到最新文件。本文将介绍一下在nginx上如何设置html文件不缓存。二、Cache-Control介绍2.1服务器可以在响应中使用的标准Cache-Control指......
  • VUE +WebSocket+speak-tt 实现在浏览器右下角实时给商家推送订单消息
    先看效果  1、WebSocket服务建立 1.1引入包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>1.2新建配置类packagecom......
  • 智能监控:揭开Web元素动态管理的奥秘
    一、Web元素动态监控:网页背后的“智能眼”        在互联网的世界里,Web元素动态监控犹如一双隐藏在网页背后的“智能眼”。它时刻监控网页中的各类元素,无论是新闻资讯网站的文字更新、图片切换,还是电商平台商品详情页的价格波动、库存变化,甚至社交平台上的新消息提示,......
  • 基于 Admission Webhook 实现 Pod DNSConfig 自动注入
    本文主要分享如何使用基于AdmissionWebhook实现自动修改PodDNSConfig,使其优先使用NodeLocalDNS。1.背景上一篇部署好NodeLocalDNSCache,但是还差了很重要的一步,配置pod使用NodeLocalDNSCache作为优先的DNS服务器。有以下几种方式:方式一:修改kubelet中的dn......