抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >
  • Nginx(Enginex)是一个高性能的HTTP和反向代理web服务器m, 同时也提供IMAP/POP3/SMTP服务.
  • 主要功能是反向代理.
  • 通过配置文件可以实现集群和负载均衡.

反向代理

常见的web服务器

  • MS IIS asp.net
  • Weblogic、Jboss 传统行业,ERP(企业资源计划)/物流/电信/金融
  • Tomcat、Jetty J2EE
  • Apache、Nginx 静态服务,反向代理
  • Netty 高性能服务器编程

什么是正向代理

  • 客户端请求目标服务器之间的一个代理服务器(运营商).
  • 请求会先经过代理服务器,然后再转发请求到目标服务器,获得的内容最后响应给客户端.
  • 正向代理, 帮助内网client访问外网的server.
  • 正向代理即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端.

用途:

  • 访问原来不能访问的资源, 例如谷歌。
  • 可以做缓存, 加速访问资源。
  • 对客户端访问授权, 上网认证。
  • 代理可以记录用户访问记录, 对外隐藏用户信息。

什么是反向代理

  • 用户请求目标服务器, 由代理服务器决定访问哪个ip.
  • 即代理外网的请求转发到内网的服务器, 从外到内.
  • 反向代理即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端.

用途:

  • 保证内网安全, 阻止web攻击, 大型web网站, 一般反向代理服务器作为公网访问地址, 而web服务是内网.
  • 负载均衡, 通过反向代理服务器来优化网站的负载.

反向代理之路由

Nginx安装与运行

基于Manjaro安装

# 安装gcc
pacman -S gcc
gcc -v
# 安装pcre库,pcre是一个perl库,包括perl兼容的正则表达式库,nginx的http模块使用pcre来解析正则表达式
pacman -S pcre
# 安装zlib库 zlib库提供了很多种压缩和解压缩方式nginx使用zlib对http包的内容进行gzip
pacman -S zlib
# 安装openssl openssl是web安全通信的基石.SSL安全加密的套接字协议,用于HTTP安全传输,也就是https
pacman -S openssl
# 下载nginx源码包
wget http://nginx.org/download/nginx-1.18.0.tar.gz
# 解压到指定目录
tar -zxvf nginx-1.18.0.tar.gz
# 创建nginx临时目录
mkdir /var/temp/nginx -p
# 进入目录编译安装
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--with-http_ssl_module
--with-http_v2_module

make
make install
# 修改配置文件
vim /usr/local/nginx/conf/nginx.conf
# 启动服务
cd /usr/local/nginx/sbin
./nginx
# 查看是否启动成功
ps -ef | grep nginx

nginx 安装参数说明

command comment
–prefix 安装目录
–pid-path 指向nginx的pid
–lock-path 锁定安装文件,防止被恶意篡改
–error-log-path 错误日志
–http-log-path http日志
–with-http_gzip_static_module 启用gzip模块,在线实时压缩输出数据流
–http-client-body-temp-path 设定客户端请求的临时目录
–http-proxy-temp-path 设定http代理临时目录
–http-fastcgi-temp-path 设定fastcgi临时目录
–http-uwsgi-temp-path 设定uwsgi临时目录
–http-scgi-temp-path 设定scgi临时目录

nginx.conf配置文件

  • main 全局配置
    • event 配置工作模式以及连接数
      • http http模块相关配置
        • server 虚拟主机配置,可以多个
          • location 路由规则,表达式
          • upstream 集群,内网服务器
# 工作进程是由哪一个用户执行
#user  nobody;
# n - 1, 例如八核就设置7个
worker_processes  5;

# 日志级别 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 {
    # 默认使用
    use epoll
    # 每个worker允许连接的最大连接数
    worker_connections  10240;
}

