当前位置: 首页 > news >正文

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 的欢迎页,说明已经运行成功。

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集合类中元素有序&#xff0…...

实战 | 基于卷积神经网络的蘑菇识别微信小程序

一个不知名大学生,江湖人称菜狗 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允许开发人员连接到数据库,执行各种操作(如插入、更新、删除和查询数据&#xff09…...

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 年成立了一个称为绿色计划&#xff08;Green Project&#xff09;的项目&#xff0c;由 James Gosling&#xff08;高斯林&#xff09;博士领导&#xff0c;绿色计划的目的是开发一种能够在各种消费性电子产品&…...

【入门Flink】- 10基于时间的双流联合(join)

统计固定时间内两条流数据的匹配情况&#xff0c;需要自定义来实现——可以用窗口&#xff08;window&#xff09;来表示。为了更方便地实现基于时间的合流操作&#xff0c;Flink 的 DataStrema API 提供了内置的 join 算子。 窗口联结&#xff08;Window Join&#xff09; 一…...

【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类

&#x1f38a;专栏【JavaSE】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;System类⭐exit()⭐currentTimeMillis()&#x1f384;用…...

【Git】的分支和标签的讲解及实际应用场景

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

修改django开发环境runserver命令默认的端口

runserver默认8000端口 虽然python manage.py runserver 8080 可以指定端口&#xff0c;但不想每次runserver都添加8080这个参数 可以通过修改manage.py进行修改&#xff0c;只需要加三行&#xff1a; from django.core.management.commands.runserver import Command as Ru…...

kubeadm安装k8s高可用集群

目录 一、环境规划 二、注意事项&#xff1a; 三、环境准备&#xff1a; 1. 关闭防火墙规则&#xff0c;关闭selinux&#xff0c;关闭swap交换&#xff1a; 2. 修改主机名 3. 所有节点修改hosts文件&#xff1a; 4. 所有节点时间同步&#xff1a; 5. 所有节点实现Linux的资…...

来看看电脑上有哪些不为人知的小众软件?

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

智能温控7级调节:ThinkPad用户的风扇噪音与性能平衡终极方案

智能温控7级调节&#xff1a;ThinkPad用户的风扇噪音与性能平衡终极方案 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 你是否经常被ThinkPad笔记本电脑在运行时突然增…...

Intv_AI_MK11深入LSTM时间序列预测:模型原理与代码实现详解

Intv_AI_MK11深入LSTM时间序列预测&#xff1a;模型原理与代码实现详解 1. 为什么需要LSTM&#xff1f; 时间序列数据在我们的生活中无处不在——股票价格波动、天气变化、设备传感器读数...这些数据都有一个共同特点&#xff1a;当前时刻的值往往与过去一段时间的值相关。传…...

Hunyuan模型支持蒙古语吗?少数民族语言翻译案例

Hunyuan模型支持蒙古语吗&#xff1f;少数民族语言翻译案例 1. 引言 随着全球化进程的加速&#xff0c;语言多样性保护和文化交流变得愈发重要。对于蒙古族同胞、语言学研究者和跨文化交流工作者来说&#xff0c;一个关键问题常常被提及&#xff1a;当前主流的大语言模型是否…...

最通俗的 LDA 线性判别分析教程

&#x1f525; 最通俗的 LDA 线性判别分析教程&#xff08;本科生/研究生都能懂&#xff09; 大家好&#xff0c;今天我们来彻底吃透LDA&#xff08;线性判别分析&#xff09;。 这是机器学习、模式识别、数据降维里必考、必用、必懂的算法&#xff0c;面试、比赛、写论文都高频…...

AI编程助手入门:Ollama运行Yi-Coder-1.5B,快速生成函数与类

AI编程助手入门&#xff1a;Ollama运行Yi-Coder-1.5B&#xff0c;快速生成函数与类 1. 为什么选择Yi-Coder-1.5B作为编程助手 1.1 轻量级但功能强大 Yi-Coder-1.5B是一款专为代码生成优化的开源模型&#xff0c;虽然只有1.5B参数&#xff0c;但在编程任务上的表现却出人意料…...

YOLO目标检测完全指南:从入门到实践

YOLO目标检测完全指南&#xff1a;从入门到实践YOLO概述 YOLO&#xff08;You Only Look Once&#xff09;是目标检测领域的开创性算法&#xff0c;其核心思想非常直接——对图像只看一次&#xff0c;同时输出所有物体的位置和类别。 两阶段 vs 单阶段 传统R-CNN系列是"两…...

国内AI招聘系统,如何才能选对系统的真实能力?

你有没有过这样的经历&#xff1a;看了一堆 AI 招聘系统的宣传&#xff0c;吹得天花乱坠&#xff0c;又是 “智能筛选” 又是 “AI 面试”&#xff0c;结果买回去发现根本不是那么回事 —— 简历筛选还是靠关键词匹配&#xff0c;AI 面试就是把预设问题念一遍&#xff0c;候选人…...

避坑指南:Invest模型年产水量模拟,HWSD土壤数据处理与Biophysical表填写的那些坑

Invest模型年产水量模拟实战避坑指南&#xff1a;HWSD数据处理与Biophysical表填写精要 当你在深夜第三次运行Invest模型却依然得到明显不合理的水量分布图时&#xff0c;那种挫败感我深有体会。作为曾经在HWSD土壤数据库和Biophysical表上栽过跟头的"过来人"&#x…...

SEO案例教程有哪些

SEO案例教程有哪些&#xff1f;了解这些将大大提升你的网站排名 在当今的互联网时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为每个网站运营者必须掌握的技能。无论你是新手还是有一些经验&#xff0c;了解和学习高质量的SEO案例教程都能帮助你提升网站的排…...

PyTorch 3.0静态图分布式训练落地实录:从torch.compile到DistributedGraphExecutor的7个关键配置节点

第一章&#xff1a;PyTorch 3.0静态图分布式训练全景概览PyTorch 3.0 引入了原生静态图编译能力&#xff08;TorchDynamo Inductor 后端深度集成&#xff09;&#xff0c;结合 torch.distributed 的增强型 API&#xff0c;构建出面向大规模集群的高性能分布式训练范式。与传统…...