nginx https配置

一.https配置

HTTPS 协议是由HTTP 加上TLS/SSL 协议构建的可进行加密传输、身份认证的网络协议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。

1.生成证书

复制代码
openssl genrsa -des3 -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

2.配置ssl

复制代码
server {
    listen              443 ssl;
    server_name         ruoyi.https;
    ssl_certificate     /home/ssl/server.crt;
    ssl_certificate_key /home/ssl/server.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;
  
    location / {
        proxy_pass http://localhost:8088;
    }
}

如果设置了密码,需要加上

复制代码
server{
  ......
  ssl_password_file   /home/ssl/cert.pass;
  ......
} 

3.https优化

SSL 操作会消耗额外的 CPU 资源。CPU 占用最多的操作是 SSL 握手。有两种方法可以最大程度地减少每个客户端的这些操作数:

  • 使保持活动连接能够通过一个连接发送多个请求
  • 重用 SSL 会话参数以避免并行连接和后续连接的 SSL 握手

会话存储在工作进程之间共享并由 ssl_session_cache 指令配置的 SSL 会话缓存中。一兆字节的缓存包含大约 4000 个会话。默认缓存超时为 5 分钟。可以使用 ssl_session_timeout 指令增加此超时。以下是针对具有 10 MB 共享会话缓存的多核系统优化的示例配置:

复制代码
ssl_session_cache   shared:SSL:10m;
ssl_session_timeout 10m;

二.TCP反向代理

1.stream

bash 复制代码
#HTTP代理
http {
  server {
    listen 8002;
    proxy_pass http://localhost:8080/;
  }
}

#TCP代理
stream {
  server {
    listen 13306;
    proxy_pass localhost:3306;
  }
}

2.tcp负载均衡

bash 复制代码
stream {
  
  upstream backend-mysql {
  
    server localhost:3306;
    server localhost:3307;
    
    keepalive 8;
  }
  
  server {
    listen 13306;
    proxy_pass backend-mysql;
  }
}

使用keepalive定义连接池里空闲连接的数量。

keepalive_timeout 默认60s。如果连接池里的连接空闲时间超过这个值,则连接关闭。

在最简单的 HTTP 实现中,客户端打开新连接,写入请求,读取响应,然后关闭连接以释放关联的资源。

在客户端读取响应后,保持连接处于打开状态,因此可以将其重新用于后续请求。

使用 keepalive 指令启用从 NGINX Plus 到上游服务器的保持活动连接,定义在每个工作进程的缓存中保留的与上游服务器的空闲保持活动连接的最大数量。当超过此数字时,将关闭最近最少使用的连接。如果没有 keepalives,您将增加更多的开销,并且连接和临时端口都效率低下。

现代 Web 浏览器通常会打开 6 到 8 个保持连接。

三.重写(return和rewrite)

nginx有两个重写指令:returnrewrite

1.return

服务端停止处理并将状态码status code返回给客户端

return code URL

return code text

return code

return URL

强制所有请求使用Https

错误写法

bash 复制代码
server {

    listen 8003;
    server_name ruoyi.loadbalance;

    return 301 https://localhost:8004;
}

正确写法

bash 复制代码
server {

    listen 8003;
    server_name ruoyi.loadbalance;

    return 301 https://192.168.56.105:8004;
}

转发和重定向

转发是服务端行为,重定向是客户端行为。

转发

发向代理proxy_pass属于转发,浏览器的访问栏输入的地址不会发生变化。

重定向

return,rewrite属于重定向,在客户端进行。浏览器的访问栏输入的地址会发生变化。

域名迁移,不让用户收藏的链接或者搜索引擎的链接失效

将请求从 www.old-name.com old-name.com 永久重定向到 www.new-name.com,包含http和https请求

bash 复制代码
server {
    listen 80;
    listen 443 ssl;
    server_name www.old-name.com old-name.com;
    return 301 $scheme://www.new-name.com$request_uri;
}

由于捕获了域名后面的 URL 部分,因此,如果新旧网站之间存在一对一的页面对应关系(例如,www.new-name.com/about 具有与 www.old-name.com/about 相同的基本内容),则此重写是合适的。如果除了更改域名之外还重新组织了网站,则通过省略以下内容,将所有请求重定向到主页可能会更安全