http {
    # 导入文件 为了提高可读性
    include       mime.types;
    default_type  application/octet-stream;

    # 日志格式自定义 $var 变量
    # $remote_addr  客户端ip $remote_user 远程客户端用户名,一般为:'-' $time_local 时间和地区
    # $status 响应状态码 $body_bytes_sent 响应客户端内容字节数 $http_referer 记录用户从哪个链接跳转过来的
    # $http_user_agent 用户使用的代理,一般都是浏览器 $http_x_forwarded_for 通过代理服务器来记录客户端的ip
    #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        on;
    # 数据包累计到一定的大小再发送,提高效率.需要启用 sendfile 才能使用.
    #tcp_nopush     on;

    # 客户端连接服务器的超时时间 以秒为单位 http是无状态的协议 一般浏览器是60秒
    # 保证客户端多次请求的时候不会重复建立连接,节省资源
    #keepalive_timeout  0;
    keepalive_timeout  65;

    # 内容压缩 html css js
    gzip  on;

    # 虚拟主机
    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;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        # 匹配规则
        location = /50x.html {
            root   html;
        }

    }

    server {
        listen       8089; # 监听端口
        server_name  localhost;
        location / {
            root   html;
            index  app.html index.htm;
        }
    }

}

nginx.pid打开失败以及失效的解决方案

nginx: [error] open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory)

直接重新创建的话会报错

nginx: [error] invalid PID number "" in "/var/run/nginx/nginx pid"

需要重新指定配置文件之后再重载

./nginx -c /usr/local/nginx/conf/nginx.conf

./nginx -s reload

或者使用默认的pid,nginx默认的pid是在log文件夹之下的.

nginx指令

# 启动
./nginx
# 暴力停止
./nginx -s stop
# 优雅停止
./nginx -s quit
# 重新加载
./nginx -s reload
# 检查配置文件是否有问题
./nginx -t
# 指定配置文件
./nginx -c /usr/local/nginx/conf/nginx.conf
# 查看版本号
./nginx -v
./nginx -V
# 查看帮助
./nginx -h

Nginx进程模型

  • master进程:主进程
  • worker进程:工作进程

worker抢占机制

传统服务器事件处理(BIO)

同步阻塞通信模型

Nginx事件处理机制

异步非阻塞通信模型(多路复用器)

events {
    use epoll; # 默认使用的
    worker_connections 1024*2; # 每个worker允许最大连接数
}

同步与异步,阻塞与非阻塞

  • 同步阻塞: 客户端发送请求给服务端,此时服务端处理任务时间很久,则客户端则被服务端堵塞了,所以客户端会一直等待服务端的响应,此时客户端不能做其它事,服务端也不会接受其他客户端的请求.这种通信机制比较简单粗暴,但是效率不高.
  • 同步非阻塞: 客户端发送请求给服务端,此时服务端处理任务时间很久,这个时候虽然客户端会一直等待响应,但是服务端可以处理其他的请求,过一会回来的.这种方式很高效,一个服务端可以处理很多请求,不会在因为任务没有处理完而堵着,所以这是非阻塞的.
  • 异步阻塞: 客户端发送请求给服务端,此时服务端处理任务时间很久,但是客户端不会等待服务器响应,它可以做其他的任务,等服务器处理完毕后再把结果返回给客户端,客户端得到回调后再处理服务端的响应.这种方式可以避免客户端一直处于等待的状态,优化了用户体验,其实就是类似于网页里发起的ajax异步请求.
  • 异步非阻塞: 客户端发送请求给服务端,此时服务端处理任务时间很久,这个时候的任务虽然处理时间会很久,但是客户端可以做其他的任务,因为他是在异步回调函数里处理响应;同时服务端是非阻塞的,所以服务端可以去处理其他的任务,如此,这个模式就显得非常的高效了.

以上四点,除了第三点,其余的分别为BIO/NIO/AIO

  • BIO: 我去上厕所,这个时候坑位都满了,我必须等待坑位释放了,我才能上吧?!此时我啥都不干,站在厕所里盯着,过了一会有人出来了,我就赶紧蹲上.

  • NIO: 我去上厕所,这个时候坑位都满了,没关系,哥不急,我出去抽根烟,过会回来看看有没有空位,如果有我就蹲,如果没有我出去接着抽烟或者玩会手机.

  • 异步阻塞: 我去上厕所,这个时候坑位都满了,没事我等着,等有了新的空位,让他通知我就行,通知了我,我就蹲上去.

  • AIO: 我去上厕所,这个时候坑位都满了,没事,我一点也不急,我去厕所外面抽根烟再玩玩手机,等有新的坑位释放了,会有人通知我的,通知我了,我就蹲上了.

  • 同步 就是我需要自己每隔一段时间,以轮训的方式去看看有没有空的坑位;

  • 异步 则是有人拉完茅坑会通知你,通知你后你再回去蹲;

  • 阻塞 就是在等待的过程中,你不去做其他任何事情,干等着;

  • 非阻塞 就是你再等待的过程中可以去做其他的事,比如抽烟、喝酒、烫头、玩手机.

