Nginx 进阶篇

news2024/11/19 0:42:31

文章目录

  • Nginx 进阶篇
    • 五、 服务配置
      • 1、 配置成系统服务
      • 2、 配置环境变量
    • 六、 部署静态资源
      • 1、 概述
      • 2、 配置指令
        • 2.1 listen
        • 2.2 server_name
        • 2.3 location
        • 2.4 root
        • 2.5 alias
        • 2.6 index
        • 2.7 error_page
      • 3、 静态资源优化配置语法
      • 4、 静态资源压缩模块
        • 4.1 Gzip 模块配置指令
        • 4.2 配置实例
        • 4.3 Gzip 和 sendfile
      • 5、 静态资源的缓存处理
        • 5.1 缓存处理过程
        • 5.2 缓存相关指令
      • 6、 静态资源防盗链
      • 7、 Rewrite 功能配置
        • 7.1 相关指令
        • 7.2 rewrite 指令
          • 7.2.1 rewrite
          • 7.2.2 rewrite_log
    • 七、 Nginx 反向代理
      • 1、 反向代理概述
      • 2、 反向代理配置语法
        • 2.1 proxy_pass
        • 2.2 proxy_set_header
        • 2.3 proxy_redirect
      • 3、 Nginx 安全机制
        • 3.1 安全隔离
        • 3.2 使用 SSL 加密
        • 3.3 SSL 相关指令
          • 3.3.1 ssl_certificate
          • 3.3.2 ssl_certificate_key
          • 3.3.3 ssl_session_cache
          • 3.3.4 ssl_session_timeout
          • 3.3.5 ssl_ciphers
          • 3.3.6 ssl_prefer_server_ciphers
        • 3.4 生成证书
        • 3.5 开启 SSL 实例
      • 4、 反向代理系统调优
        • 4.1 概念
        • 4.2 相关指令
          • 4.2.1 proxy_buffering
          • 4.2.2 proxy_buffers
          • 4.2.3 proxy_buffer_size
          • 4.2.4 proxy_busy_bufers_size
          • 4.2.5 proxy_temp_path
          • 4.2.6 proxy_temp_file_write_size

Nginx 进阶篇

五、 服务配置

经过前面的操作,我们会发现,如果想要启动、关闭或重新加载nginx配置文件,都需要先进入nginx的安装目录的sbin目录,然后使用nginx的二进制可执行文件来操作,相对来说比较繁琐,那这块该如何优化呢?另外如果我们想要吧Nginx设置成随着服务器启动就自动完成启动操作,又该如何实现?

1、 配置成系统服务

把Nginx应用服务器设置成为系统服务,方便对Nginx服务的启动和停止等相关操作,具体实现步骤:

  1. 添加服务:

    cat << EOF > /usr/lib/systemd/system/nginx.service 
    [Unit]
    Description=nginx web service
    Documentation=http://nginx.org/en/docs/
    After=network.target
     
    [Service]
    Type=forking
    PIDFile=/usr/local/nginx/logs/nginx.pid
    ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
    ExecStart=/usr/local/nginx/sbin/nginx
    ExecReload=/usr/local/nginx/sbin/nginx -s reload
    ExecStop=/usr/local/nginx/sbin/nginx -s stop
    PrivateTmp=true
     
    [Install]
    WantedBy=default.target
    EOF
    
  2. 修改文件的权限:

    chmod 755 /usr/lib/systemd/system/nginx.service
    
  3. 常用命令:

    启动: systemctl start nginx
    停止: systemctl stop nginx
    重启: systemctl restart nginx
    重新加载配置文件: systemctl reload nginx
    查看nginx状态: systemctl status nginx
    开机启动: systemctl enable nginx
    

如果是使用yum来安装的话,则已经配置好这些

2、 配置环境变量

前面我们介绍过nginx安装目录下的二进制可执行文件nginx的很多命令,要想使用这些命令前提是需要进入sbin目录下才能使用,很不方便,如何去优化呢?我们可以将二进制可执行文件加入到系统环境变量中,这样的话,在任何目录都可以使用nginx对应的相关命令。

cat << EOF >> /etc/profile
export PATH="$PATH:/usr/local/nginx/sbin"
EOF
source /etc/profile
nginx -v

六、 部署静态资源

1、 概述

上网去搜搜索访问资源对于我们并不陌生,通过浏览器发送一个HTTP请求实现从客户端发送请求到服务器端获取所需要的内容后并把内容回显展示在页面的一个过程。这个时候,我们所请求的内容分为两种类型:一类是静态资源,一类是动态资源。

  • 静态资源即指在服务器端真实存在并且能够拿来展示的一些文件,比如常见的html,css,js,image,video等
  • 动态资源即指在服务端真实存在但是要想获得需要经过一定的业务逻辑处理,根据不同的条件展示在页面不同的内容,比如说报表数据展示,根据当前登录用户展示相关具体数据等资源

2、 配置指令

指令可以通过官方文档来进行学习:https://nginx.org/en/docs/

2.1 listen

listen指令:用来配置监听端口

语法默认值位置
listen address[:port] [default_server]...
listen port [default_server]...
`listen *:80*:8000`

