nginx学习

因为要做服务器的一些代理转发等,学习一下Nginx.由于Nginx涉及指令比较多,这里写常用的.

Nginx 是一款高性能的 HTTP 和反向代理服务器软件.

Nginx 由内核和一系列模块组成:内核提供 web 服务的基本功能,如启用网络协议、创建运行环境、接收和分配客户端请求、处理模块之间的交互。模块实现 Nginx 的各种功能和操作,Nginx 的模块从结构上分为核心模块、基础模块和第三方模块。

  • 核心模块: HTTP 模块、EVENT 模块和 MAIL 模块
  • 基础模块: HTTP Access 模块、HTTP FastCGI 模块、HTTP Proxy 模块和 HTTP Rewrite 模块
  • 第三方模块: HTTP Upstream Request Hash 模块、Notice 模块和 HTTP Access Key 模块及用户自己开发的模块

当 web 应用发展到一定程度时,单台服务器不足以支撑业务的正常运行,为增大吞吐量往往会使用多台服务器一起提供服务,如何充分利用多台服务器的资源,就需要一个‘调度员’,这个调度员要求能高效的接收并分发请求,知道后端的服务器健康状态,要能方便的扩展和移除,这就是 Nginx 又一常见应用架构,此架构充分利用了 Nginx 的反向代理和负载均衡的优势,Nginx 本身不提供 web 服务,而是在前端接受 Web 请求并分发到后端服务器处理,后端服务器可以是 Apache、Tomcat、IIS 等

简单来说,常用于负载均衡和反向代理,当然基本的静态资源处理转发这些也都有.

Nginx组成

  1. Nginx 二进制可执行文件 nginx:由各模块源码编译出的一个文件
  2. nginx.conf 配置文件:控制 Nginx 的行为
  3. access.log 访问日志:记录每一条 http 请求信息
  4. error.log 错误日志:定位问题

开源免费的 Nginx 与商业版 Nginx Plus

下面介绍在Linux平台下的安装和基本使用.

安装

在Linux平台下,直接使用与操作系统相关的安装命令即可,比如这里使用yum

1
sudo yum install nginx

当然也可以使用二进制安装方式,这里不做过多介绍.安装后

1
nginx -v

查看版本信息

image-20230330122538447

安装后的目录

image-20230330123256958

Nginx 模块分类

  • 核心模块:nginx 最基本最核心的服务,如进程管理、权限控制、日志记录;
  • 标准 HTTP 模块:Nginx 服务器的标准 HTTP 功能;
  • 可选 HTTP 模块:处理特殊的 HTTP 请求;
  • 邮件服务模块:邮件服务;
  • 第三方模块:作为扩展,完成特殊功能

主要修改的配置文件

image-20230330124228974

命令

1
nginx -t

测试配置文件语法同时可以看运行的是哪个配置文件.

image-20230330162554150

1
2
3
4
5
6
nginx -s stop #快速关闭
nginx -s quit #平稳关闭
nginx -s reload #重新加载
nginx -c filename 为Nginx指定配置文件.
nginx -t #测试配置文件
nginx -v #查看版本信息

查看conf配置文件

1
2
3
4
5
user  www www;
worker_processes auto;
error_log /www/wwwlogs/nginx_error.log crit;
pid /www/server/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;

因为Nginx设计到端口开放,这里写一些关于防火墙设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#可以先查看防火墙的开启状态,如果显示 running 则是正在运行
systemctl status firewalld

#关闭防火墙,不用配置端口,但是不安全
systemctl stop firewalld

#开启防火墙
systemctl start firewalld

#添加开启端口,--permanent表示永久打开,不加是临时打开重启之后失效
firewall-cmd --permanent --zone=public --add-port=8080/tcp
#重启防火墙,永久打开端口需要reload一下
firewall-cmd --reload
#查看防火墙,添加的端口也可以看到
firewall-cmd --list-all

模块配置

全局配置参数一般用user,work_processes,error_log,pid.

1
2
3
4
5
6
events
{
use epoll;
worker_connections 51200;
multi_accept on;
}

而events用于设置工作模式,针对每个进程.

重要的全局变量