总结:异步 的优势显而易见,大大优化用户体验, 非阻塞 使得系统资源开销远远小于 阻塞 模式,因为系统不需要创建新的进程(或线程),大大地节省了系统多出来的系统资源可以给其他的中间件去服务了.

Nginx日志分割

手动

cat_my_log.sh

#!/bin/bash
LOG_PATH="/var/log/nginx/"
RECORD_TIME=$(date -d "yesterday" +%Y-%m-%d+%H:%M)
PID=/var/run/nginx/nginx.pid
mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${RECORD_TIME}.log
mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${RECORD_TIME}.Log
# 向Nginx主进程发送信号,用于重新打开日志文件
kill -USR1 `cat $PID`

给脚本添加执行权限

chmod +x cat_my_log.sh

定时

# 安装crontabs
pacman -S cronie
systemctl enable cronie
systemctl start cronie

# 编辑并添加定时任务
crontab -e
*/1 * * * * /usr/local/nginx/sbin/cat_my_log.sh

# 重启定时任务
systemctl restart cronie
# 重新载入配置
systemctl reload cronie
# 查看定时任务
crontab -l

cron表达式

# 每分钟执行一次
*/1 * * * *
# 每天 23:59 执行
59 23 * * *
# 每天凌晨1点执行
0 1 * * *

Nginx常用配置参数

root与alias

假如服务器路径为:/home/lgq/files/img/face.png

root路径完全匹配访问

location /lgq {
    root /home
}

这时的请求url:port/lgq/lgq/files/img/face.png

alias 可以为你的路径做一个别名,对用户透明

location /hello {
    root /home/lgq
}

这时的请求url:port/hello/files/img/face.png

gzip压缩

# 开启gzip压缩,提高传输速率,节约带宽
gzip  on;
# 限制最小压缩,小于1个字节的文件不会压缩
gzip_min_length 1;
# 1 - 9 压缩比,值越大压缩比越大
gzip_comp_level 3;
# 压缩类型
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/json;

location匹配规则

空格 :默认匹配,普通匹配

location / {
    root /home;
}

= :精准匹配

location = /img/face1.png {
    root G:/CodeSpace/my-code-base/Architect/static;
}

~* :匹配正则表达式,不区分大小写

# 符合图片的显示
location ~* \.(GIF|png|bmp|jpg|jpeg) {
    root G:/CodeSpace/my-code-base/Architect/static;
}

~ :匹配正则表达式,区分大小写

# GIF必须大写才能匹配到
location ~ \.(GIF|png|bmp|jpg|jpeg) {
    root G:/CodeSpace/my-code-base/Architect/static;
}

^~ :以某个字符路径开头

location ^~ /audio {
    root G:/CodeSpace/my-code-base/Architect/static;
}

Nginx中解决跨域问题

CORS:Cross-Origin Resources Sharing 跨域资源共享

Jsonp、StringBoot Cors、Nginx

# 允许跨域请求的域,*代表所有
add_header 'Access-Control-Allow-Origin' *;
# 允许带上cookie请求
add_header 'Access-Control-Allow-Credentials' 'true';
# 允许请求的方法,比如 GET/POST/PUT/DELETE
add_header 'Access-Control-Allow-Methods' *;
# 允许请求的header
add_header 'Access-Control-Allow-Headers' *;

Nginx静态资源防盗链

使用valid_referers进行验证

  • none: 允许没有http_refer的请求访问资源 the “Referer” field is missing in the request header;
  • blocked: the “Referer” field is present in the request header, but its value has been deleted by a firewall or proxy server; such values are strings that do not start with “http://” or “https://”;
