Nginx学习(在 Docker 中使用 Nginx)
1. 安装Nginx
使用 docker pull nginx
下载最新的 Nginx Docker 镜像。
下载完毕后,使用 docker run -d -p 80:80 --name nginx nginx
,即可启动 Nginx 容器。其中,-p 80:80
表示将容器的 80 端口映射到 主机的 80 端口;--name nginx
表示将容器命名为“nginx”。
这时候,访问主机 ip,可以看到 Nginx 的欢迎页,说明已经运行成功。
2. Nginx 配置
Nginx 的默认配置文件是 /etc/nginx/nginx.conf
。
使用 docker exec -it nginx /bin/sh
命令,进入 nginx 容器的命令行,然后进入 /etc/nginx
目录,查看 nginx.conf
文件。
以下是该文件内容及注释:
# 设置运行 nginx 的用户为 nginx 用户
user nginx;# 根据系统资源情况自动设置 worker 进程数量
worker_processes auto;# 指定错误日志的位置和日志级别为 notice
error_log /var/log/nginx/error.log notice;# 指定 nginx 的主进程 ID 存储位置
pid /var/run/nginx.pid;# events 块定义了事件模型和连接数配置
events {# 每个 worker 进程的最大连接数worker_connections 1024;
}# http 块是 nginx 配置的主要部分,包含了 http 相关的配置
http {# 引入 mime.types 文件,该文件定义了 MIME 类型映射include /etc/nginx/mime.types;# 设置默认 MIME 类型为 application/octet-streamdefault_type application/octet-stream;# 设置日志格式 main,记录客户端访问日志log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';# 指定访问日志的存储位置和使用的日志格式access_log /var/log/nginx/access.log main;# 开启 sendfile 功能,提高文件传输性能sendfile on;# 如果客户端连接非常快速,则可能启用 tcp_nopush,否则请注释掉此行# tcp_nopush on;# 客户端与服务器之间的连接保持时间,超过这个时间将会自动关闭连接keepalive_timeout 65;# 如果需要开启 gzip 压缩功能,可以去掉此行的注释#gzip on;# 引入 /etc/nginx/conf.d/ 目录下的所有 .conf 配置文件include /etc/nginx/conf.d/*.conf;
}
根据上述配置,可以在 /etc/nginx/conf.d
文件夹下,找到所有的 nginx 配置文件。默认情况下,该文件夹中只有一个 default.conf
文件,查看之:
# cat default.conf
# 定义一个HTTP服务器块,监听80端口,并且同时监听IPv4和IPv6地址的80端口
server {listen 80;listen [::]:80;# 服务器名为localhost,即请求的域名为localhost时,会使用该server块的配置server_name localhost;# 注释掉以下access_log配置,表示不记录访问日志#access_log /var/log/nginx/host.access.log main;# 配置根目录和默认的索引文件location / {root /usr/share/nginx/html;index index.html index.htm;}# 注释掉以下error_page配置,表示不自定义错误页#error_page 404 /404.html;# 配置5xx错误码的错误页error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}# 注释掉以下配置,表示不使用代理将PHP脚本传递给Apache服务器##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}# 配置FastCGI服务器,将PHP脚本传递给监听在127.0.0.1:9000的FastCGI服务器##location ~ \.php$ {# root html;# fastcgi_pass 127.0.0.1:9000;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}# 注释掉以下配置,表示禁止访问.htaccess文件##location ~ /\.ht {# deny all;#}
}
可以看到,这里配置了 http 的监听端口,和一些跳转规则。
2.1 http 块配置
Nginx 的配置分为多个块,其中 http 块是其中的主要部分,包含了 http 的相关配置。
http 块主要可以设置以下参数:
- include:可以引入其他配置文件。例如,
include /etc/nginx/mime.types;
表示引入了/etc/nginx/mime.types
文件,其中包含了支持的文件类型。 - default_type: 指定默认的Content-Type,当请求的资源没有明确指定Content-Type时,将使用该默认类型。
- log_format: 定义日志格式,可以自定义日志输出的格式,可以使用预定义的变量来包含特定信息,例如
$remote_addr
表示客户端IP地址,$request
表示请求内容,等等。 - access_log: 配置访问日志的路径和格式。可以指定日志输出到文件,也可以将日志重定向到标准输出流。
- error_log: 配置错误日志的路径和日志级别。可以指定日志输出到文件,也可以将日志重定向到标准错误流。
- sendfile: 是否开启sendfile指令。当该指令开启时,nginx会尝试使用sendfile系统调用来直接传输文件,提高文件传输效率。
- tcp_nopush: 开启后,允许发送TCP_NODELAY选项来减少网络传输延迟。
- keepalive_timeout: 配置HTTP keep-alive连接的超时时间。如果一个客户端在这个时间内没有发送新的请求,连接将被关闭。
- gzip: 配置gzip压缩。开启后,nginx会对响应的内容进行gzip压缩,减少传输数据量,提高性能。
- server: 用于配置一个虚拟主机(Server Block),包含了服务器的监听端口、域名、请求处理等配置。一个http块可以包含多个server块,用于配置多个虚拟主机。
- location: 用于配置请求处理的规则。location块可以根据URL路径或正则表达式来匹配请求,并指定相应的处理逻辑,例如反向代理、重定向、文件处理等。
- upstream: 配置代理服务器的集群。upstream指令用于定义一组后端服务器,并可以指定负载均衡算法来分配请求。
2.2 http - server 块配置
在 Nginx 的 http 配置中,可以包含多个 server 配置。如下:
http {# server块1server {# 该server块的配置}# server块2server {# 该server块的配置}
}
其中,server 块的主要参数包含:
- listen: 配置服务器监听的端口号和IP地址。可以通过listen指令指定多个端口号和IP地址,比如listen 80;表示监听80端口,默认监听所有可用IP地址。
- server_name: 配置服务器的域名或IP地址。可以配置多个域名,用空格隔开。当请求的Host头部与server_name中的某个域名匹配时,该server块将会处理该请求。
- add_header: 用于设置响应头信息。
- location: 用于配置请求处理的规则。location块可以根据URL路径或正则表达式来匹配请求,并指定相应的处理逻辑,例如反向代理、重定向、文件处理等。
- access_log和error_log: 配置访问日志和错误日志的路径和格式。
- try_files: 配置文件搜索顺序。当请求的文件不存在时,可以通过try_files指令指定多个备用文件,服务器会按照指定的顺序查找并返回第一个存在的文件。
- gzip: 配置gzip压缩。开启后,nginx会对响应的内容进行gzip压缩,减少传输数据量,提高性能。
例如,上述提到过的 default.conf
文件,主要内容如下:
# 定义一个HTTP服务器块,监听80端口,并且同时监听IPv4和IPv6地址的80端口
server {listen 80;listen [::]:80;server_name localhost;# 注释掉以下access_log配置,表示不记录访问日志#access_log /var/log/nginx/host.access.log main;# 配置根目录和默认的索引文件location / {root /usr/share/nginx/html;index index.html index.htm;}# 注释掉以下error_page配置,表示不自定义错误页#error_page 404 /404.html;# 配置5xx错误码的错误页error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}
}
该配置定义了一个名为 localhost
的 server,监听本机 80 端口。
2.3 http - server - location 配置
location
配置是Nginx中用来匹配请求URI(Uniform Resource Identifier)并指定如何处理请求的指令。在Nginx配置文件中,location 块用于根据不同的 URI 路径来定义不同的行为,如代理请求、重定向、设置缓存等。
配置类型
location 块有不同的匹配类型:
- 普通匹配:使用前缀匹配或完全匹配来匹配请求URI。
例如location /example
:匹配以/example开头的URI路径。 =
:精准匹配。
例如location = /path/to/resource
,只有当请求的URI完全等于/path/to/resource
时,该 location 块才会生效。~
:正则表达式匹配。
例如location ~ ^/images/.*\.jpg$
:匹配以/images/
开头且以.jpg
结尾的URI路径。~*
:不区分大小写的正则表达式匹配。
例如location ~* \.jpg$
:会匹配以.jpg
结尾的URI,不区分大小写。^~
:优先匹配。
例如location ^~ /static/
:匹配以/static/
开头的URI路径,该匹配的优先级高于其他匹配。
配置块参数
location 配置块中可以配置一些参数,常见的如下:
- root:指定location块的根目录,用于确定请求资源的实际文件路径。例如:
root /usr/share/nginx/html
; - alias:类似于root,但是可以将URI路径替换为指定的路径,不包括location路径。例如:
alias /path/to/files
; - try_files:定义尝试查找文件的顺序,用于处理静态文件请求。例如:
try_files $uri $uri/ /index.html
; - proxy_pass:将请求代理到指定的后端服务。例如:
proxy_pass http://backend_server
; - rewrite:重写URI,可用于重定向或修改请求URI。例如:
rewrite ^/oldpath/(.*)$ /newpath/$1 permanent
; - auth_basic:启用基本的HTTP身份验证。例如:
auth_basic "Restricted Area"
; - if:条件判断,根据条件执行不同的指令。注意if指令有一些限制和陷阱,建议谨慎使用。
- limit_rate:限制请求速率,用于限制客户端访问速度。例如:
limit_rate 100k
; - expires:设置缓存过期时间,用于控制静态资源的缓存时间。例如:
expires 1d
; - add_header:添加自定义HTTP响应头。例如:
add_header X-MyHeader "My Custom Header"
; - proxy_set_header:设置代理请求头。例如:
proxy_set_header X-Real-IP $remote_addr
; - proxy_redirect:修改代理请求的重定向头。例如:
proxy_redirect off
; - proxy_pass_header:设置代理响应的头信息。例如:
proxy_pass_header Server
;
下面是一个简单的Nginx配置示例:
# 定义一个HTTP服务器块,监听80端口,并且设置主机名为example.com
server {listen 80; # 监听80端口server_name example.com; # 设置主机名为example.com# 处理请求根路径的配置location / {root /usr/share/nginx/html; # 设置根目录为/usr/share/nginx/htmlindex index.html; # 设置默认的索引文件为index.html}# 处理以/images/开头的请求路径location /images/ {alias /var/www/images/; # 将URI路径替换为/var/www/images/}# 处理以/api/开头且以.json结尾的请求路径location ~ ^/api/.*\.json$ {proxy_pass http://backend_server; # 将请求代理到后端服务器backend_server}
}
2.4 http - server - upstream 配置
upstream
块用于定义一组后端服务器,用于负载均衡或代理请求。
例如:
upstream my_backend {server backend_server1:8000; # 定义第一个后端服务器,格式为 server [IP或域名]:端口server backend_server2:8000; # 定义第二个后端服务器,可以配置多个服务器server unix:/tmp/backend.sock; # 也可以使用Unix Socket代替IP和端口weight=1; # 设置服务器的权重,默认为1,负载均衡时会根据权重分配请求max_fails=3; # 设置请求失败次数的阈值,默认为1,超过阈值后服务器被认为不可用fail_timeout=10s; # 设置服务器的失败超时时间,默认为10秒backup; # 设置服务器为备份服务器,在其他服务器不可用时使用down; # 设置服务器为暂时不可用状态,不会分配请求给该服务器
}
在 upstream 块中,可以配置多个后端服务器,Nginx 会根据负载均衡算法将请求分发给这些后端服务器。
需要注意的是,如果是在 Docker 中运行的 Nginx,则这里的 server 字段可以配置为 容器名称:端口号
,如 ixiaoniu:8080
。
在定义了 upstream 块后,便可以在 location 块中通过 proxy_pass 指令将请求代理到定义的 upstream 块中的后端服务器:
location / {proxy_pass http://my_backend; # 将请求代理到名为 my_backend 的 upstream 块中定义的后端服务器}
3. 一些常用命令
docker exec -it nginx bash
:进入在 Docker 中运行的 Nginx 容器命令行。nginx -v
:显示 Nginx 版本。nginx -t
:测试 Nginx 配置文件是否有错误。nginx -s reload
:重新加载配置。
相关文章:

Nginx学习(在 Docker 中使用 Nginx)
1. 安装Nginx 使用 docker pull nginx 下载最新的 Nginx Docker 镜像。 下载完毕后,使用 docker run -d -p 80:80 --name nginx nginx,即可启动 Nginx 容器。其中,-p 80:80 表示将容器的 80 端口映射到 主机的 80 端口;--name ng…...

【Java】集合(一)单列集合List
1.集合 可以动态保存任意多个对象,并提供了一系列的操作对象的方法:add、remove、set、get等。 2.集合框架体系 分为两大类: 单列集合和双列集合 3.List接口基本介绍 List接口是Collection接口的子接口 List集合类中元素有序࿰…...

实战 | 基于卷积神经网络的蘑菇识别微信小程序
一个不知名大学生,江湖人称菜狗 original author: Jacky Li Email : 3435673055qq.com Time of completion:2023.11.13 Last edited: 2023.11.13 导读:其实没啥难的,主要是随手搞了就发出来把,太久没有水过帖子了&…...

如何选择共享wifi项目服务商,需要注意哪些?
在移动互联网时代,无线网络已经成为人们生活中不可或缺的一部分。随着5G时代的到来,共享WiFi项目成为了市场上备受关注的焦点。在众多共享WiFi公司中,如何选择共享wifi项目服务商合作,今天我们就来盘点下哪些公司可靠!…...
ubuntu20.04 MYNTEYE S 相机运行与标定记录
ubuntu20.04 MYNTEYE S 相机运行与标定记录 环境 ubuntu20.04 opencv3.3.1 硬件 mynteye S1030 OpenCV 3.4.3 安装 Jetson Nano小觅相机(MYNT EYE S)开发调试指南 mkdir -p ~/tools/opencv cd ~/tools/opencvgit clone https://github.com/opencv/opencv.git cd opencv/…...

有效降低数据库存储成本方案与实践 | 京东云技术团队
背景 随着平台的不断壮大,业务的不断发展,后端系统的数据量、存储所使用的硬件成本也逐年递增。从发展的眼光看,业务与系统要想健康的发展,成本增加的问题必须重视起来。目前业界普遍认同开源节流大方向,很多企业部门…...

分布式数据库Schema 变更 in F1 TiDB
分布式数据库Schema 变更 in F1 & TiDB 【转载】TiDB 源码阅读系列文章(十七)DDL 源码解析 | PingCAP 上述文章主要叙述了从DDL语句发起到执行的过程,简单介绍了弄一套相同的模式来后台处理数据回填,从而提高DDL的并发度的一…...
图形库篇 | EasyX | 图像处理
图形库篇 | EasyX | 图像处理 图像类型 IMAGE表示图像,用于定义一个图像变量,与导入的图片资源一一对应。 IMAGE img;加载与绘制图像 函数功能函数加载图像void loadimage(IMAGE* pDstImg,LPCTSTR pImgFile,int nwidth = 0,int nHeight = 0,bool bResize = false)绘制图像v…...
AWTK UI 自动化测试工具发布
AWTK UI 自动化 提供了兼容 Appium 的接口,可以使用 Appium 的工具来进行 UI 自动化测试。但是使用起来有点麻烦,用的人不多,所以最终决定开发一个 AWTK 专用的 UI 自动化测试工具。相比 Appium,这个工具有下列特点: …...

Java后端开发——JDBC入门实验
JDBC(Java Database Connectivity)是Java编程语言中用于与数据库建立连接并进行数据库操作的API(应用程序编程接口)。JDBC允许开发人员连接到数据库,执行各种操作(如插入、更新、删除和查询数据)…...

LCA
定义 最近公共祖先简称 LCA(Lowest Common Ancestor)。两个节点的最近公共祖先,就是这两个点的公共祖先里面,离根最远的那个。 性质 如果 不为 的祖先并且 不为 的祖先,那么 分别处于 的两棵不同子树中&#…...

ts学习02-数据类型
新建index.html <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </h…...

javaSE的发展历史以及openjdk和oracleJdk
1 JavaSE 的发展历史 1.1 Java 语言的介绍 SUN 公司在 1991 年成立了一个称为绿色计划(Green Project)的项目,由 James Gosling(高斯林)博士领导,绿色计划的目的是开发一种能够在各种消费性电子产品&…...

【入门Flink】- 10基于时间的双流联合(join)
统计固定时间内两条流数据的匹配情况,需要自定义来实现——可以用窗口(window)来表示。为了更方便地实现基于时间的合流操作,Flink 的 DataStrema API 提供了内置的 join 算子。 窗口联结(Window Join) 一…...

【Python Opencv】图片与视频的操作
文章目录 前言一、opencv图片1.1 读取图像1.2 显示图像1.3 写入图像1.4 示例代码 二、Opencv视频2.1 从相机捕获视频获取摄像头一帧一帧读取显示图片VideoCapture 中的get和set函数示例代码 2.2 从文件播放视频示例代码 2.3 保存视频示例代码 总结 前言 在计算机视觉和图像处理…...

【从入门到起飞】JavaAPI—System,Runtime,Object,Objects类
🎊专栏【JavaSE】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 🎄欢迎并且感谢大家指出小吉的问题🥰 文章目录 🍔System类⭐exit()⭐currentTimeMillis()🎄用…...

【Git】的分支和标签的讲解及实际应用场景
目录 讲解 环境讲述 分支标签的区别 分支 命令 场景应用 标签 命令 标签规范 讲解 环境讲述 当软件从开发到正式环境部署的过程中,不同环境的作用 开发环境:用于开发人员进行软件开发、测试和调试。在这个环境中,开发人员可以快速地…...

修改django开发环境runserver命令默认的端口
runserver默认8000端口 虽然python manage.py runserver 8080 可以指定端口,但不想每次runserver都添加8080这个参数 可以通过修改manage.py进行修改,只需要加三行: from django.core.management.commands.runserver import Command as Ru…...
kubeadm安装k8s高可用集群
目录 一、环境规划 二、注意事项: 三、环境准备: 1. 关闭防火墙规则,关闭selinux,关闭swap交换: 2. 修改主机名 3. 所有节点修改hosts文件: 4. 所有节点时间同步: 5. 所有节点实现Linux的资…...

来看看电脑上有哪些不为人知的小众软件?
电脑上的各类软件有很多,除了那些常见的大众化软件,还有很多不为人知的小众软件,专注于实用功能,简洁干净、功能强悍。 1.桌面停靠栏工具——BitDock BitDock是一款运行在Windows系统中的桌面停靠栏工具,功能实…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...