Nginx_基础

Nginx_基础

Nginx 基础

一、Nginx 简介

1.1 简介

Nginx(engine x)是一个免费的,开源的,高性能的 HTTP 服务器, IMAP/POP3 代理服务器 和 TCP/UDP 代理服务器,通常可以用于进行反向代理和实现基于软件的负载均衡,除此之外,它还具备以下特性:

  • Nginx 在设计时遵循模块化的设计方案,可以通过组合模块来扩展实现不同的功能,具备很高的扩展性。
  • Nginx 遵循 matser \ worker 架构,主进程负责管理一个或者多个 worker 进程,每个 worker 进程负责处理实际的连接,当某个 worker 进程出错时,主进程会迅速创建一个新的 worker 来继续处理连接请求,从而保证高可用。
  • Nginx 在高连接数的情况下仍然可以保持极低的内存占用,从而可以支持高并发量地访问。
  • Nginx 支持热部署和配置热加载,并支持在不停机的情况下进行版本升级。
  • 有免费的开源版本和商业版本 ( Nginx Plus ),可以按需选择或者进行二次开发。
  • 在高并发环境下,Nginx 比其他 WEB 服务器有更快的响应速度。

1.2 正向代理和反向代理

Nginx 能够同时支持正向代理和反向代理,这两种代理模式的区别如下:

  • 正向代理发生在客户端,是客户端主动发起的代理。如我们不能直接访问某个服务器,但可以间接通过中间的代理服务器去进行访问,然后将访问结果再返回给我们。
  • 反向代理发生在服务端,客户端并不知道发生了代理,示例如下。用户只知道将请求发送给 Nginx,但是并不知道请求被转发了,也不知道被转发给了哪一台应用服务器。实际上对于用户来说,他也没必要知道,因为请求结果都是相同的。

二、基本命令

Nginx Shell 的基本使用格式如下:

nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
  • -?,-h :显示帮助信息;
  • -v:查看版本号;
  • -V:查看版本号及配置信息;
  • -t:检测配置文件是否有语法错误;
  • -q:静默模式,在检测配置期间除了错误提示外,不输出其他消息;
  • -s signal:向 Master 进程发送信号,支持以下信号类型:stop ( 立即停止 ),quit ( 优雅停止 ),reload ( 重新加载配置文件 ),reopen (打开一个新的日志文件来继续记录日志) ;
  • -p prefix :指定路径的前缀,默认为安装目录,如 /usr/app/nginx-1.16.1/
  • -c filename :指定配置文件的位置, 默认值为 conf/nginx.conf,其实际指向的路径为 prefix + filename
  • -g directives:从指定的配置文件中设置全局指令。

三、配置格式

3.1 基本配置格式

Nginx 的配置由全局配置和局部配置(指令块)共同组成,所有的指令块都遵循相同的配置格式:

<section>{<directive>    <parameters>;
}

指令块使用大括号进行划分,大括号内是独立的配置上下文,包含指令和具体的参数,每行指令以分号作为结尾。除此之外,Nginx 的配置中还支持以下操作:

  • 支持使用 include 语法来引入外部配置文件,从而可以将每个独立的配置拆分到单独的文件中;
  • 支持使用 # 符号来添加注释;
  • 支持使用 $ 符号来引用变量;
  • 部分指令的参数支持使用正则表达式。

3.2 时间和空间单位

Nginx 的配置文件支持以下空间和时间单位:

  • 空间单位:不加任何单位默认就是 bytes,除此之外还支持 k/K,m/M,g/G 等常用单位。
  • 时间单位:支持 ms (毫秒) ,s (秒) ,m (分钟) ,h (小时) ,d (天),w (星期),M (月,30天),y (年,365天) 等常用单位,并支持组合使用,如 1h 30m (1小时 30分),1y 6M(1年零6个月)。

3.3 官方配置模板

在安装 Nginx 后,在安装目录的 conf 目录下会有一个官方的配置样例 nginx.conf ,其内容如下:

# 使用这个参数来配置worker进程的用户和组,如果没有指定组,则默认为指定用户所处的组,默认值为nobody
user  nobody;
# 指定用于处理客户端连接的worker进程的数量,通常设置为CPU的核心数。
# 如果是为IO密集型操作进行负载,可以设置为核心数的1.5 ~ 2倍
worker_processes  1;# 指定日志的位置和日志级别,日志级别按照由低到高的顺序如下:[debug|info|notice|warn|error|crit]
error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;# 指定记录主进程的ID的文件
pid        logs/nginx.pid;events {# 指定每个工程线程的最大连接数,总的连接数 max_clients = worker_processes * worker_connectionsworker_connections  1024;
}http {# 使用include来引用外部文件include       mime.types;# 指定默认MIME类型default_type  application/octet-stream;# 定义日志的输出格式,使用$来进行变量引用#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  logs/access.log  main;# 是否开启系统调用方法sendfile(),开启后可以直接在内核空间完成文件的发送,即零拷贝sendfile        on;# 是否开启Socket选项,它只有在sendfile启用后才会生效tcp_nopush     on;# 连接超时时间keepalive_timeout  65;# 开启文件压缩gzip  on;# 配置nginx服务器(虚拟主机)server {# 监听端口listen       80;server_name  localhost;# 默认字符集charset koi8-r;# 配置当前虚拟主机的访问日志的存放位置access_log  logs/host.access.log  main;# 虚拟主机对应的映射目录location / {root   html;index  index.html index.htm;}# 错误重定向页面# error_page  404              /404.html;error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}# 禁止访问根目录下以ht结尾的文件location ~ /\.ht {deny  all;}}# 支持配置多台虚拟主机#server {#    listen       8000;#    listen       somename:8080;#    server_name  somename  alias  another.alias;#    location / {#        root   html;#        index  index.html index.htm;#    }#}# 配置Https服务server {listen       443 ssl;server_name  localhost;# 指定数字证书ssl_certificate      cert.pem;# 指定密匙ssl_certificate_key  cert.key;# 设置存储session的缓存类型和大小ssl_session_cache    shared:SSL:1m;# session缓存时间ssl_session_timeout  5m;# 返回客户端支持的密码列表ssl_ciphers  HIGH:!aNULL:!MD5;# 指定在使用SSLv3和TLS协议时,服务器密码应优先于客户端密码ssl_prefer_server_ciphers  on;location / {root   html;index  index.html index.htm;}}
}

四、部署静态网站

Nginx 通常用作 HTTP 服务器来部署静态资源,其具体的操作步骤如下:

4.1 增加配置