# 对源站点验证
valid_referers *.xxx.com;
# 非法引入会进入下方判断
if ($invalid_referer) {
    return 403;
}

防盗链测试

不带http_referer

curl -I http://xxx.com:90/img/xxx.ico

HTTP/1.1 403 Forbidden
Server: nginx/1.18.0
Date: Sat, 07 Nov 2020 07:01:55 GMT
Content-Type: text/html
Content-Length: 153
Connection: keep-alive

带非法http_referer

curl -e "http://www.baidu.com" -I http://xxx.com:90/img/xxx.ico

HTTP/1.1 403 Forbidden
Server: nginx/1.18.0
Date: Sat, 07 Nov 2020 07:03:32 GMT
Content-Type: text/html
Content-Length: 153
Connection: keep-alive

带合法http_referer

curl -e "http://www.xxx.com" -I http://xxx.com:90/img/xx.ico

HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Sat, 07 Nov 2020 07:04:50 GMT
Content-Type: image/x-icon
Content-Length: 4286
Last-Modified: Tue, 24 Dec 2019 06:48:29 GMT
Connection: keep-alive
ETag: "5e01b4bd-10be"
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: *
Access-Control-Allow-Headers: *
Accept-Ranges: bytes

Nginx模块化体系

Nginx集群负载均衡

水平扩容

OSI 网络模型

OSI – Open System Interconnect, 意思就是 开放网络互联.

层级 名称 说明
第七层 应用层 与用户行为交互
第六层 表示层 定义数据格式以及数据加密
第五层 会话层 创建、管理以及销毁会话
第四层 传输层 创建、管理请求端到响应端(端到端)的连接
第三层 网络层 请求端的IP地址
第二层 数据链路层 提供介质访问与链路管理
第一层 物理层 传输介质,物理媒介
  • 应用层:这是面向用户的,最靠近用户,为了让用户和计算机交互,在计算机里会有很多软件,比如eclipse,idea,qq,nginx等,这些软件,用户可以通过这些应用软件和计算机交互,交互的过程其实就是接口的调用,应用层为用户提供了交互的接口,以此为用户提供相应的协议.那么在这一层最常见的协议有:HTTP,HTTPS,FTP,SMTP,POP3等.Nginx在本层,为七层负载均衡.

    举例:我要寄一封信给远在天边的老外LiLei,我会打开快递软件下单,这个时候我是 用户 ,快递软件就是 应用服务 ,是建立在计算机应用层供给用户交互的一种服务或称之为手段.

  • 表示层:该层提供数据格式编码以及加密功能,确保 请求端 的数据能被 响应端 的应用层识别.

    举例:我写中文给LiLei,他看不懂,这个时候我就会使用翻译软件把中文翻译成英文,随后信中涉及到一些比较隐私的信息我会加密一层,这时候翻译软件和加密器就充当了 表示层 的作用,他用于显示用户能够识别的内容.

  • 会话层:会话可以理解为session,请求发送到接受响应的这个过程之间存在会话,会话层就充当了这一过程的管理者,从创建会话到管理到最后销毁会话.

    举例:我每次写信给LiLei都会记录在一个小本本上,寄信时间日期,收信时间日期,这本小本本上存有每次通信记录,这个小本本就相当于会话的管理者.又或者说,我们平时在打电话,首先需要拨打电话,这是 建立会话 ,对方接听电话,此时正在通话( 维持并管理会话)结束后 会话销毁 ,那么这也是一次会话的生命周期.

  • 传输层:该层建立端到端的连接,他提供了数据传输服务,在传输层通信会涉及到端口号,本层常见的协议为TCP、UDP,LVS就是在这层的,也就是四层负载均衡.

    举例:我和LiLei通信过程中会借助快递公司,快递公司会分配快递员取件和寄件,那么这个快递员则充当 传输层 的作用.

  • 网络层:网络通信的时候必须要有本机IP和对方的IP,请求端和响应端都会有自己的IP的,IP就相当于你家地址门牌号,在网络上云服务拥有的公网IP,普通计算机也有,只不过是动态IP,运营商每天会分配不同的IP给你的计算机.所以网络层也能称之为IP层,IP是互联网的地址,能提供IP分配的设备则为路由器或交换机.

    举例:对于拥有固定IP的云服务来说,他们都是由腾讯云、阿里云等这样的供应商提供的,他们为云服务器提供固定ip;电信、移动、运营商为你的计算机动态分配ip,每天都不同;则这些供应商和运营商都是网络层.同理,快递员由物流公司分配和管理,那么物流公司就是网络层咯.

  • 数据链路层:这一层会提供计算机MAC地址,通信的时候会携带,为了确保请求投递正确,所以他会验证检测MAC地址,以确保请求的准确性.

    举例:快递员在投递派送的时候,他(或客服)会预先提前打电话给你,确认你家地址对不对、有没有人、货到付款有没有准备好钱等,这时候快递员(或客服)就充当了 数据链路层 的职责.

  • 物理层:真实的机器之间的物理连接.

