目录
什么是 Nginx?
基本命令
最小化配置
首页 运维 nginx Nginx基本概念是什么

Nginx基本概念是什么

May 16, 2023 pm 05:02 PM
nginx

Nginx基本概念是什么

什么是 Nginx?

Nginx 最初是作为一个 Web 服务器创建的,用于解决 C10k 的问题。作为一个 Web 服务器,它可以以惊人的速度为您的数据服务。但 Nginx 不仅仅是一个 Web 服务器,你还可以将其用作反向代理,与较慢的上游服务器(如:Unicorn 或 Puma)轻松集成。你可以适当地分配流量(负载均衡器)、流媒体、动态调整图像大小、缓存内容等等。基本的 nginx 体系结构由 master 进程和其 worker 进程组成。master 读取配置文件,并维护 worker 进程,而 worker 则会对请求进行实际处理。

基本命令

要启动 nginx,只需输入:

[sudo] nginx
登录后复制

当你的 nginx 实例运行时,你可以通过发送相应的信号来管理它:

[sudo] nginx -s signal
登录后复制

可用的信号:

  • stop – 快速关闭

  • quit – 优雅关闭 (等待 worker 线程完成处理)

  • reload – 重载配置文件

  • reopen – 重新打开日志文件

命令和上下文

nginx 的配置文件,默认的位置包括:

  • /etc/nginx/nginx.conf,

  • /usr/local/etc/nginx/nginx.conf,或

  • /usr/local/nginx/conf/nginx.conf

配置文件的由下面的部分构成:

  • 指令 – 可选项,包含名称和参数,以分号结尾

gzip on;
登录后复制
  • 上下文 – 分块,你可以声明指令 – 类似于编程语言中的作用域

worker_processes 2; # 全局上下文指令http {              # http 上下文   gzip on;        # http 上下文中的指令 server {          # server 上下文   listen 80;      # server 上下文中的指令 }
}
登录后复制

指令类型

当使用相同的指令在不同的继承模型中进行操作时,必须小心谨慎。有三种类型的指令,每种都有自己的继承模型。

普通指令

在每个上下文仅有唯一值。而且,它只能在当前上下文中定义一次。在子级上下文中覆盖父级的值只在当前子级上下文中有效。

gzip on;
gzip off; # 非法,不能在同一个上下文中指定同一普通指令2次server {
 location /downloads {
   gzip off;
 }

 location /assets {
   # gzip is on here }
}
登录后复制

数组指令

在同一上下文中添加多条指令,将添加多个值,而不是完全覆盖。在子级上下文中定义指令将覆盖给父级上下文中的值。

error_log /var/log/nginx/error.log;
error_log /var/log/nginx/error_notive.log notice;
error_log /var/log/nginx/error_debug.log debug;

server {
 location /downloads {
   # 下面的配置会覆盖父级上下文中的指令   error_log /var/log/nginx/error_downloads.log;
 }
}
登录后复制

行动指令

行动是改变事情的指令。根据模块的需要,它继承的行为可能会有所不同。例如 rewrite 指令,只要是匹配的都会执行:

server {
 rewrite ^ /foobar;

 location /foobar {
   rewrite ^ /foo;
   rewrite ^ /bar;
 }
}
登录后复制

如果用户想尝试获取 /sample:

  • server的rewrite将会执行,从 /sample rewrite 到 /foobar

  • location /foobar 会被匹配

  • location的第一个rewrite执行,从/foobar rewrite到/foo

  • location的第二个rewrite执行,从/foo rewrite到/bar

return 指令提供的是不同的行为:

server {
 location / {
   return 200;
   return 404;
 }
}
登录后复制

在上述的情况下,立即返回200。

处理请求

在 Nginx 内部,你可以指定多个虚拟服务器,每个虚拟服务器用 server{} 上下文描述。

server {
 listen      *:80 default_server;
 server_name netguru.co;

 return 200 "Hello from netguru.co";
}

server {
 listen      *:80;
 server_name foo.co;

 return 200 "Hello from foo.co";
}

server {
 listen      *:81;
 server_name bar.co;

 return 200 "Hello from bar.co";
}
登录后复制

这将告诉 Nginx 如何处理到来的请求。在检查给定的 IP 端口组合时,Nginx 会先测试哪个虚拟主机有设置 listen 指令。

然后,server_name 指令的值将检测 Host 头(存储着主机域名)。

Nginx 将会按照下列顺序选择虚拟主机:

  1. 匹配sever_name指令的IP-端口主机

  2. 拥有default_server标记的IP-端口主机

  3. 首先定义的IP-端口主机

  4. 如果没有匹配,拒绝连接。