修改 nginx.conf ,并在 http 指令块中增加如下配置:

 server {# 监听端口号listen 9010;# 如果有域名的话,可以在这里进行配置server_name _;      # 存放静态页面的目录root /usr/web;# 主页面index index.html;}

/usr/web 目录下新建一个测试页面 index.html,内容如下:

<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0,maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Nginx静态资源网站</title>
</head>
<body>
<h1 style="text-align: center">Nginx静态资源网站</h1>
</body>
</html>

4.2 检查配置

使用 -t 参数来检查配置,出现 successful 则代表配置正确:

[root@node1 web]# nginx -t -c conf/nginx.conf
nginx: the configuration file /usr/app/nginx-1.16.1/conf/nginx.conf syntax is ok
nginx: configuration file /usr/app/nginx-1.16.1/conf/nginx.conf test is successful

4.3 重载配置

启动 Nginx ,如果 Nginx 已经启动,可以使用如下命令重载配置:

nginx -s reload

访问 http://hostname:9010/index.html ,即可查看到静态网站首页。

五、实现负载均衡

5.1 部署后台服务

这里我使用 Docker 来部署两个 Tomcat,之后将测试项目 WAR 包分别拷贝到 /usr/webapps001/usr/webapps002 两个挂载的容器卷下,程序会自动解压并运行,两个项目的端口号分别为 8080 和 8090:

run -d  -it --privileged=true -v /usr/webapps01:/usr/local/tomcat/webapps \
-p 8080:8080 --name tomcat8080  96c4e536d0eb
run -d  -it  --privileged=true -v /usr/webapps02:/usr/local/tomcat/webapps \
-p 8090:8080 --name tomcat8090  96c4e536d0eb

5.2 负载均衡配置

修改 nginx.conf ,并在 http 指令块中增加如下配置:

# 这里指令块的名称可以随意指定,只要和下面的proxy_pass的值相同即可,通常配置为项目名
upstream springboot {server 192.168.0.226:8080;server 192.168.0.226:8090;
}server {listen 9020;location / {proxy_pass http://springboot;}
}

重载配置后,打开浏览器,通过 9020 端口访问项目,此时 Nginx 会以轮询的方式将请求分发到 8080 和 8090 端口上。在测试负载均衡策略的时候,最好将浏览器的缓存功能关闭,避免造成影响。

5.3 负载均衡策略

在上面的配置中,我们没有配置任何负载均衡策略,默认采用的是轮询策略,除此之外,Nginx 还支持以下负载均衡策略:

1. 权重策略 ( Weighted load balancing )

通过为不同的服务分配不同的权重来进行转发,配置示例如下:

upstream myapp1 {server srv1.example.com weight=3;server srv2.example.com weight=2;server srv3.example.com;
}

2. 最少连接策略 ( Least connected load balancing )

将请求转发给连接数最少的服务,配置实例如下:

upstream myapp1 {least_conn;server srv1.example.com;server srv2.example.com;server srv3.example.com;
}

3. IP 策略 ( IP Hash load balancing )

通过对请求的 IP 地址进行哈希运算并取模来决定转发对象,配置示例如下:

upstream myapp1 {ip_hash;server srv1.example.com;server srv2.example.com;server srv3.example.com;
}

以上是 Nginx 内置的基础的负载均衡策略,如果想要实现其他更加复杂的负载均衡策略,可以通过第三方模块来实现。

4.4 声明备用服务

在上面任何负载均衡策略当中,都可以通过 backup 参数来添加备用服务,示例如下:

server backup1.example.com:8080   backup;

处于备用状态下的服务并不会参与负载均衡,除非所有主服务都已宕机,此时 Nginx 才会将请求转发到备用服务上。

六、实现动静分离

6.1 动静分离配置

Nginx 能够支持高并发的访问,并具有静态资源缓存等特性,因此相比于 Tomcat 等动态资源应用服务器,其更加适合于部署静态资源。想要实现动静分离,只需要在 server 指令块中通过正则表达式来划分静态资源,并指定其存放位置,示例如下:

server {listen 9020;location / {proxy_pass http://springboot;}# 通过正则来控制所需要分离的静态资源location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {# 静态资源存放目录root /usr/resources/;}
}

6.2 常见配置异常

1. No such file or directory

第一个常见的问题是找不到静态资源,此时可以查看 logs 目录下的 error.log 日志,通常输出如下:

2019/09/01 17:12:43 [error] 12402#0: *163 open() "/usr/resources/spring-boot-tomcat/css/show.css"
failed (2: No such file or directory), client: 192.168.0.106, server: , 
request: "GET /spring-boot-tomcat/css/show.css HTTP/1.1", host: "192.168.0.226:9020",
referrer: "http://192.168.0.226:9020/spring-boot-tomcat/index"

出现这个问题,是因为 Nginx 要求静态资源的请求路径必须和原有请求路径完全相同,这里我的项目在 Tomcat 中解压后的项目名为 pring-boot-tomcat,以 show.css 文件为例,其正确的存储路径应该为:

/usr/resources/spring-boot-tomcat/css/show.css

即: 静态资源根目录 + 项目名 + 原有路径,通常我们在创建目录时会忽略掉项目名这一层级,从而导致异常。

2. Permission denied

路径正确后,另外一个常见的问题是权限不足,错误日志如下。此时需要保证配置文件中的 user 用户必须具有静态资源所处目录的访问权限,或者在创建静态资源目录时,直接使用 user 配置的用户来创建:

2019/09/01 17:15:14 [error] 12402#0: *170 open() "/usr/resources/spring-boot-tomcat/css/show.css" 
failed (13: Permission denied), client: 192.168.0.106, server: ,
request: "GET /spring-boot-tomcat/css/show.css HTTP/1.1", host: "192.168.0.226:9020", 
referrer: "http://192.168.0.226:9020/spring-boot-tomcat/index"

参考资料

官方文档:nginx documentation ,Using nginx as HTTP load balancer

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/833178.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Unity】对TMPAsset打包记录

TMPAsset中对于SourceFontFile引用,不会打包到AssetBundle中

4G核心网学习之4G EPS 中的 PDN Connection

PDN PDN(Packet Data Network分组数据网络),严格意义上讲可以分为内部 PDN 和外部 PDN:内部 PDN 即 EPS 系统中的分组数据网络,是 EPS 系统实体(e.g. MME、HSS、SGW、PGW、PCRF)之间的网络通信;而外部 PDN 即 EPS 系统之外的分组数据网络,例如:3GPP 网络 CDMA1X、Int…

spring初始学习

开始学习了容器 bean 依赖注入 Spring框架是一个开源的Java平台,它提供了全面的基础设施支持,以便你可以更容易地开发Java应用程序。以下是Spring框架中关于容器、Bean和依赖注入的一些基础知识点:Spring容器(Spring Container) Spring容器是Spring框架的核心,负责实例化…

sherpa-onnx:跨平台、多语言的语音处理工具包

Sherpa-onnx 是一个基于 ONNX 运行时的开源语音处理库,支持多种语音相关任务,包括语音识别、语音合成、说话人识别、语言识别等。它不仅支持多种编程语言(如 C++、C、Python、JavaScript、Java、C# 等),还支持多种操作系统和硬件平台(如 Windows、macOS、Linux、Android、…

基于FPGA的1024QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR

1.算法仿真效果 vivado2019.2仿真结果如下(完整代码运行后无水印):设置SNR=40db将数据导入matlab显示星座图:设置SNR=35db将数据导入matlab显示星座图:仿真操作步骤可参考程序配套的操作视频。2.算法涉及理论知识概要1024QAM是一种高级调制方式,可以携带更多的信息位(10…

Hive的分区和排序

一、Hive的分区(十分重要) 1、分区是什么 答:我们可以把一个大的文件分隔成一个个小的文件,这样每次操作一个小文件就很方便了 2、为什么要进行分区 答:通过分区,当我们查询的时候,可以只扫描与条件相关的分区,这样做,避免了全局扫描,加快查询速度 1、静态分区(SP) 静…

项目冲刺4-3

仓库地址:https://github.com/bitpurleclude/GDUT-Goofish.git这个作业属于哪个课程 (https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/join?id=CfDJ8AOXHS93SCdEnLt5HW8VuxT_rAhbZKO3TfjMmbv1B0Re5Fp2d0_QACha2ZoYZ4fxF-ZKCCAhfJl7B8mvCfesLYE02X8T6kx_2R8w0SR-ykrgDVRKW…

【Linux】git note -v command not found

安装note.js Node.Js中文网 『Win+E』『此电脑』右键点击『属性』『高级系统设置』-『环境变量』『系统变量』-『NOTE_PATH』“C:\Program Files\nodejs”『用户变量』-『Path』“C:\Program Files\nodejs”『Win+R』重新启动控制台『cmd』-“$NOTE -v” 双击重新启动『Git Ba…

2024.11.13 DP题单

录制唱片 你刚刚继承了流行的 “破锣摇滚” 乐队录制的尚未发表的 \(N\)(\(1\leq N\leq 20\))首歌的版权。你打算从中精选一些歌曲,发行 \(M\)(\(1\leq M\leq 20\))张 CD。每一张 CD 最多可以容纳 \(T\)(\(1\leq T\leq 20\))分钟的音乐,一首歌不能分装在两张 CD 中。CD…

基于HASM模型的高精度建模matlab仿真

1.程序功能描述 本课题主要使用HASM进行高精度建模,主要对HASM模型进行介绍以及在实际中如何进行简化实现的。HASM原始的模型如下所示: 2.测试软件版本以及运行结果展示MATLAB2022A版本运行 3.核心程序%第一类基本变量E(i,j) = 1 + (( f(i,j+1,n) - f(i,j-1,n) )/( …

CICD04 Jenkins容器化CICD实现及分布式构建, 流水线Pipeline ubuntu使用

2.14.3 案例: 基于 Docker 插件实现自由风格任务实现 Docker 镜像 制作 不如前面的直接脚本编写灵活 2.14.3.2 安装插件 docker-build-step jenkins上安装 docker-build-step 插件#选择jenkins使用的docker服务 #左侧系统管理,右侧系统配置,Docker Builder下Docker URL输入 u…

数据类型和运算符

数据类型 动态类型编程语言运行时判断静态类型的编程语言 : Go 、C 、在开发的时候,就需要给一些定义的变量赋值空间大小。C 需要自己去开辟这个空间数据类型 : 每种在Go语言中出现的基本数据类型,会有一个默认的空间大小。 1、布尔类型数据 布尔型的值只可以是常量 true 或…