bash 复制代码
server {
    listen 80;
    listen 443 ssl;
    server_name www.old-name.com old-name.com;
    return 301 $scheme://www.new-name.com;
}

添加www

bash 复制代码
# add 'www'
server {
    listen 80;
    listen 443 ssl;
    server_name domain.com;
    return 301 $scheme://www.domain.com$request_uri;
}
状态码
  • 2xx 成功
  • 3xx 表示重定向
    • 301 永久重定向
    • 302 临时重定向
  • 4xx 请求地址出错
    • 403 拒绝请求
    • 404 请求找不到
  • 5xx 服务器内部错误

rewrite

‎如果指定的正则表达式与请求 URI 匹配,则 URI 将按照字符串中的指定进行更改。指令按其在配置文件中出现的先后顺序执行。

bash 复制代码
server {
    # ...
    rewrite ^(/download/.*)/media/(\w+)\.?.*$ $1/mp3/$2.mp3 last;
    rewrite ^(/download/.*)/audio/(\w+)\.?.*$ $1/mp3/$2.ra  last;
    return  403;
    # ...
}

上面是使用该指令的示例 NGINX 重写规则。它匹配以字符串 /download 开头的 URL,然后在路径后面的某个位置包含 /media / 或 /audio/ 目录。它将这些元素替换为 /mp3/, 并添加相应的文件扩展名**,.mp3** 或 .ra 。和 变量捕获未更改的路径元素。例如,/download/cdn-west/media/file1 变成了 /download/cdn-west/mp3/file1.mp3 。如果文件名上有扩展名(如 .flv ),则表达式会将其剥离,并将其替换为**.mp3**。

如果字符串包含新的请求参数,则以前的请求参数将追加到这些参数之后。如果不需要这样做,则在替换字符串的末尾放置一个问号可以避免附加它们,例如:replacement

复制代码
rewrite ^/users/(.*)$ /show?user=$1? last;

last与break

last:如果当前规则不匹配,停止处理后续rewrite规则,使用重写后的路径,重新搜索location及其块内指令

break:如果当前规则不匹配,停止处理后续rewrite规则,执行{}块内其他指令

不使用last和break

在root /home/AdminLTE-3.2.0/pages下创建一个1.txt,里面内容是this is a file

bash 复制代码
server {

    listen 8000;
    server_name nginx-dev;

    rewrite_log on;

    location / {
        rewrite ^/old/(.*) /new/$1;
        rewrite ^/new/(.*) /pages/$1;
        #根目录
        root /home/AdminLTE-3.2.0;
        #首页
        index index.html index2.html index3.html;
    }

    location  /pages/1.txt {
        return 200 "this is rewrite test!";
    }

}

默认按顺序执行。

访问 http://192.168.56.105:8000/old/1.txt

结果:this is rewrite test!

日志:

使用break

访问 http://192.168.56.105:8000/old/1.txt

1.匹配到了rewrite ^/old/(.*) /new/$1

2.break指令不执行后续的rewrite规则,以新的/new/1.txt路径去执行块内的其他指令

  1. root目录下寻找文件, 由于不再村/home/AdminLTE-3.2.0/new/1.txt这个文件,返回404
bash 复制代码
server {

    listen 8000;
    server_name nginx-dev;

    rewrite_log on;

    location / {
        rewrite ^/old/(.*) /new/$1 break;
        rewrite ^/new/(.*) /pages/$1;
        #根目录
        root /home/AdminLTE-3.2.0;
        #首页
        index index.html index2.html index3.html;
    }

    location  /pages/1.txt {
        return 200 "this is rewrite test!";
    }

}

访问 http://192.168.56.105:8000/old/1.txt

使用last

访问 http://192.168.56.105:8000/old/1.txt

1.匹配到了rewrite ^/old/(.*) /new/$1

2.last指令不执行后续的rewrite规则,以新的/new/1.txt路径去匹配location

3.先匹配到location /, 有匹配到location里的rewrite ^/new/(.*) /pages/$1规则,重定向到

/pages/1.txt