HTTP 相关的变量
$host请求行中的 Host,如果有 Host 请求头,则用其值替换掉请求行中的主机名,如果请求中没有 Host 行和 Host 请求头,则等于请求匹配的 server 名称(处理请求 server 的 server_name 指令的值),值为小写,不包含端口
$uri请求中的当前 URI(不同于 URL ,不包括 ? 后面的请求参数,参数位于 $args),不同于浏览器传递 $request_uri 的值,它可以通过内部重定向,或者使用 index 指令进行修改,不包括协议和主机名,例如 /abc/ef.html
$document_uri当前请求在 root 指令中指定的值,与 $uri 完全相同,历史问题存在
$request_uri完整的原始请求 URL(包括 URI 和完整的参数),它无法修改,请查看 $uri 更改或重写 URL

在配置文件中,没有放在任何上下文中的指令都处在主上下文中。eventshttp 的指令是放在主上下文中,server 放在 http 中,location 放在 server 中。

location匹配

location 指令用于仅匹配 uri,忽略参数,可以使用合法的字符串或者正则表达式

语法:

1
2
3
location [ = | ~ | ~* | ^~ | 空] uri {
……
}

指令后面:

  • =:精确匹配,用于不含正则表达式的 uri 前,如果匹配成功,不再进行后续的查找
  • ^~:前缀匹配,用于不含正则表达式的 uri 前,表示如果该符号后面的字符是最佳匹配。采用该规则,不再进行后续的正则查找。跟 = 的区别是,不需要 uri 一模一样,只需要开头和 uri 匹配即可。
  • ~:正则匹配,表示用该符号后面的正则 uri 去匹配路径,区分大小写
  • ~*:正则匹配,表示用该符号后面的正则 uri 去匹配路径,不区分大小写。
  • :普通匹配(最长字符匹配),匹配以 uri 开头的字符串,只能是普通字符串。例如,location / 是通用匹配,任何请求都会匹配到。另外普通匹配与 location 顺序无关,是按照匹配的长短来确定匹配结果。
1
location =` > `location 完整路径`(还会去匹配正则) > `location ^~ 路径` > `location ~,~* 正则顺序` > `location 部分起始路径` > `location /

即:精确匹配 > 最长字符串匹配,完全匹配(还会去匹配正则) > 前缀匹配 > 正则匹配 > 普通匹配(最长字符串匹配,部分匹配) > 通用匹配

@ 开头的是用于内部跳转的命名 location。

常用配置

设置日志

日志很重要,便于debug

使用log_format设置

log一般有access_log和error_log,error_log后面直接添加错误等级,而access_log后可以设置输出格式.

1
2
3
4
5
6
7
8
9
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 /www/wwwlogs/www.proanimer.com.log main; log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#log_format配置在http中

access_log /www/wwwlogs/www.proanimer.com.log main; #在对应的server中

remote_addr:对应客户端的地址
remote_user:是请求客户端请求认证的用户名,如果没有开启认证模块的话是值为空。
time_local:表示nginx服务器时间
request:表示request请求头的行
status:表示response的返回状态
body_bytes_sent:表示从服务端返回给客户端的body数据大小
http_referer:表示请求的上一级页面
http_user_agent:表示agent信息
http_x_forwarded_for:会记录每一级请求中信息

反向代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  location ^~  /files/
{

proxy_pass http://127.0.0.1:9201;
proxy_set_header Host $proxy_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

location ^~ /setrss/
{
proxy_pass http://127.0.0.1:9200/;
proxy_http_version 1.1;
proxy_set_header Host $proxy_host;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-For $remote_addr;
}

静态网站

1
2
3
4
5
 location  ^~  /navigator
{
alias /naviweb/;
index index.html;
}

此外Nginx还有很多东西,后面会继续更新.

参考资料

  1. Nginx 介绍 | Front-End-Basics (chenfangxu.com)
  2. 万字长文看Nginx配置详解! - 知乎 (zhihu.com)
  3. Windows下Nginx安装与配置教程 - 腾讯云开发者社区-腾讯云 (tencent.com)
  4. NGINX Reverse Proxy for Web UI · qbittorrent/qBittorrent Wiki (github.com)
-------------本文结束感谢您的阅读-------------
感谢阅读.

欢迎关注我的其它发布渠道