四层负载均衡

基于IP+端口的负载均衡. 原理通过转发请求到后台服务器, 他只负责转发, 并且会记录当前连接是那个服务器处理的, 后续的请求就会由同一台服务器处理, 其实就是长连接. 是传输层的, 主要基于tcp和udp.

  • F5 硬负载均衡
  • LVS 四层负载均衡
  • Haproxy 四层负载均衡
  • Nginx 四层负载均衡

七层负载均衡

基于URL+IP的负载均衡. 基于应用层的, 是针对应用层协议的. 和四层不同, 四层是不可以处理请求的, 而七层是可以的. 例如可以压缩和缓存一些请求的资源。

举例子: 买电影票. 黄牛, 不会处理用户诉求; 售票处, 可以提供相应的服务。

  • Nginx 七层负载均衡
  • Haproxy 七层负载均衡
  • Apache 七层负载均衡

DNS地域负载均衡

Nginx构建Tomcat集群

nginx默认的负载均衡策略是轮询.

第一台Tomcat(虚拟机): http://192.168.128.128:8080

第二台Tomcat(linux笔记本):http://192.168.123.197:8080

第三台Tomcat(windows台式): http://192.168.123.187:8080

Nginx服务器(linux台式): http://192.168.123.26/

配置文件

# 配置上游服务器
upstream tomcats {
    # ip 哈希
    # ip_hash;
    # url 哈希
    # hash $request_uri;
    # 最小连接数
    # least_conn;
    server 192.168.123.128:8080 weight=1;
    server 192.168.123.187:8080 dwon;
    server 192.168.123.197:8080 weight=3;
    # 保持的连接数,长连接
    keepalive 32;
}

# 配置server虚拟主机
server {
    listen 80;
    server_name www.tomcats.com;
    # 针对200和304状态码的缓存设置过期时间
    proxy_cache_valid 200 304 8h;
    location / {
        # 集群配置
        proxy_pass http://tomcats;
        # 默认是1.0 不是长连接
        proxy_http_version 1.1;
        # 清除信息
        proxy_set_header Connection "";
    }
}

使用JMeter测试单节点与集群的并发异常

创建线程组

线程数:用户数

Ramp-up 请求间隔时间.

upstream 指令参数

  • max_conns: 服务器的最大连接数.注意使用多个工作进程,会涉及到共享内存的问题,这样肯定会超过max_conns.可起到限流的作用.
  • slow_start:缓慢启动,缓慢进入集群.权重会逐渐变大,不健康到健康的过程.适用于集群,单组是不适用的.商业版本特征!该参数不能使用在hashrandom load balancing中.
  • down:标识服务状态,该节点不可用状态.
  • backup:备用,说明这一台备用机,集群中服务器如果都不能访问了,就会被启用!该参数不能使用在hashrandom load balancing中.
  • max_fails:表示失败几次,则标记server已宕机,剔出上游服务.
  • fail_timeout:表示失败重试时间,默认是10s.e.g. max_fails=2 fail_timeout=15s,则代表15s内请求某一server失败2次后,则认为这台server已经宕机了,随后再过15s,这15s内不会有新的请求到达刚刚挂掉的节点上,而是会请求在运行的server,15秒后会再有新请求尝试挂掉的server,如果还是失败,重复上一过程,直到恢复.

