Nginx学习笔记

简介与环境搭建

简介

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
功能:正向代理,反向代理,负载均衡,动静分离。

正向代理:VPN。客户端通过代理服务器请求资源服务器。代理客户端。
反向代理:代理服务器资源的代理,称为反向代理。代理服务器端。
负载均衡:内置策略(轮询、加权轮询,ip hash)

下载与安装

Nginx官网下载地址:http://nginx.org/en/download.html
下载之后解压,就可以运行。

# 启动Nginx
start nginx
# 停止Nginx
nginx -s stop	/  nginx -s quit
# 重新载入配置
nginx -s reload
# 重新打开日志
nginx -s reopen
# 查看版本
nginx -v
# 查看nginx进程是否启动
tasklist /fi "imagename eq nginx.exe"

Nginx配置文件结构与格式规范

http {		# 每一对大括号结束部分为上下文,上下文中可以包含其他的上下文
  server{	# Server称为虚拟主机
    location {	# 一个Server可以监听多个localtion
      # listen可以配置成IP+prot 示例如下: listen 8000; listen *:8000; 
      # listen localhost:8000; listen 127.0.0.1:8000; listen 127.0.0.1;( 端口不写,默认80 )
      listen 80;
      # server_name是用以区分的,可以任意。可以使用变量$hostname配置为主机名称。或者域名。
      server_name localhost;	
    }
    # 如果有多个Server,那么listen+server_name不可以重复。
    location  / {	# location的根目录总是指向root目录。
    	# 当多个location监听同一端口时,会根据server_name,去匹配访问不同的资源。
    	listen 80;
    	server_name nginx-dev;
    }
  }
  server{
  }
}

这里我们使用VSCode中的Nginx ConfigurationRemote SSH插件对Nginx进行操作。

Nginx静态页面

修改配置文件 -> 执行nginx -s reload -> 访问IP:8000
静态页面配置一个AdminLTE后台管理系统。
配置文件示例:

server{
    listen 8000;
    server_name localhost;

    location / {
        root /home/AdminLTE-3.2.0;
        index index.html index.jsp;
    }
}

反向代理

Http反向代理

正向代理:客户端的代理,如VPN。
反向代理:服务器端的代理,如Nginx。
这里我省略了后端程序ruoyi部署过程,只保留关键的Nginx配置。

server{
    listen 8001;
    server_name ruoyi;
    location / {
        proxy_pass http://localhost:8088;
        # 由于使用反向代理,后端服务无法获取用户的真是IP地址,所以,一般使用反向代理,都要设置一下header信息。
        # 代理请求头:Nginx主机地址
        proxy_set_header Host $http_host;
        # 代理请求头:用户真实IP,即客户端IP
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    }
}

常用的变量值

$host:Nginx的主机IP,例如192.168.0.101
$http_host:nginx主机IP和端口,192.168.0.101:8001
proxy_host:localhost:8088,proxy_pass里配置的主机名和端口。
remote_addr:用户的真实IP,即客户端IP地址。
proxy_pass:代理路径。如果地址只配置到了/,不包括URL,那么location将会被追加到转发的地址中。但是如果proxy_pass包括了URL,则location不会被追加到地址中。
eg:

# 以下这种写法,会被代理到 	http://localhost:8888/some/path/page.html
location /some/path {
	proxy_pass http://localhost:8888/;
}
# 以下这种写法,会被代理到 	http://localhost:8888/zh-cn//page.html
location /some/path {
	proxy_pass http://localhost:8888/zh-cn/;
}

动静分离

  1. 为什么需要动静分离?

Apache Tocmat 严格来说是一款java EE服务器,主要是用来处理 servlet请求。处理css、js、图片这些静态文件的IO性能不够好,因此,将静态文件交给nginx处理,可以提高系统的访问速度,减少tomcat的请求次数,有效的给后端服务器降压。

  1. 图例
				-> Tomcat  8080
nginx 8888
				-> 本地静态资源 /home/www/static
  1. Nginx配置文件示例:
server{
    listen 8002;
    server_name ruoyi-tomcat;

    location / {
        proxy_pass http://localhost:8080;
    }

    location = /html/ie.html {
        root /home/www/static;
    }

    location ^~ /fonts/ {
        root /home/www/static;
    }

    
    ## 代理以.js等结尾的静态文件 ~区分大小写 ~*不区分大小写
    location ~ \.(css|js|png|jpg|gif|ico) {
        root /home/www/static;
    }
}
  1. 修饰符与优先级
    1. 精确匹配(=)
    2. 前缀匹配(^~)表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 location。优先级第二高。
    3. 正则匹配(~~*
    4. 不写

缓冲与缓存

在这里插入图片描述

缓冲(Buffer)

缓冲一般放在内存中,如果不适合放入内存,则会将响应写入磁盘临时文件中。
启用缓冲后,Nginx先将后端请求响应(response)放入缓冲区,等到整个响应完成后,再发送给客户端。减少服务器长链接数量,释放资源。
Nginx默认是开启了缓冲。也可以用proxy_buffering off来手动的关闭Nginx缓冲。

location / {
# proxy_buffers 指令设置每个连接读取响应的缓冲区的大小和数量 。默认的,缓冲区大小等于一个内存页,4K 或 8K,具体取决于操作系统。
    proxy_buffers 16 4k;
# 来自后端服务器响应的第一部分存储在单独的缓冲区中,其大小通过 proxy_buffer_size 指令进行设置,此部分通常是相对较小的响应headers,通常将其设置成小于默认值。
    proxy_buffer_size 2k;
    proxy_pass http://localhost:8088;
}

如果整个响应不适合存到内存里,则将其中的一部分保存到磁盘上的‎‎临时文件中‎‎。
‎‎proxy_max_temp_file_size‎‎设置临时文件的最大值。
‎‎proxy_temp_file_write_size‎‎设置一次写入临时文件的大小。

缓存(cache)

启用缓存,nginx将响应保存到磁盘中,返回给客户端的数据首先从缓存中读取,这样相同的请求不会每次都发送到后端服务器,减少后端请求的数量。
启用缓存,需要在http上下文中使用proxy_cache_path指令,来设置缓存的本地目录,名称,大小。
缓存区可以被多个server共享,使用proxy_cache可以指定使用哪个缓存区。

http {
    proxy_cache_path /data/nginx/cache keys_zone=mycache:10m;
    server {
        proxy_cache mycache;
        location / {
            proxy_pass http://localhost:8000;
        }
    }
}

示例:

proxy_cache_path /var/cache/nginx/static keys_zone=static:100m;

server{
    listen 8001;
    server_name ruoyi;
    location / {
        proxy_pass http://localhost:8088;
        # 代理请求头:Nginx主机地址
        proxy_set_header Host $http_host;
        # 代理请求头:用户真实IP,即客户端IP
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
        # 缓冲设置
        proxy_buffers 16 4k;
        proxy_buffer_size 2k;
    }

    # 代理以.js等结尾的静态文件 ~区分大小写 ~*不区分大小写
    location ~ \.(css|js|png|jpg|gif|ico) {
        proxy_cache static;
        # 缓存失效时间配置,单位分钟
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404 1m;
        proxy_cache_valid any 5m;

        proxy_pass http://localhost:8088;
    }

    location = /html/ie.html {
         proxy_cache static;
        # 缓存失效时间配置,单位分钟
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404 1m;
        proxy_cache_valid any 5m;

        proxy_pass http://localhost:8088;
    }

    location ^~ /fonts/ {
         proxy_cache static;
        # 缓存失效时间配置,单位分钟
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404 1m;
        proxy_cache_valid any 5m;

        proxy_pass http://localhost:8088;
    }
}

负载均衡

  1. 配置图
				-->		tomcat(8080)
nginx(8083)  
				-->		ruoyi-admin.jar(8088)
  1. 负载均衡策略
策略含义语法
轮循机制
round-robin
默认机制,以轮循机制方式分发     不写即为默认轮询机制     
最小连接
least-connected
将下一个请求分配给活动连接数最少的服务器
(较为空闲的服务器)
在这里插入图片描述
ip-hash客户端的 IP 地址将用作哈希键,
来自同一个ip的请求会被转发到相同的服务器
在这里插入图片描述
hash通用hash,允许用户自定义hash的key,
key可以是字符串、变量或组合。
consistent当有机器宕机时,只对不可用的请求IP重新HASH。
在这里插入图片描述
随机‎‎
random
每个请求都将传递到随机选择的服务器在这里插入图片描述
权重
weight
根据指定的权重进行转发在这里插入图片描述
  1. 健康监测
    在Nginx的反向代理中,后台服务器如果在一定时间内响应失败超过指定数,Nginx会将该机器标记为失败,并且在后续的一段时间不再将请求打到这个服务器。
    参数:检查周期fail_timeout‎‎,默认为10秒。
    参数:失败次数max_fails‎,默认为1次。‎
# 如果Nginx无法向服务器发送请求或在30秒内请求8088失败超过3次,则会将服务器标记为不可用30秒,
upstream ruoyi-apps {
    server localhost:8080;
    server localhost:8088 max_fails=3 fail_timeout=30s;
}

HTTPS配置

server {
    # ssl默认是443端口
    listen 8004 ssl;
    server_name ruoyi-https;
    ssl_certificate /etc/nginx/server.crt;
    ssl_certificate_key /etc/nginx/server.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;
    location / {
        proxy_pass http://localhost:8088;
    }
    ssl_password_file   /etc/nginx/cert.pass;
}

TCP反向代理

stream{
    server {
        listen 13306;
        proxy_pass localhost:3306;
    }
}

TCP负载均衡

stream {
  
  upstream backend-mysql {
  
    server localhost:3306;
    server localhost:3307;
    
    # keepalive定义连接池里空闲连接的数量。
    keepalive 8;
  }
  
  server {
    listen 13306;
    proxy_pass backend-mysql;
  }
}

重写return/rewrite

转发与重定向。转发是服务器端的操作,而重定向是客户端变更请求的URL地址。反向代理属于转发,而重写属于重定向。
重定向状态码:301(永久重定向),302(临时重定向)

return

server{
    listen 8888;
    server_name retn-test;
    return 301 https://www.baidu.com;
}

rewrite

server{
    listen 8002;
    server_name ruoyi-tomcat;

	 rewrite_log on;
	 rewrite ^/profile/upload http://192.168.56.101:8080$request_uri;
}

last和break

last:若当前规则不匹配,停止后续匹配rewrite规则,使用重写后的路径,重新搜索loacaton及块内指令。
break:若当前规则不匹配,停止处理后续rewrite规则,执行{}块内其他指令。

其他指令

gzip压缩

压缩响应,减少传输大小,占用CPU。

# 默认打开
gzip on;
# 压缩类型,默认只对html压缩。
gzip_types text/plain applicaton/xml;
# 压缩大小,超过1000字节才压缩
gzip_min_length 1000;

sendfile

nginx默认会在传输文件前将其复制到缓冲区,使用sendfile指令,可以禁用复制到缓冲区。类似Java中的零拷贝(zero copy)。

location /download{
	sendfile on;
	# 能在获得数据后立即获得响应标头
	tcp_nopush on;
}

try_files

检查指定的文件或目录是否存在,若不存在可以指定位置或状态码。

server{
	root www/data;
	location /images/ {
		try_files $uri /images/default.jpg;
	}
	// 可以指定多 个路径
	location / {
		try_files $uri $uri/ /$uri.html = 404;
	}
}

error_page

error_page 404 	   /404.html
error_page 500 502 503 504    /500.html

推荐写法和注意事项

注意事项示例
重复的配置可以继承自父级在这里插入图片描述
不要将所有的请求都代理到后端服务器在这里插入图片描述
若非必要,不要缓存动态请求,仅缓存静态文件
检查文件是否存在用try_files替代if -f在这里插入图片描述
在重写路径中包含httphttps在这里插入图片描述
保持重写规则简单干净在这里插入图片描述

不要将所有的请求都代理到后端服务器

配置示例:先去本地目录查询,查找不到再去后台查找

server{
    listen 8002;
    server_name ruoyi-tomcat;

    location / {
        try_files $uri $uri/ @proxy;
    }

    location @proxy {
        proxy_pass http://localhost:8080;
        # 代理请求头:Nginx主机地址
        proxy_set_header Host $http_host;
        # 代理请求头:用户真实IP,即客户端IP
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

注意事项:

  1. 正确的配置未生效,可以清除或禁用浏览器缓存。
  2. 在https中不要启用SSLv3。并可以使用ssl_protocols TLSv1 TLSv1.1 TLSv1.2来禁用。
  3. 不要将root目录配置成//root
  4. 谨慎的使用chmod 777 。可以使用namei -on /path/to/check来显示路径上的权限。
  5. 不要将部署的项目拷贝到默认目录。(在升级nginx的时候或许覆盖)
致谢:B站UP主,阿姨洗铁路我洗海带哟
Nginx课程:BV1rG4y1e7BQ
课件链接:https://www.yuque.com/wukong-zorrm/cql6cz
虚拟机网盘链接:https://pan.baidu.com/s/1NmCR-vdAcZLouRRn9V1yTA 密码: 1b60
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Huathy-雨落江南,浮生若梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值