listen的设置比较灵活,default_server属性是标识符,用来将此虚拟主机设置成默认主机。所谓默认主机指的是如果没有匹配到对应的address:port,则会默认执行的。如果不指定默认使用的是第一个server

server {
	listen 8080;
	server name 127.0.0.1;
	location / {
		root html
		index index.html;
	}
}
server {
	listen 8080 default_server;  # 设置为默认的服务,但所有服务不匹配时,会使用这个服务
}

2.2 server_name

server_name指令:用来设置虚拟主机服务名称

127.0.0.1locahost,域名

语法默认值位置
server_name name ...;server_name: "";server

关于server_name的配置方式有三种,分别是:

  • 精确匹配

    server {
    	listen 80;
    	server_name www.liuzhongkun.com www.liuzhongkun.cn;
    	...
    }
    
  • 通配符匹配

    server {
    	listen 80;
    	server_name *.liuzhongkun.*;  # 注意,通配符只能出现在首段或者尾端,不能出现在中间位置
    }
    
  • 正则表达式匹配

    其可以使用正则表达式,并且使用~最为正则表达式字符串的开始标记。

    server {
    	listen 80;
    	server_name ~^www\.(\w+)\.com$;  # 注意,~后面不能加空格
    	...
    	location / {
    		return 200 "==>access==>>$1";  # 这个$1获取上面正则匹配的括号里面的东西
    	}
    }
    
  • 匹配执行顺序

    由于server_name指令支持通配符和正则表达式,因此在多个虚拟主机的配置文件中,可能会出现一个名称被多个虚拟主机匹配成功的情况。

    1. 准确匹配的server_name
    2. 通配符在开始时匹配server_name
    3. 通配符在结束时匹配server_name
    4. 正则表达式匹配server_name
    5. 被默认的default_server处理,如果没有指定默认,则找第一个server

2.3 location

location指令:用来设置请求的url