例如下面的例子:

Request to foo.co:80     => "Hello from foo.co"Request to www.foo.co:80 => "Hello from netguru.co"Request to bar.co:80     => "Hello from netguru.co"Request to bar.co:81     => "Hello from bar.co"Request to foo.co:81     => "Hello from bar.co"
登录后复制

server_name 指令

server_name指令接受多个值。它还处理通配符匹配和正则表达式。

server_name netguru.co www.netguru.co; # exact matchserver_name *.netguru.co;              # wildcard matchingserver_name netguru.*;                 # wildcard matchingserver_name  ~^[0-9]*\.netguru\.co$;   # regexp matching
登录后复制

当有歧义时,nginx 将使用下面的命令:

  1. 确切的名字

  2. 最长的通配符名称以星号开始,例如“* .example.org”。

  3. 最长的通配符名称以星号结尾,例如“mail.**”

  4. 首先匹配正则表达式(按照配置文件中的顺序)

Nginx将存储三个哈希表,用于存储具体名称、以星号开头的通配符和以星号结尾的通配符。如果结果不在任何表中,则将按顺序进行正则表达式测试。

值得谨记的是

server_name .netguru.co;
登录后复制

是一个来自下面的缩写

server_name  netguru.co  www.netguru.co  *.netguru.co;
登录后复制

有一点不同,.netguru.co 存储在第二张表,这意味着它比显式声明的慢一点。

listen 指令

在很多情况下,能够找到 listen 指令,接受IP:端口值

listen 127.0.0.1:80;
listen 127.0.0.1;    # by default port :80 is usedlisten *:81;
listen 81;           # by default all ips are usedlisten [::]:80;      # IPv6 addresseslisten [::1];        # IPv6 addresses
登录后复制

然而,还可以指定 UNIX-domain 套接字。

listen unix:/var/run/nginx.sock;
登录后复制

你甚至可以使用主机名

listen localhost:80;
listen netguru.co:80;
登录后复制

但请慎用,由于主机可能无法启动 nginx,导致无法绑定在特定的 TCP Socket。

最后,如果指令不存在,则使用 *:80

最小化配置

有了这些知识 – 我们应该能够创建并理解运行 nginx 所需的最低配置。

# /etc/nginx/nginx.confevents {}                   # events context needs to be defined to consider config validhttp {
server {
   listen 80;
   server_name  netguru.co  www.netguru.co  *.netguru.co;

   return 200 "Hello";
 }
}
登录后复制

root, location, 和 try_files 指令

root 指令

root 指令设置请求的根目录,允许 nginx 将传入请求映射到文件系统。

server {
 listen 80;
 server_name netguru.co;
 root /var/www/netguru.co;
}
登录后复制

根据给定的请求,指定 nginx 服务器允许的内容

netguru.co:80/index.html     # returns /var/www/netguru.co/index.htmlnetguru.co:80/foo/index.html # returns /var/www/netguru.co/foo/index.html
登录后复制

location 指令

location指令根据请求的 URI 来设置配置。location [modifier] path

