Nginx部署Web应用
座右铭:悲观者正确,乐观者前行
一位尝试使用 ai+费曼学习法 努力进步的测试新人,路上永远都在hello world!在Mac本机上实践Docker、Nginx和Apache的部署与配置,可以按照以下步骤进行:
学习资料参考
干货 | Docker 还可以搭建Web服务器nginx ?这么宝藏的吗?
快速上手!使用Docker和Nginx部署Web服务的完美指南_docker nginx部署web应用-CSDN博客
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应用
拉取 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_conf
、nginx_logs
和 nginx_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 的配置文件。以下是这个步骤的详细解释和原因:
为什么需要复制初始配置文件?
- 避免配置文件丢失:
- 当你首次启动一个 Nginx 容器时,容器内部会包含一套默认的 Nginx 配置文件。这些默认配置文件位于容器的
/etc/nginx
目录中。- 如果你直接将一个空的宿主机目录挂载到容器的
/etc/nginx
目录,那么容器内部的默认配置文件会被覆盖(即同步为空目录),导致 Nginx 无法正常启动,因为 Nginx 需要有效的配置文件来运行。- 通过先启动容器并复制出这些默认配置文件,你可以确保宿主机的挂载目录中包含了完整的 Nginx 配置文件,从而避免了配置文件丢失的问题。
- 方便自定义配置:
- 复制出的初始配置文件可以作为自定义配置的基础。你可以根据自己的需求修改这些配置文件,例如调整监听端口、设置服务器名称、配置 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-nginx
或docker logs my-apache
命令查看容器的日志输出,帮助调试问题。
通过以上步骤,你可以在Mac本机上实践Docker环境下的Nginx部署与配置。这样可以方便地进行学习和测试,而无需依赖远程服务器或虚拟机。