4.匹配到了location /pages/1.txt ,于是返回了this is rewrite test!

bash 复制代码
server {

    listen 8000;
    server_name nginx-dev;

    rewrite_log on;

    location / {
        rewrite ^/old/(.*) /new/$1 last;
        rewrite ^/new/(.*) /pages/$1;
        #根目录
        root /home/AdminLTE-3.2.0;
        #首页
        index index.html index2.html index3.html;
    }

    location  /pages/1.txt {
        return 200 "this is rewrite test!";
    }

}

访问 http://192.168.56.105:8000/old/1.txt

结果:this is rewrite test!

日志:

四.其他常见指令

gzip压缩

压缩响应通常会显著减小传输数据的大小。但是,由于压缩发生在运行时,因此它还会增加相当大的处理开销,从而对性能产生负面影响。NGINX在将响应发送到客户端之前执行压缩,但如果后端服务器已经对内容进行了压缩,则nginx不会再压缩。

若要启用压缩,请在参数中包含 gzip 指令。

bash 复制代码
gzip on; 
gzip_types text/plain application/xml; 
gzip_min_length 1000; 

默认情况下,NGINX仅使用压缩MIME类型是text/html的响应。若要使用其他 MIME 类型压缩响应,可以使用 gzip_types 指令并列出其他类型。

若要指定压缩响应的最小长度,请使用 gzip_min_length 指令。默认值为 20 个字节(此处调整为 1000)。

sendfile

默认情况下,NGINX处理文件传输本身,并在发送之前将文件复制到缓冲区中。启用 sendfile 指令可消除将数据复制到缓冲区的步骤,直接将一个文件复制到另一个文件。

启用sendfile,类似Java中的零拷贝(zero copy)

bash 复制代码
location /download {
  sendfile           on;
  tcp_nopush         on; 
  #... 
} 

tcp_nopush 指令与 sendfile 指令一起使用。这使NGINX能够在获得数据块后立即在一个数据包中发送HTTP响应标头。

try_files

try_files指令可用于检查指定的文件或目录是否存在;如果不存在,则重定向到指定位置。

如下,如果原始URI对应的文件不存在,NGINX将内部重定向到/www/data/images/default.gif

bash 复制代码
server {
    root /www/data;

    location /images/ {
        try_files $uri /images/default.gif;
    }
}

最后一个参数也可以是状态代码(状态码之前需要加上等号)。

在下面的示例中,如果指令的所有参数都无法解析为现有文件或目录,则会返回404错误。

bash 复制代码
location / {
    try_files $uri $uri/ $uri.html =404;
}

在下一个示例中,如果原始 URI 和附加尾随斜杠的 URI 都没有解析到现有文件或目录中,则请求将重定向到命名位置,该位置会将其传递到代理服务器。

bash 复制代码
location / {
    try_files $uri $uri/ @backend;
}

location @backend {
    proxy_pass http://backend.example.com;
}

error_page

为错误指定显示的页面。值可以包含变量。

bash 复制代码
error_page 404             /404.html; 
error_page 500 502 503 504 /50x.html;
相关推荐
一心0924 小时前
ubuntu 20.04.6 sudo 源码包在线升级到1.9.17p1
运维·ubuntu·sudo·漏洞升级
好好学习啊天天向上4 小时前
世上最全:ubuntu 上及天河超算上源码编译llvm遇到的坑,cmake,ninja完整过程
linux·运维·ubuntu·自动性能优化
你想考研啊4 小时前
三、jenkins使用tomcat部署项目
运维·tomcat·jenkins
代码老y5 小时前
Docker:容器化技术的基石与实践指南
运维·docker·容器
典学长编程5 小时前
Linux操作系统从入门到精通!第二天(命令行)
linux·运维·chrome
DuelCode6 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
你想考研啊8 小时前
四、jenkins自动构建和设置邮箱
运维·jenkins
Code blocks8 小时前
使用Jenkins完成springboot项目快速更新
java·运维·spring boot·后端·jenkins
饥饿的半导体9 小时前
Linux快速入门
linux·运维
还是奇怪11 小时前
Linux - 安全排查 2
linux·运维·安全