语法默认值位置
`location [=~~*

uri变量是待匹配的请求字符串,可以不包含正则表达式,也可以包含正则表达式,那么nginx服务器在搜索匹配location的时候,是先使用不包含正则表达式进行匹配,找到一个匹配度最高的一个,然后在通过包含正则表达式的进行匹配,如果能匹配到直接访问,匹配不到,就使用刚才匹配度最高的那个location来处理请求。。

属性介绍:

  • 不带符号,,要求必须以指定模式开始

    server {
    	listen 80;
    	server_name 127.0.0.1;
    	location /abc {
    		default_type text/plain;
    		return 200 "access success";
    	}
    }
    # 127.0.0.1/abc 
    # 127.0.0.1/abc?p=1 
    # 127.0.0.1/abc/  
    
  • =:用于不包含正则表达式的uri前,必须与指定的模式精确匹配

    server {
    	listen 80;
    	server_name 127.0.0.1;
    	location =/abc {
    		default_type text/plain;
    		return 200 "access success";
    	}
    }
    # 127.0.0.1/abc 
    # 127.0.0.1/abc?p=1 
    # 127.0.0.1/abc/ 这个是访问不到的
    
  • ~[*]:用于表示当前uri中包含了正则表达式,并且区分大小写;如果加了星号,则其为不区分大小写的

    server {
    	listen 80;
    	server_name 127.0.0.1;
    	location ~^/abc\w$ {
    		default_type text/plain;
    		return 200 "access success";
    	}
    }
    # 127.0.0.1/abc 
    # 127.0.0.1/abcf
    # 127.0.0.1/abc?p=1 
    # 127.0.0.1/abc/ 这个是访问不到的
    
  • ^~:用于不包含正则表达式的uri前,功能和不加符号的一致,唯一不同的是,如果模式匹配,那么就停止搜索其他模式了

2.4 root

root:设置请求的根目录

语法root path
默认值root html
位置http、server、location

path:其为Nginx服务器接收到请求以后查找资源的根目录路径

2.5 alias

其作用为用来更改location的URI

语法默认值位置
alias path-location

path:其为修改后的根目录

比如:

  1. /usr/local/nginx/html目录下创建一个images目录,并在目录下放入一张图片1.png

    location /images {
    	root html;
    }
    

    访问图片的路径为:http:locahost/images/1.png

  2. 如果把root改为alias

    location /images {
    	alias html;
    }
    

    再次访问该地址时,页面会出现404的错误,查看日志会法案现是因为地址不对,其访问的地址为:/usr/local/nginx/html/1.png,如果需要修改的话,则:alias html/images

root的处理结果就是:root 路径+ location 路径

alias的处理结果就是:使用 alias 路径替换 location 路径

2.6 index

index:设置网站的默认首页

语法默认值位置
index file…index index.htmlhttp、server、location

index后面可以跟多个设置,如果访问的时候没有指定具体访问的资源,则会依次进行查找,找到第一个为止。

如:

location / {
            root   html;
            index  index.html index.htm;
        }

访问该location的时候,可以通过 http://localhost:port/,地址后面如果不添加任何内容,则默认依次访问 index.html、index.htm ,找到第一个来进行访问。

2.7 error_page

error_page:设置网站的错误页面

语法默认值位置
error_page code …[=[response]] uri;-htttp、server、location …

当出现对应的响应code之后,如何来处理;

  • 可选项=[response]的作用是用来将对应代码更改为另外一个响应,这个是修改返回的响应状态码
  • 如:error_page 404 =200 http://www.baidu.com

比如:

  1. 指定具体的网址:

    error_page 404 http://www.baidu.com;
    
  2. 进行重定向:

    server {
        error_page 500 502 503 504 /50x.html;
        location =/50x.html {
        	root html;
        }
    }
    
  3. 使用location的#符号完成错误信息提示:

    server {
    	error_page 404 @jump_to_error;
        location @jump_to_error {
        	default_type text/plain;
            return 404 'Not Fount Page...'
        }
    }
    

3、 静态资源优化配置语法

Nginx 对静态资源如何进行优化配置。这里从三个属性配置进行优化:

sendfile on;
tcp_nopush on;
tcp_nodeplay on;
  1. sendfile:用来开启高效的文件传输模式

    语法默认值位置
    sendfile on | off;sendfile off;http、server、location

    请求静态资源的过程:客户端通过网络接口向服务端发送请求,操作系统将这些客户端的请求传递给服务端应用程序,服务端应用程序会处理这些请求,,请求处理完成以后,操作系统还需要将处理得到的结果通过网络适配器传递回去。

  2. tcp_nopush:该指令必须在 sendfile 打开的状态下才会生效,主要是用来提升网络包的传输效率。

    语法默认值位置
    tcp_nopush on | off;tcp_nopush off;http、server、location
  3. tcp_nodelay:该指令必须在 keep-alive 连接开启的情况下才生效,来提高网络包传输的实时性。

    语法默认值位置
    tcp_nodelay on | off;tcp_nodelay on;http、server、location

这三个指令都开启的好处是,sendfile 可以开启高效的文件传输模式,tcp_nopush 开启可以确保在发送到客户端之前数据包已充分填满,tcp_nodelay 强制套接字发送数据包。

4、 静态资源压缩模块

在 Nginx 配置文件中可以通过配置 gzip 来对静态资源进行压缩,相关的指令可以配置在 http、server、location 中,Nginx可以通过:

ngx_http_gzip_module 
ngx_http_gzip_static_module
ngx_http_gungzip_module

4.1 Gzip 模块配置指令

接下来所学习的指令都来自于 ngx_http_gzip_module 模块,该模块会在 Nginx 安装的时候内置到 Nginx 的安装环境中,也就是说,我们可以直接使用这些命令:

  1. gzip 命令:

    语法默认值位置
    gzip on | off;gzip off;http、server、location …

    只有这个指令处于打开状态,下面的指令才有效果

  2. gzip_types:该指令可以根据响应也的 MIME 类型选着性地开启 Gzip 压缩功能

    语法默认值位置
    gzip_types mime-type …;gzip_types text/html;http、server、location

    所选择的值也可以使用 * 号来替代,开发过程中不建议这样使用。

  3. gzip_comp_level:该指令用于设置 Gzip 压缩程度,级别为 1~9 ;程度最低,则效率最高。

    语法默认值位置
    gzip_comp_level level;gzip_comp_level 1;http、server、location
  4. gzip_vary:该指令用于设置使用 Gzip 进行压缩发送是否携带 Vary:Accept-Encoding头域的响应头部。主要是告诉接收方,所发送的数据经过了 Gzip 压缩处理。

    语法默认值位置
    gzip_vary on | off;gzip_vary off;http、server、location
  5. gzip_buffers:该指令用于处理请求压缩的缓冲区数量和大小。

    语法默认值位置
    gzip_buffers number size;gzip_buffers 32 4k | 16 8k;http、server、location

    参数:

    • number:指定Nginx服务器向系统申请缓存空间个数
    • size:每个缓存空间的大小
  6. gzip_disable:针对不同种类客户端发起的请求,可以选择性的开启或关闭 Gzip 功能

    语法默认值位置
    gzip_disable regex …;-http、server、location

    regex:根据客户端的浏览器请求头来设置,支持使用正则表达式,如:gzip_disable "MSIE [1-6]\.";

  7. gzip_http_version:针对不同的 HTTP 协议版本,可以选择性地开启或关闭 Gzip 功能

    语法默认值位置
    gzip_http_version 1.0 | 1.1;gzip_http_version 1.1;http、server、location
  8. gzip_min_length:该指令针对传输数据的大小,可以选择性地开启或关闭 Gzip 功能

    语法默认值位置
    gzip_min_length length;gzip_min_length 20;http、server、location

    Gzip 压缩功能对大数据的压缩效果明显,但是如果压缩的数据比较小的话,可能会出现压缩数据量越大的情况,这个单位是 bytes。

  9. gzip_proxied:该指令设置是否对服务端返回的结果进行 Gzip 压缩

    语法默认值位置
    gzip_proxied off | expired | no-cache |
    no-store | private | no_last_modified |
    no-etag | auth | any;
    gzip_proxied off;http、server、location

    表现出来的形式就是头部信息的不一样,如:no-cache的 header 中包含 Cache-Control:no-cache信息,以此类推。

4.2 配置实例

gzip on;  # 开启 gzip 功能
gzip_types *;  # 压缩元文件类型,根据具体的访问资源类型设定
gzip_comp_level 6;  # gzip 压缩级别
gzip_min_length 1024;  # 进行压缩响应页面的最小长度,content-length
gzip_buffers 4 16k;  # 缓存空间大小
gzip_http_version 1.1;  # 指定亚胡搜响应所需要的最低 HTTP 请求版本
gzip_vary on;  # 往头部信息中添加压缩标识
gzip_disable "MISE [1-6]\.";  # 对 IE6 以下的版本都不进行压缩
gzip_proxied off;  # nginx 作为反向代理压缩服务端返回数据的条件

这些配置在很多地方可能都会用到,所以我们可以将这些内容抽取到一个配置文件nginx_gzip.conf中,然后通过 include 指令把配置文件再次加载到 nginx.conf 配置文件中,方便使用。

include nginx_gzip.conf;

4.3 Gzip 和 sendfile

在我们使用 sendfile 的时候,我们提到过,开启 sendfile 以后,在读取磁盘上的静态资源文件通过网络设备发送出去,但是 Gzip 要想对资源压缩,是需要经过用户进程进行操作的。所以如何解决两个设置共存的问题呢?

  • 这里我们可以使用 ngx_http_gzip_static_module 模块的 gzip_static 指令来解决。

gzip_static

作用:检测和访问资源同名的 .gz 文件时,,response 中移 gzip 相关的 header 返回 .gz 文件的内容

语法默认值位置
gzip_static on | off | always;gzip_static off;http、server、location

添加上述命令后,会报一个错误,unkonwn directive "gzip_static"

  • 主要原因是 Nginx 默认是没有添加 ngx_http_gzip_static_module 模块。

  • 添加方式:

    nginx -V  # 查看当前 Nginx 的配置参数,获取到原来编译的参数
    mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old  # 将 Nginx 安装目录下 sbin 目录中的 Nginx 二进制文件进行改名
    cd /root/nginx/croe/nginx-1.22.1  # 进入安装目录
    make clean  # 清空之前编译的内容
    ./configure old_args  --with-http_gzip_static_module  # 使用 configure 来配置参数
    make  # 使用命令进行编译以及安装
    mv objs/nginx /usr/local/nginx/sbin  # 将生成的二进制文件移动到 Nginx 安装目录下
    make upgrade  # 执行更新命令
    

5、 静态资源的缓存处理

5.1 缓存处理过程

具体可以查看这篇文章:https://www.imooc.com/article/302614

HTTP协议中和页面缓存相关的字段,我们首先来认识一下:

header说明
Expires缓存过期的日期和时间
Cache-Control设置缓存相关的配置信息
Last-Modified请求资源最后修改的时间
ETag请求变量的实体标签和当前值,比如文件的 MD5 值

5.2 缓存相关指令

Nginx 需要进行缓存的相关设置,就需要用到如下的指令:

expires

作用:用来控制页面缓存的作用,可以通过该指令控制 HTTP 应答中的 “Expires” 和 “Cache-Control”

语法默认值位置
expires [modified] time;
expires epoch | max | off;
expires off;http、server、location

参数:

  • time:可以整数也可以是负数,指定过期时间,如果是负数,Cache-Control 则为 no-cache ,如果为整数或 0,则 Cache-Control 的值为 max-age=time;
  • epoch:指定 Expires 的值为 ‘1 January,1970,00:00:01 GMT’,Cache-Control 的值为 no-cache
  • max:指定 Expires 的值为 ‘31 December2037 23:59:59 GMT’,Cache-Control 的值为 10 年
  • off:默认不缓存

add_header

作用:用来添加指定的响应头和响应值

语法默认值位置
add_header name value [always];-http、server、location…

这里是用来解决跨域问题:

  • 需要添加两个头信息

    1. 允许跨域访问的原地址信息:Access-Control-Allow-Origin

      可以配置多个(多个用逗号分割),也可以使用 * 代表所有源

    2. 允许跨域访问的请求方式:Access-Control-Allow-Methods

      根据需要设置,GET,POST,PUT,DEETE …

6、 静态资源防盗链

什么是资源盗链?

  • 资源盗链指的是此内容不在自己服务器上,而是通过技术手段,绕过别人的限制将别人的内容放到自己页面上最终展示给用户。以此盗取大网站的空间和流量。简而言之,就是用别人的东西,成就自己的网站。

Nginx 防盗链实现原理:

  • 后台服务器可以根据获取到 Referer 信息来判断是否为自己信任的网站地址,如果是则放行继续访问,如果不是则可以返回 403 的状态信息

Nginx 防盗链的具体实现:

vaild referers:Nginx 会通过查看 referer 自动和 vaild_referers 后面的内容进行匹配,如果匹配到了就将变量 $invaild_referer = 0,否则该变量的值为1

语法默认值位置
vaild_referers none | blocked | server_names | string …-server、location

参数:

  • none:如果 Header 中的 Referer 为空,允许访问
  • blocked:在 Header 中的 Referer 不为空,但是该值被防火墙或代理进行伪装过,如不带 ‘http://’ 等协议头的资源允许访问
location ~ .*\.(png|jpg|gif)$ {
    vaild_referers none blocked www.baidu..com 
    if ($invaild_referer) {
        return 403;
    }
    root html/images;
}

如果我们的图片很多,该如何批量进行防盗链呢?

  • 我们可以对一个目录下的所有资源进行操作
  • 但是,Referer 的限制比较粗,比如随意加一个 Referer ,上面的方式是无法进行限制的,那这个问题该如何解决呢?
    • 我们需要使用到 Nginx 的第三方模块 ngx_http_accesskey_module

7、 Rewrite 功能配置

Rewrite 是 Nginx 服务器提供的一个重要基本功能,是 web 服务器产品中几乎必备的功能。主要的作用是用来实现 URL 的重写

  • Nginx 使用的是 ngx_http_rewrite_module 模块来解析和处理 Rewrite 功能的相关配置

7.1 相关指令

  1. set

    该指令用来设置一个新的变量:

    语法默认值位置
    set $variable value;-server、http、if

    variable:变量名称,该变量名称需要使用 $ 作为变量的第一个字符,且不要与 Nginx 服务器预设的全局变量同名

    value:变量的值,可以是字符串、、其他变量或变量的组合等

    全局变量:https://blog.csdn.net/ljl890705/article/details/80169734

    • 这些全局变量可以在 log_format中使用
  2. if

    该指令用来支持条件判断,并根据条件判断结果选择不同的 Nginx 配置

    语法默认值位置
    if (condition){…}-server、location

    使用示例:

    if ($request_method = POST) {
    	return 405;
    }
    

    注意:

    • 如果变量名对应的值为空字符串或为0,if 判断为 FALSE
    • 使用 = 或者 != 比较变量和字符串是否相等
    • if 和括号之间需要有一个空格

    正则表达式匹配

    匹配成功返回 true,失败返回 false。变量与正则表达式之间使用 “~”, “~*”, “!~”, “!~*” 来连接。

    • “~” 代表匹配正则表达式过程中区分大小写
    • “~*” 代表匹配真正则表达式过程中不区分大小写
    • “!~” 和 “!~*” 刚好和上面区相反值,如果匹配成功返回 false
    if ($http_usr_agent ~ MSIE) {
    	# 如果 user_agent 中包含 MSIE 字符串
    }
    

    注意:正则表达式字符串一般不需要加引号,但是如果字符串中包含 “}” 或者 “;” 等字符时,就需要把引号加上

    判断请求文件是否存在时,使用"-f" 和 “!-f”:

    if (-f $request_filename) {...}  # 判断文件是否存在
    

    判断请求的目录是否存在时,使用"-d" 和 “!-d”

    判断请求的目录或者文件是否存在时,使用"-e" 和 “!-e”

    判断请求的文件是否可执行时,使用"-x" 和 “!-x”

  3. break

    该指令用于中断当前相同作用域中的其他 Nginx 配置。与该指令处于同一作用域的 Nginx 配置中,位于它前面的指令配置生效,位于后面的指令配置无效。并且 break 还有另外一个功能就是终止当前的匹配并把当前的 URI 在本 location 进行重定向访问处理。

    location / {
        defaule_type text/html;
        if ($args) {
        	set $username Mike;
            break;
            set $username Nick;
        }
        return 200 $username;
    }
    
  4. return

    该指令用于完成对请求的处理,直接向用户端返回。在 return 后的所有 Nginx 配置都是无效的。

    语法默认值位置
    return code [text];
    return code URL;
    return URL;
    -server、location、if

7.2 rewrite 指令

7.2.1 rewrite

该指令通过正则表达式的使用来改变 URI。可以同时存在一个或者多个指令,按照顺序依次对 URL 进行匹配处理。

语法默认值位置
rewrite regex replacement [flag];-server、location、if
location /rewrite {
    rewrite ^/rewrite/url\w*$ https://www.baidu.com;
    rewrite ^/rewrite/(test)\w*$ /$1;  # 括号使用的是分组的方法,这里面是前往/test
}

flag:用来设置 rewrite 对 URI 的处理行为,可选值:

  • last:终止继续在本 location 块中处理接收到的 URI,并将此处重写的 URI 作为一个新的 URI,使用各 location 块进行处理。
  • break:将此处重写的 URI 作为一个新的 URI ,在本块中继续进行处理,该标志将重写后的地址在当前 location 块中执行,不会将新的 URI 转向其他 location 块。
  • redirect:将重写后的 URI 返回给客户端,状态码为 302,指明是临时重定向 URI,主要用在 replacement 变量不是以 "http[s]😕/"开头的情况。
  • permanent:将重写后的 URI 返回给客户端,状态码为 301,指明是永久重定向 URI,主要用在 replacement 变量不是以 "http[s]😕/"开头的情况。
7.2.2 rewrite_log

该指令配置是否开启 URI 重写日志输出功能

语法默认值位置
rewrite_log on | off;rewrite_log off;http、server、location、if

开启后,URI重写的相关日志将以 notice 级别输出到 error_log 指令配置的日志文件汇总。

七、 Nginx 反向代理

1、 反向代理概述

Nginx 即可实现正向代理,也可以实现反向代理。

2、 反向代理配置语法

Nginx 反向代理的指令是由ngx_http_proxy_module模块进行解析。

2.1 proxy_pass

该指令用来设置代理服务器地址,可以是主机名称、IP 地址+端口号形式。

语法默认值位置
proxy_pass URL;-location

URL:其为被代理服务器地址

proxy_pass http://192.168.56.101:8080

这个地址后面需要加斜杆吗?

location /server {
	# proxy_pass http://192.168.56.101:8080 
    # 我们请求 http://192.168.56.101/server/index.html -> http://192.168.56.101:8080/server/index.html
    # 加了斜杆后
    # proxy_pass http://192.168.56.101:8080/
    # 我们请求 http://192.168.56.101/server/index.html -> http://192.168.56.101:8080/index.html
}

2.2 proxy_set_header

该指令可以更改 Nginx 服务器接收到的客户端请求的请求头信息。然后将新的请求头发送给被代理的服务器

语法默认值位置
proxy_set_header field value;proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
http、server、location

需要注意的是,如果想要看到结果,必须在被代理的服务器上来获取添加的头部信息

2.3 proxy_redirect

该指令是用来重置头信息中 “Location” 和 “Refresh” 的值。

语法默认值位置
proxy_redirect redirect replacement;
proxy_redirect default;
proxy_redirect off;
proxy_redirect default;http、server、location

3、 Nginx 安全机制

3.1 安全隔离

关于 Web 服务器的安全是比较大的问题,Nginx 反向代理是如何提升 Web 服务器的安全呢?

  • 我们可以使用安全隔离

什么是安全隔离呢?

  • 通过代理分开了客户端到应用程序服务端的连接,实现了安全措施。在反向代理之前设置防火墙,仅留一个入口代理服务器访问。

3.2 使用 SSL 加密

将我们常用的 http 请求转变成 https 请求,那么这两个之间的区别简单来说都是HTTP协议,只不过 https 是被 SSL 进行加密的 http (http + SSL)。

HTTPS 是这一种通过计算机网络进行安全通信的传输协议。它经由 HTTP 进行通信,利用 SSL/TLS 建立全通信,加密数据包,确保数据的安全性。

Nginx 要想使用 SSL,需要满足一个条件即需要添加一个模块,--with-http_ssl_module,而该模块在编译的过程中又需要 OpenSSL 的支持。

3.3 SSL 相关指令

我们可以使用 listen 443 ssl 开启SSL,也可以使用ssl on,来开启 SSL。

3.3.1 ssl_certificate

为当前这个虚拟主机指定一个带有 PEM 格式的证书

语法默认值位置
ssl_certificate file;-http、server
3.3.2 ssl_certificate_key

该指令用来指定 PEM secret key 文件的路径

语法默认值位置
ssl_certificate_key-http、server
3.3.3 ssl_session_cache

该指令用来配置用于 SSL 会话的缓存

语法默认值位置
ssl_session_cache off | none | [builtin[:size]] [shared:name:size]ssl_session_cache none;http、server

参数说明:

  • off:禁用会话缓存,客户端不得重复使用会话
  • none:禁止使用会话缓存,客户端可以重复使用,但是并没有在缓存中存储会话参数
  • builtin:内置 OpenSSL 缓存,仅在一个工作进程中使用
  • shared:所有工作进程之间共享缓存,缓存的相关信息用 name 和 size 来指定
3.3.4 ssl_session_timeout

开启 SSL 会话功能后,设置客户端能够反复使用存储在缓存中的会话参数时间

语法默认值位置
ssl_session_timeout time;ssl_session_timeout 5m;http、server
3.3.5 ssl_ciphers

指出允许的密码,密码指定为 OpenSSL 支持的格式

语法默认值位置
ssl_ciphers ciphers;ssl_cipehers HIGH:!aNULL:!MD5;http、server
3.3.6 ssl_prefer_server_ciphers

该指令指定是否服务器密码优先客户端密码

语法默认值位置
ssl_prefer_server_cipher on | off;ssl_prefer_server_cipher off;http、server

3.4 生成证书

方式一:使用阿里云或者腾讯云等第三方服务进行购买;

方式二:使用 OpenSSL 生成证书。

  1. 确定系统安装 OpenSSL

    openssl version
    
  2. 使用命令生成证书

    mkdir /root/cert
    cd /root/cert
    openssl genrsa -des3 -out server.key 2048
    openssl req -new -key server.key -out server.csr
    cp server.key server.key.org
    openssl rsa -in server.key.org -out server.key 
    openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
    

3.5 开启 SSL 实例

server {
    listen                  443 ssl;  # SSL 默认访问端口号为 443
    server_name             localhost;  # 填写绑定证书的域名
    ssl_certificate         /root/cert/server.crt;  # 填写证书文件的相对路径或者绝对路径
    ssl_certificate_key     /root/cert/server.key;  # 填写密钥文件的相当路径或者绝对路径
    ssl_session_cache       shared:SSL:1m;  # 会话缓存
    ssl_session_timeout     5m;  # 连接超时的时长
    ssl_ciphers             ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;  # 加密套件,密码格式
    ssl_protocols           TLSv1.2 TLSv1.3; # 协议配置
    ssl_prefer_server_ciphers on;  # 优先使用服务端密码


    location / {
        root   html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}
server {
    listen          80;  # 监听 80 端口
    server_name     localhost;  # 绑定证书的域名
    location / {
            rewrite     ^/ https://$host$request_uri permanent;  # 将所有的 http 请求全部转换为 https 的请求
    }
}

然后,我们就可以使用 https 来进行访问了。

4、 反向代理系统调优

4.1 概念

反向代理值 Buffer 和 Cache

总结:

  • 相同点

    • 都是用来提供 IO 吞吐效率
    • 都是用来提升 Nginx 代理的性能
  • 不同点

    • 缓冲主要是用来解决不同设备之间数据传递速度不一致导致的性能低的问题,缓存中的数据一旦此次操作完成后,就可以删除
    • 缓存主要是备份,将被代理服务器的数据缓存备份到代理服务器,这样的话,客户端再次获取相同数据的时候,就只需要从代理服务器上获取,效率较高,缓存中的数据可以重复使用,只有满足特定条件才会删除

4.2 相关指令

4.2.1 proxy_buffering

该指令用来开启或关闭代理服务器的缓冲区:

语法默认值位置
proxy_buffering on | off;proxy_buffering on;http、server、location
4.2.2 proxy_buffers

该指令用来指定单个连接从代理服务器读取响应的缓存区的个数和大小

语法默认值位置
proxy_buffers number size;proxy_buffers 8 4k;(与系统平台有关)http、server、location
4.2.3 proxy_buffer_size

该指令用来设置被代理服务器获取的第一部分响应数据的大小。保持与 proxy_buffers 中的 size 相同即可,当然也可以更小。

语法默认值位置
proxy_buffer_size size;proxy_buffer_size 4k | 8k;(与系统平台有关)http、server、location
4.2.4 proxy_busy_bufers_size

该指令用来限制同时处于 BUSY 状态的缓冲区的总大小

语法默认值位置
proxy_busy_bufers_size size;proxy_busy_bufers_size 8k | 16K;http、server、location
4.2.5 proxy_temp_path

当缓冲区存满后,仍未被 Nginx 服务器完全接受,响应数据就会被临时存放在磁盘文件上,该指令设置文件路径

语法默认值位置
proxy_temp_path path;proxy_temp_path proxy_temp;http、server、location

注意:path 最多三层

4.2.6 proxy_temp_file_write_size

该指令用来设置磁盘上缓冲文件的大小

语法默认值位置
proxy_temp_file_write_size size;proxy_temp_file_write_size 8k | 16k;http、server、location

通用网站的配置:

proxy_buffering on;
proxy_buffer_size 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

根据项目的具体内容进行相应的调节。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Linux运维实战:Centos7.6基于ansible一键离线部署redis6.2.8容器版之哨兵集群》

一、部署背景 由于业务系统的特殊性&#xff0c;我们需要针对不同的客户环境部署redis 哨兵集群&#xff0c;由于大都数用户都是专网环境&#xff0c;无法使用外网&#xff0c;为了更便捷&#xff0c;高效的部署&#xff0c;针对业务系统的特性&#xff0c;我这边编写了基于ans…

唤醒手腕 Go 语言开发学习笔记(基本简介、环境安装)

1. Go语言简介 Go&#xff08;又称 Golang&#xff09;是 Google 的 Robert Griesemer&#xff0c;Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近&#xff0c;但功能上有&#xff1a;内存安全&#xff0c;GC&#xff08;垃圾回收&#xf…

Java中String类的常见问题

目录 Q1&#xff1a;为什么String类要定义成不可变类型&#xff1f; 方便String对象缓存HashCode值 字符串常量池的需要 衍生问题&#xff1a;String str new String("hello world") 创建了几个对象&#xff1f; 为了保障程序的安全性 Q2&#xff1a;String的…

2022年深度学习在时间序列预测和分类中的研究进展综述

时间序列预测的transformers的衰落和时间序列嵌入方法的兴起&#xff0c;还有异常检测、分类也取得了进步 2022年整个领域在几个不同的方面取得了进展&#xff0c;本文将尝试介绍一些在过去一年左右的时间里出现的更有前景和关键的论文&#xff0c;以及Flow Forecast [FF]预测…

解决Windows莫名其妙地从休眠状态唤醒的问题

因为经常写代码开很多个工作区&#xff0c;电脑经常就是合盖休眠&#xff0c;这样打开就能用&#xff0c;但是总是在我不经意的时候发现电脑风扇在狂转&#xff0c;不知道是哪个应用又在qj我的电源管理计划&#xff0c;今天午休发现电脑风扇狂转&#xff0c;打开发现是windows系…

c语言操作符(下)

前言 &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; c语言初阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>: 讲解c语言中有关操作符的知识. 金句分享: ✨✨✨行程…

我用python写了个小病毒,老板再也不敢扣我工资啦

名字&#xff1a;阿玥的小东东 学习&#xff1a;python正在学习c 主页&#xff1a;阿玥的小东东 今天做个什么呢&#xff0c;我的好朋友提议做一个关机的代码吧&#xff0c;我这一想&#xff0c;对吼&#xff0c;我以前还做过一个关机代码呢&#xff0c;于是乎&#xff0c;今天…

时序收敛技巧之寄存器复制

1、何时需要复制寄存器&#xff1f; 在设计中的关键路径发现某个寄存器具有高扇出和高延迟时&#xff0c;使用寄存器复制是个不错的实现时序收敛的方法。下图是一个典型的例子&#xff1a; 可以看出&#xff0c;第一个寄存器的 IC(InterConnect) 延迟为 1.476ns&#xff0c;该寄…

seo站内优化的方法有哪些(站内优化和站外优化)

站内部优化什么意思 网站优化公司的内部优化意味着什么&#xff1f;网站内部优化&#xff0c;就是网站关键词优化、内容优化、内链优化等等&#xff0c;网站要有一定的排名和流量&#xff0c;要做到内部优化&#xff0c;要做到最快&#xff0c;最快的优化排名&#xff1f;接下…

「认知」打工人的自我修养

都说认知以外的钱难搞&#xff0c;那认知内的呢&#xff1f; 01互联网内卷年代&#xff0c;作为不着调的普通选手&#xff1b; 在诸多花里胡哨的黑话中&#xff0c;个人最待见的就是"认知"这个词&#xff1b; 认知&#xff0c;有强烈的抽象感&#xff1b; 想要深刻…

Mr. Cappuccino的第37杯咖啡——Kubernetes资源管理

Kubernetes资源管理kubectl常用的命令陈述式管理方法1. 创建一个namespace2. 查询所有namespace3. 在namespace下运行一个pod4. 查询指定namespace下的pod5. 查看指定pod的详细信息6. 删除pod7. 删除namespace声明式管理方法命令式对象配置1. 创建yaml文件2. 基于yaml文件创建资…

【JavaEE】多线程(初阶)

目录 Thread 线程的创建 线程的常见属性 中断线程 等待线程 休眠线程 线程的状态 多线程相比于单线程的优势 Thread 在Java中操作多线程&#xff0c;最常用的类就是Thread。 Thread 类是 JVM 用来管理线程的一个类&#xff0c;换句话说&#xff0c;每个线程都有一个唯一…

一网打尽带环链表问题(手把着手带你理解,木有基础也能看懂!)

目录 0.前言 1.认识带环链表 2.带环链表OJ问题简述 3.判断是否为带环链表 4. 寻找入环节点&#xff08;法一&#xff1a;数学推理的魅力&#xff09; 5. 寻找入环节点&#xff08;暴力拆解带环链表的魄力&#xff09; 6.番外&#xff1a;判断是否为带环链表(fast和slow的…

树上的DP

ACACAC来的如此之快&#xff0c;让我以为还要再调试几个点(h)&#xff0c;本文涉及思路参考&#xff1a;参考文章 嗯,这个题和思路让我对跨父节点的树上链有了一个认识&#xff0c;我们来看一下&#xff1a; 如果说&#xff0c;我们要对这样的一条链进行dpdpdp操作&#xff0c…

[GXYCTF2019]BabysqliV3.0

发现我们随便上传一个以后返回的是 alert(Wrong pass); 密码错误 如果上传一个账号永真的话返回 Not this user! 没有这个用户&#xff0c;所以感觉可以使用盲注&#xff0c;对账号进行盲注 可是题目 ascii(substr((select database()),1,1))>1 也不对 最后才知道是…

电脑组装配件知识

目录 1.电脑硬件基础知识 1.1CPU 1.2内存 ​编辑 1.3硬盘 1.4主板 1.5显卡 ​编辑 1.6显示器 1.7电源 1.8机箱 2.电脑硬件搭配及选购 2.1硬件搭配原则 2.2怎样查询软件或游戏配置 2.3配件购买注意事项 2.4搭配一台普通办公电脑 3.电脑组装 1.电脑硬件基础知识 …

软件测试/测试开发 | 一文学会 Appium 环境配置

Appium 是一个开源的、跨平台的测试框架&#xff0c;可以用来测试 Native App、混合应用、移动 Web 应用&#xff08;H5 应用&#xff09;等&#xff0c;也是当下互联网企业实现移动自动化测试的重要工具。Appium 坚持的测试理念&#xff1a; •无需用户对 App 进行任何修改或…

OAuth2.0 开放平台认证授权开发套件 Authmore-Framework 1.0 发布

简介 | Intro 基于 OAuth2.0 协议的开放平台认证授权开发套件, 包含授权服务和开放平台 Docker 镜像&#xff0c;基于 Spring Boot Starter 的资源服务工具包和客户端&#xff08;第三方应用&#xff09;工具包 优点 | Advantages 简洁&#xff1a;专注核心功能 —— 社会化…

剑指offer----C语言版----第十六天----面试题22:链表中的倒数第k个节点

目录 1. 链表中倒数第 k 个节点 1.1 题目描述 1.2 思路一 1.3 思路二&#xff1a; 1.4 总结----代码的鲁棒性 1. 链表中倒数第 k 个节点 原题链接&#xff1a; 剑指 Offer 22. 链表中倒数第k个节点 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/l…

竹制品行业市场运行态势及未来前景分析

2023-2029年中国竹制品行业市场运行态势及未来前景分析报告报告编号&#xff1a;1691644免费目录下载&#xff1a;http://www.cninfo360.com/yjbg/qthy/qt/20230110/1691644.html本报告著作权归博研咨询所有&#xff0c;未经书面许可&#xff0c;任何组织和个人不得以任何形式复…