keepalive 参数

提高吞吐量.

  • keepalived : 设置长连接处理的数量
  • proxy_http_version :设置长连接http版本为1.1
  • proxy_set_header :清除connection header 信息

负载均衡之ip_hash

ip_hash可以保证用户的同一个会话可以保证在同一台服.(分表也用到这种技术)。

根据iP的前3段进行计算的。

注意:用户的ip可能是动态变化的,这种情况就会有问题.还有一点就是,如果某一台服务器出现问题宕机了,是不能直接注释掉配置文件来剔除服务的,需要使用down参数进行处理。

一致性hash算法

一致性哈希算法 : 对 2^32^ 取模, 将哈希值空间映射成虚拟的圆环

将数据 key (例如: 服务器ip, 主机名)使用相同的函数 Hash 计算出哈希值. 这样就能确定值在 Hash 环上的位置。而节点分布在圆环上面,确认 hash 值应该落圆环的哪个部位上。落在圆环上之后,顺时针寻找距离最近的节点。

如果某一节点挂掉了,找不到节点,也会会继续顺时针找。

最小化有损服务,对于节点的增减, 都只需要重新定位环空间中的一小部分数据, 具有较好的容错性扩展性

如果其中的某一个服务器宕机了。

如果增加服务器。

Hash环的数据倾斜问题。

节点太少,在环上分布不均匀,造成数据倾斜。大部分数据被缓存到某个节点上。

解决方案:引入虚拟节点

即对每一个服务器节点计算多个 Hash。可以在服务器ip的后面添加编号来实现。

负载均衡之url_hash

hash $request_uri;

注意url的值不一样, 例如在链接后面加个, hash出来的结果会不一样的。

负载均衡之least_conn

least_conn;

Nginx控制缓存

浏览器端, 加速单个用户浏览体验, 缓存到本地; nginx端优化内网的传输, 提升访问上游服务的速度和所有访问nginx一端的用户的体验.

Expires: 过期时间. 当服务器发现请求的资源时间没有更改, 会返回304给客户端, 代表可以使用缓存.

expires [time];

expires @[time]; @22h30m 以天为节点进行计算

expires -[time];

expires epoch; 不去缓存

expires off; nginx关闭缓存, 但是浏览器端还是有默认的缓存机制的.

expires max; 最大过期时间.

Nginx缓存配置

# proxy_cache_path设置缓存保存的目录 目录会自动创建.
#   keys_zone 设置共享内存以及占用的大小
#   max_size 设置缓存大小
#   inactive 超过此时间, 缓存自动清理
#   use_temp_path 关闭临时目录
proxy_cache_path /usr/local/nginx/upstream_cache keys_zone=mycache:5m max_size=1g inactive=8h use_temp_path=off

server {
    # ...
    # 开启并且使用缓存
    proxy_cache mycache;
    # 针对200和304状态码的缓存设置过期时间
    proxy_cache_valid 200 304 8h;
}

Nginx配置ssl证书提供https访问

ssl证书导出,可以使用阿里云,腾讯云或者cloudflare的免费证书。

# 进入目录编译配置安装, 配置的时候注意添加ssl模块
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--with-http_ssl_module
make
make install

把证书 *.key*.pem 放在nginx下的conf目录下面

配置nginx.conf文件

# 开启ssl
ssl on;
# 配置ssl证书
ssl_certificate 4740733_lgq51233.xyz.pem;
# 配置证书秘钥
ssl_certificate_key 4740733_lgq51233.xyz.key;
# ssl会话cache
ssl_session_cache shared:SSL:1m;
# ssl会话超时时间
ssl_session_timeout 5m;
# 使用该协议进行配置.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 配置加密套件,写法遵循 openssl 标准
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;

# Https配置
server {
    listen 443;
    server_name localhost;
    location / {
        # 集群配置
        proxy_pass http://tomcats;
        index index.html index.htm;
    }
}

评论