location /foo/ {
 # ...}
登录后复制

如果没有指定修饰符,则路径被视为前缀,其后可以跟随任何东西。

以上例子将匹配

/foo
/fooo
/foo123
/foo/bar/index.html
...
登录后复制

此外,在给定的上下文中可以使用多个 location 指令。

server {
 listen 80;
 server_name netguru.co;
 root /var/www/netguru.co;

 location / {
   return 200 "root";
 }

 location /foo/ {
   return 200 "foo";
 }
}
netguru.co:80   /       # => "root"netguru.co:80   /foo    # => "foo"netguru.co:80   /foo123 # => "foo"netguru.co:80   /bar    # => "root"
登录后复制

Nginx还有一些修饰符可以用于连接location。因为每个修饰符都有自己的优先级,所以它们会影响 location 模块在使用时的行为。

=           - Exact match
^~          - Preferential match
~ && ~*     - Regex match
no modifier - Prefix match
登录后复制

Nginx 会先检查精确匹配。如果找不到,我们会找优先级最高的。如果之前的匹配尝试失败,正则表达式会按照出现的顺序逐个进行测试。至少,最后一个前缀匹配将被使用。

location /match {
 return 200 'Prefix match: matches everything that starting with /match';
}

location ~* /match[0-9] {
 return 200 'Case insensitive regex match';
}

location ~ /MATCH[0-9] {
 return 200 'Case sensitive regex match';
}

location ^~ /match0 {
 return 200 'Preferential match';
}

location = /match {
 return 200 'Exact match';
}
/match/    # => 'Exact match'/match0    # => 'Preferential match'/match2    # => 'Case insensitive regex match'/MATCH1    # => 'Case sensitive regex match'/match-abc # => 'Prefix match: matches everything that starting with /match'
登录后复制

try_files 指令

尝试不同的路径,找到一个路径就返回。

try_files $uri index.html =404;
登录后复制

所以对于 /foo.html 请求,它将尝试按以下顺序返回文件:

  1. $uri ( /foo.html )

  2. index.html

  3. 如果什么都没找到则返回 404

有趣的是,如果我们在服务器上下文中定义 try_files,然后定义匹配的所有请求的 location —— try_files 将不会执行。

这是因为在服务器上下文中定义的 try_files 是它的 pseudo-location,这是最不可能的位置。因此,location/的定义将比pseudo-location更为明确。

server {
 try_files $uri /index.html =404;

 location / {
 }
}
登录后复制

因此,你应该避免在 server 上下文中出现 try_files:

server {
 location / {
   try_files $uri /index.html =404;
 }
}
登录后复制

以上是Nginx基本概念是什么的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

怎么查看nginx是否启动 怎么查看nginx是否启动 Apr 14, 2025 pm 01:03 PM

确认 Nginx 是否启动的方法:1. 使用命令行:systemctl status nginx(Linux/Unix)、netstat -ano | findstr 80(Windows);2. 检查端口 80 是否开放;3. 查看系统日志中 Nginx 启动消息;4. 使用第三方工具,如 Nagios、Zabbix、Icinga。

nginx在windows中怎么配置 nginx在windows中怎么配置 Apr 14, 2025 pm 12:57 PM

如何在 Windows 中配置 Nginx?安装 Nginx 并创建虚拟主机配置。修改主配置文件并包含虚拟主机配置。启动或重新加载 Nginx。测试配置并查看网站。选择性启用 SSL 并配置 SSL 证书。选择性设置防火墙允许 80 和 443 端口流量。

linux怎么查看nginx是否启动 linux怎么查看nginx是否启动 Apr 14, 2025 pm 12:48 PM

在 Linux 中,使用以下命令检查 Nginx 是否已启动:systemctl status nginx根据命令输出进行判断:如果显示 "Active: active (running)",则 Nginx 已启动。如果显示 "Active: inactive (dead)",则 Nginx 已停止。

linux怎么启动nginx linux怎么启动nginx Apr 14, 2025 pm 12:51 PM

在 Linux 中启动 Nginx 的步骤:检查 Nginx 是否已安装。使用 systemctl start nginx 启动 Nginx 服务。使用 systemctl enable nginx 启用在系统启动时自动启动 Nginx。使用 systemctl status nginx 验证启动是否成功。在 Web 浏览器中访问 http://localhost 查看默认欢迎页面。

怎么启动nginx服务器 怎么启动nginx服务器 Apr 14, 2025 pm 12:27 PM

启动 Nginx 服务器需要按照不同操作系统采取不同的步骤:Linux/Unix 系统:安装 Nginx 软件包(例如使用 apt-get 或 yum)。使用 systemctl 启动 Nginx 服务(例如 sudo systemctl start nginx)。Windows 系统:下载并安装 Windows 二进制文件。使用 nginx.exe 可执行文件启动 Nginx(例如 nginx.exe -c conf\nginx.conf)。无论使用哪种操作系统,您都可以通过访问服务器 IP

nginx403怎么解决 nginx403怎么解决 Apr 14, 2025 am 10:33 AM

如何解决 Nginx 403 Forbidden 错误?检查文件或目录权限;2. 检查 .htaccess 文件;3. 检查 Nginx 配置文件;4. 重启 Nginx。其他可能原因还包括防火墙规则、SELinux 设置或应用程序问题。

nginx304错误怎么解决 nginx304错误怎么解决 Apr 14, 2025 pm 12:45 PM

问题的答案:304 Not Modified 错误表示浏览器已缓存客户端请求的最新资源版本。解决方案:1. 清除浏览器缓存;2. 禁用浏览器缓存;3. 配置 Nginx 允许客户端缓存;4. 检查文件权限;5. 检查文件哈希;6. 禁用 CDN 或反向代理缓存;7. 重启 Nginx。

nginx403错误怎么解决 nginx403错误怎么解决 Apr 14, 2025 pm 12:54 PM

服务器无权访问所请求的资源,导致 nginx 403 错误。解决方法包括:检查文件权限。检查 .htaccess 配置。检查 nginx 配置。配置 SELinux 权限。检查防火墙规则。排除其他原因,如浏览器问题、服务器故障或其他可能的错误。

See all articles