Nginx入门学习

文章目录

  • 一、Nginx介绍与安装
    • 1、Nginx简介
    • 2、常见特点简介
      • 2.1 反向代理
      • 2.2 负载均衡
      • 2.3 动静分离
    • 3、Nginx的安装
      • 3.1 软件安装
      • 3.2 环境与端口配置
  • 二、Nginx原理
    • 1、nginx工作原理图
    • 2、nginx默认配置
    • 3、常见错误与进程退出
  • 三、Nginx常见功能
    • 1、Location语法
    • 2、反向代理
    • 3、负载均衡
      • 3.1 简介
      • 3.2 upstream
      • 3.3 简单实例
    • 4、动静分离
    • 5、nginx其他情况
  • 四、Nginx常见配置
    • 1、gzip压缩配置
    • 2、跨域配置与防盗链
    • 3、Keepalived
      • 3.1 简介
      • 3.2 保持与server的长连接
    • 4、expires缓存
    • 5、日志文件分割
      • 5.1 创建脚本
      • 5.2 创建定时任务
  • 五、Nginx配置高可用集群
      • 主从配置(还有双主模式自行学习)
  • 六、Nginx配置ssl提供https访问
    • 1、介绍与环境准备
      • 1.1 https配置作用
      • 1.2 配置步骤
    • 2、阿里云下载SSL
      • 2.1 前提准备
      • 2.2 SSL证书申请
    • 3、Nginx配置https

一、Nginx介绍与安装

1、Nginx简介

Nginx (engine x) 是一个高性能的HTTP和反向代理的轻量级web服务器,同时也提供了IMAP/POP3/SMTP服务。由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。其他web服务器对比

Nginx有以下一些特点

  • 反向代理

  • 集群与负载均衡

  • 动静分离(静态资源虚拟化)

  • 限流

Nginx入门学习_第1张图片

上图基本上说明了当下流行的技术架构。

2、常见特点简介

2.1 反向代理

再讲反向代理之前首先要知道什么叫正向代理,正向代理相当于当你要访问一个资源时,你需要一个代理服务器进行资源访问

Nginx入门学习_第2张图片

反向代理,客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器的地址,隐藏了真实服务器的ip

Nginx入门学习_第3张图片

2.2 负载均衡

简单来说,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡

2.3 动静分离

动静分离就是讲动态资源

  • List item

和静态资源相互分离,把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。

3、Nginx的安装

3.1 软件安装

PCRE库支持正则表达式。如果我们在配置文件nginx.conf中使用了正则表达式,那么在编译Nginx时就必须把PCRE库编译进Nginx,因为Nginx的HTTP模块需要靠它来解析正则表达式。

#检测是否安装,若没有安装,则需要安装
#在这里有些系统会自带,所以不安装也没事
rpm -qa pcre
#根据情况自行调整版本
wget https://nchc.dl.sourceforge.net/project/pcre/pcre/8.45/pcre-8.45.tar.bz2
#解压
tar -jxvf pcre-8.45.tar.bz2
cd pcre-8.45
./configure
make
make install

安装nginx,首先需要安装相应的依赖,这里我用的是Centos操作做系统,从Nginx下载地址下载最新nginx

#首先安装前置依赖
yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel
#下载最新稳定版
wget http://nginx.org/download/nginx-1.20.1.tar.gz
#解压
tar -zxvf nginx-1.20.1.tar.gz
mkdir -p /var/temp/nginx
cd nginx-1.20.1
#默认配置
./configure
make 
make install
#进入sbin目录,启动
./nginx
#停止:
./nginx -s stop
#重新加载:
./nginx -s reload 
#查看配置信息
nginx -V
#测试配置文件是否正确
nginx -t
#帮助命令
nginx -h

nginx常见配置解释如下

命令 解释
–prefix 指定nginx安装目录
–pid-path 指向nginx的pid
–lock-path 锁定安装文件,防止被恶意篡改或误篡改
–error-log 错误日志
–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临时目录
#自定义配置,可以自行修改
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/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/fastgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_stub_status_module 

3.2 环境与端口配置

注意端口的开放,配置成功即可访问

#查看开放的端口号 
firewall-cmd --list-all
lsof -i:80
#设置开放的端口号 
firewall-cmd --add-service=http --permanent 
sudo firewall-cmd --add-port=80/tcp --permanent 
#重启防火墙 
firewall-cmd --reload 

为了更方便启动,需要配置环境变量

vim /etc/profile
#在尾部添加
export NGINX_HOME=/usr/local/nginx
export PATH=$NGINX_HOME/sbin:$PATH
#重启
source /etc/profile

当然Nginx安装如果不想这么麻烦,可以直接在宝塔面板进行快速安装(傻瓜式安装,不过我装了有点问题,折腾了好久还是选择了安装包安装)

二、Nginx原理

1、nginx工作原理图

Nginx入门学习_第4张图片

Nginx只有一个主线程,可以有多个worker线程,ps -ef |grep nginx可以查看活着的线程。而多个worker可以进行热部署,而且提高了服务的可靠性,另外worker数一般和cpu核心数相等,这样能最大限度发挥性能。对于连接数worker_connection,访问静态资源占用2个(请求和返回),动态资源占用4个(另外再加上tomcat的请求)。nginx在linux默认采用epoll的io线程处理模型,采用的是异步非阻塞的机制来完成线程的处理,所以上面的tomcat1如果发生了阻塞,并不会影响tomcat2的执行。

  • nginx的worker工作采用的抢占式的机制

  • nginx采用的是epoll的异步非阻塞的io模型,也就是多路复用的io线程模型。

2、nginx默认配置

访问http:ip,Nginx–>监听80端口–>找到对应server---->映射路由/----> html中的index.html

Nginx入门学习_第5张图片

# 设置worker进程的用户,指的linux中的用户,会涉及到nginx操作目录或文件的一些权限,默认为 nobody。
# 默认情况是:nobody,你注释的情况下也是nobody。当然你也可以修改成 user root,修改以后记得重启方可生效,然后通过ps -ef | grep nginx 可以查看效果。
#user  nobody;
#worker进程工作数设置,一般来说CPU有几个,就设置几个,或者设置为N-1也行
worker_processes  2;

#  nginx 日志级别 debug | info | notice | warn | error | crit | alert | emerg,错误级别从左到右越来越大
# 默认是:error级别,存储的路在 /var/log/nginx/error.log
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

# 设置nginx进程 pid
#pid        logs/nginx.pid;

# 配置系统的线程模型和工作线程的线程数量
events {
    # linux系统默认使用epoll
    # use epoll;
    # 每个工作进程的最大允许连接的客户端最大连接数
    worker_connections  1024;
}

# http 是指令块,针对http网络传输的一些指令配置
http {
    # 包含和导入外部的文件,进行模块化的划分。#在conf目录下的文件夹,mime.types会根据不同资源告诉浏览器用相应的工具打开。也可以将server模块放到其他模块
    include       mime.types;
    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的格式是main格式,然后把每次请求的信息写入到logs/access.log中。
    #access_log  logs/access.log  main;
  
    # 启用文件的高效传输,打开有利于文件传输的性能
    sendfile        on;
    #tcp_nopush它必须和sendfile使用,并且sendfile打开了才生效,它的含义是:当请求的数据包累积了到一定的大小的时候,在进行发送。
    #tcp_nopush     on;

    # 客户端连接服务器的超时时间,默认是65秒,0代表不保持连接。
    #keepalive_timeout  0;
    keepalive_timeout  65;

    # 开启gzip,利于文件和请求数据的传输。
    gzip  on;
    
    # 服务虚拟主机配置
    server {
        # 监听端口
        listen       80;
        # 监听服务器ip,域名,或者localhost
        server_name  localhost;
        #access_log  logs/host.access.log  main;

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

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
       
    }

    # 服务虚拟主机配置
    server {
        # 监听端口
        listen       8087;
        # 监听服务器ip,域名,或者localhost
        server_name  localhost;
        location / {
            root   html;
            index  newindex.html;
        }
    }

}

3、常见错误与进程退出

问题

在启动的过程中,如果出现了"/var/run/nginx.pid failed "错误信息的时候,一般是文件目录不存在,或者文件被误删

解决方案

  • 重新创建此目录即可
mkdir -p /var/run/nginx/
  • 如果重启过程中报错如下异常,则指定nginx.conf文件进行启动和重启
nginx -c /usr/local/nginx/conf/nginx.conf
  • 然后在重启启动nginx服务
nginx -s reload

Nginx退出方式

# 强制关闭
nginx -s stop
# 如果用户请求还正在与nginx 服务正在打交道,这个时候是不会退出nginx服务。直到用户的连接响应完毕才关闭
nginx -s quit

三、Nginx常见功能

1、Location语法

location指令语法如下:

location [ = | ~ |~* |^~] uri{

}
  • = :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。

  • ~ :用于表示 uri 包含正则表达式,并且区分大小写。

  • ~ *:用于表示 uri 包含正则表达式,并且不区分大小写。

  • ^~ :用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。

注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。

# 服务虚拟主机配置
server {
   # 监听端口
   listen       80;
   # 监听服务器ip,域名,或者localhost
   server_name  localhost;
   #access_log  logs/host.access.log  main;
   # 精准匹配
   location / {
       root   html;
       index  index.html index.htm;
   }

   # 精准匹配
   location = /asserts/css/login.css {
       root   /resources;
   }
   
    # 正则表达式匹配 *代表的是不区分大小写
   location ~* \.(GIF|png|bmp|jpg|jpeg) {
       root   /www/shawn/resources;
   }
  
   # ^~ 以某种字符路径开头请求
   location ^~ /asserts/img {
       root   /resources;
   }
   
   error_page   500 502 503 504  /50x.html;
   location = /50x.html {
       root   html;
   }
  
}

2、反向代理

首先准备两台tomcat服务器,修改端口号(有三处需要修改,文件位置在conf/server.xml),一个修改成8081,另一个8082,然后分别在Webapp中创建文件夹edu和udp并在目录下创建a.html,里面随便可以写任何东西。然后修改nginx的配置文件(文件位置在/usr/local/nginx/conf/nginx.conf) server部分如下,浏览器输入

服务器ip/udp/a.html 后就会自动访问,并不需要输入端口号。

若一个Nginx服务器需要代理多个应用,则需要创建多个server。

location ~ /edu/ {
proxy_pass   http://127.0.0.1:8081;
}

location ~ /udp/ {
proxy_pass   http://127.0.0.1:8082;
}

3、负载均衡

3.1 简介

分配策略有以下几点

  • 轮询(默认)
    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

  • weight
    weight代表权,默认为 1, 权重越高被分配的客户端多。weight指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。可以与least_conn和ip_hash结合使用

  • ip_hash
    每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。ip_hash不能与backup同时使用;当有服务器需要剔除,必须手动down掉。

  • least_conn
    把请求转发给连接数较少的后端服务器,适合请求处理时间长短不一造成服务器过载的情况。

  • fair(第三方)
    按后端服务器的响应时间来分配请求,响应时间短的优先分配。

  • url_hash(第三方)
    按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。

3.2 upstream

官网参考:http://nginx.org/en/docs/stream/ngx_stream_upstream_module.html

  • max_conns
    可以限制一台服务器的最大访问连接数。默认值是:0,代表不限制。可以用来限流
upstream tomcatservers {
  server 127.0.0.1:8080  max_conns=2;
  #让一个服务器慢慢的加入到集群中,hash和random以及一台server失效(商业版使用)
  #server 127.0.0.1:8081  weight=10 slow_start=60s;
  server 127.0.0.1:8082  weight=10;
}
  • down
    如果用down进行服务器标记就告诉当前服务器不可用的状态,这样就可以停用8080服务
upstream tomcatservers {
  server 127.0.0.1:8080  weight=10 down;
  server 127.0.0.1:8081  weight=2;
  server 127.0.0.1:8082  weight=2;
}
  • backup
    backup 表示当前服务器节点是备用机,只有在其他的服务器都宕机以后,自己才会加入到集群中,被用户访问到;可以用于灰度部署时候的一种更替效果。
upstream tomcatservers {
  server 127.0.0.1:8080  weight=10 backup;
  server 127.0.0.1:8081  weight=2;
  server 127.0.0.1:8082  weight=2;
}
  • max_fails 和 fail_timeout
    max_fails 表示失败几次,则标记server已宕机,剔出上游服务;fail_timeout 表示失败的重试时间。max_fails默认值1,fail_timeout的默认值是10
upstream tomcatservers {
  #1秒内最大错误次数到达2次时则剔除该服务,下一秒不会访问,1秒后会再有新请求尝试连接挂掉的server,如果还是失败,重复上一过程,直到恢复。
  server 127.0.0.1:8080  max_fails=2 fail_timeout=1;
  server 127.0.0.1:8081  weight=1;
  server 127.0.0.1:8082  weight=1;
}

3.3 简单实例

负载均衡指的是当访问相同路径的资源,nginx按照设置好的分配策略,自动进行某一个tomcat的访问,比如我直接输入服务器ip/edu/a.html,我服务器中有两台tomcat并且同时有路径/edu/a.html,当访问时会按照固定分配策略选择一台tomcat进行服务,若其中一台挂了,另一台还可以正常工作。

 http{
   ...
   #负载均衡
    upstream myserver {
    #ip_hash
    #fair  
    #least_conn
  server  服务器ip:8081 weight=5;
  server  服务器ip:8082 weight=10;
  
    }
  ...
    server {
    #listen       80;        #端口
        server_name  _;   #服务名

        charset utf-8,gbk;
        root    /data/download;  #显示的根索引目录
        autoindex on;             #开启索引功能
        #autoindex_exact_size off; # 关闭计算文件确切大小(单位bytes),只显示大概大小(单位kb、mb、gb)
        #autoindex_localtime on;   # 显示本机时间而非 GMT 时间
     #负载均衡
        location / {
            proxy_pass   http://myserver;
            root  html;
            index  index.html  index.html;
        }
        ...
     }
 }
    

4、动静分离

相当于一个静态资源服务器,通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。

我在我的文件夹data下分别创建了www和image文件夹,里面分别存放了图片和一个html,当浏览器访问时就会自动寻找对应的静态资源(expires参数也可配置),部分配置如下

server{
  ...
    #负载均衡
    location / {
            proxy_pass   http://myserver;
            root  html;
            index  index.html  index.html;
        }
        #动静分离
        #真实地址 http:ip/contest/data/shawn1/index.html
      #location后路径若有/,则访问必须带/;若没有,则都可以访问
    location /shawn1{
            root  /contest/data;
            index  index.html index.htm;
        }
        #真实地址 http:ip/contest/data/index.html
        location /shawn2/{
            alias   /contest/data/;
            index  index.html index.htm;
        }

        location /image/{
            root  /contest/data/;
            #列出当前文件夹文件
            autoindex on;
            expires 12h;
        }
        ...
}

alias与root的区别

  • root 实际访问文件路径会拼接URL中的路径;alias 实际访问文件路径不会拼接URL中的路径

  • 在一个location中,alias可以存在多个,但是root只能有一个

  • alias只能存在与location中,但是root可以用在server、http和location中

  • alias后面必须要“/”结束,否则会找不到文件,而root的“/”可有可无

5、nginx其他情况

使用Nginx做代理的时候,有时需要把请求原封不动的转发给下一个服务。比如,访shawn.com/test/a/b.html, 要求转发到localhost:8088/test/a/b.html,请求只会替换域名。

简单配置如下:

upstream user {
  server localhost:8088 weight=5;
}

server {
    listen              80;
    server_name         shawn.com;
    access_log  "pipe:rollback /data/log/nginx/access.log interval=1d baknum=7 maxsize=1G"  main;

    location / {
        proxy_set_header Host $host;
        proxy_set_header  X-Real-IP        $remote_addr;
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;

        proxy_pass http://user;
    }

}

但很多时候,我们需要根据url的前缀转发到不同的服务。比如

shawn.com/user/profile.html转发到 用户服务 localhost:8089/profile.html

shawn.com/order/details.html转发到 订单服务 localhost:8090/details.html

即,url的前缀对下游的服务是不需要的,除非下游服务添加context-path, 但很多时候我们并不喜欢加这个。如果Nginx转发的时候,把这个前缀去掉就好了。

一个种方案是proxy_pass后面加根路径 / .

server {
    listen              80;
    server_name         shawn.com;
    access_log  "pipe:rollback /data/log/nginx/access.log interval=1d baknum=7 maxsize=1G"  main;

    location ^~/user/ {
        proxy_set_header Host $host;
        proxy_set_header  X-Real-IP        $remote_addr;
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;

        proxy_pass http://user/;
    }

    location ^~/order/ {
        proxy_set_header Host $host;
        proxy_set_header  X-Real-IP        $remote_addr;
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;

        proxy_pass http://order/;
    }

}

^~/user/表示匹配前缀是user的请求,proxy_pass的结尾有/, 则会把/user/*后面的路径直接拼接到后面,即移除user.

另一种方案是使用 rewrite

upstream user {
  server localhost:8089 weight=5;
}
upstream order {
  server localhost:8090 weight=5;
}


server {
    listen              80;
    server_name         abc.com;
    access_log  "pipe:rollback /data/log/nginx/access.log interval=1d baknum=7 maxsize=1G"  main;

    location ^~/user/ {
        proxy_set_header Host $host;
        proxy_set_header  X-Real-IP        $remote_addr;
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;

        rewrite ^/user/(.*)$ /$1 break;
        proxy_pass http://user;
    }

    location ^~/order/ {
        proxy_set_header Host $host;
        proxy_set_header  X-Real-IP        $remote_addr;
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;

        rewrite ^/order/(.*)$ /$1 break;
        proxy_pass http://order;
    }

}

注意到proxy_pass结尾没有/rewrite重写了url。

last 和 break关键字的区别

只用到了break,即匹配到此处后不会继续跳。

permanent 和 redirect关键字的区别

rewrite … permanent 永久性重定向,请求日志中的状态码为301
rewrite … redirect 临时重定向,请求日志中的状态码为302


另一种就是locationproxy_pass有无“/”的几种区别探究,具体可以参考

https://mp.weixin.qq.com/s/im–XoNkomtdC1wJwedTlw

四、Nginx常见配置

Nginx可视化配置:https://www.digitalocean.com/community/tools/nginx?global.app.lang=zhCN

1、gzip压缩配置

gzip文档:https://www.nginx.cn/doc/standard/httpgzip.html

# 配置网络传输的模块 
http {
  ......
        
    # 开启gzip,利于文件和请求数据的传输。
    gzip  on;
    # 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
    gzip_min_length 1k;
    #设置压缩缓冲区大小,此处设置为4个16K内存作为压缩结果流缓存
    gzip_buffers 4 16k;
    #默认值是1.1,对HTTP/1.1协议的请求会进行gzip压缩。
  gzip_http_version 1.1;
    # 是否在http header中添加Vary: Accept-Encoding,建议开启
    gzip_vary on;
    # gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间,后面会有详细说明
    gzip_comp_level 1;
    #禁用IE6的gzip压缩
    gzip_disable "MSIE [1-6]\.";
    #any表示全部都开启压缩
  #gzip_proxied expired no-cache no-store private auth;
    # 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。压缩图片意义不大
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/bmp application/x-bmp image/x-ms-bmp application/vnd.ms-fontobject font/ttf font/opentype font/x-woff application/json ;
    
  ......
}

2、跨域配置与防盗链

跨域配置完若发现无效果,试试清除缓存;而防盗链配置后只允许当前域名可以访问,否则会报错

# 静态资源服务器
server {
  ......
  
    #允许跨域请求的域,*代表所有 
    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' *;
  
    #防盗链
    #valid_referers *.shawn22.com; 
    #非法引入会进入下方判断 
    #if ($invalid_referer) { 
  #  return 402; 
    #}
    
    #第二种方法,在映射路径里面写特定后缀名的防盗链,none代表请求头中不存在 Referer字段('空值',比如直接在浏览器打开一个图片URI)。blocked代表请求头中存在 Referer字段,但值不是以"http(s)://"开头的字符串(被防火墙或代理服务器修改删除)。
    #location ~* \.(gif|jpg|png|swf|flv)$ {
    #    root html
    #    valid_referers none blocked *.nginxcn.com;
    #    if ($invalid_referer) {
    #        rewrite ^/ www.nginx.cn
    #        #return 404;
    #    }
    #}
    ......
}

3、Keepalived

3.1 简介

nginx底层是用tcp/ip完成的服务器的通信。Httpd守护进程,一般都提供了keep-alive timeout时间设置参数。比如nginx的keepalive_timeout,和Apache的KeepAliveTimeout。这个 keepalive_timout时间值意味着:一个http产生的tcp连接在传送完最后一个响应后,还需要hold住 keepalive_timeout秒后,才开始关闭这个连接。

keepalived配置

http {
    keepalive_timeout  120s;
    keepalive_requests 10000;
}
  • keepalive_timeout:设置keep-alive客户端连接在服务器端保持开启的超时值(默认65s);值为0会禁用keep-alive客户端连接;对于一些请求比较大的内部服务器通讯的场景,适当加大为120s或者300s;

  • keepalive_requests:设置一个keep-alive连接上可以服务的请求的最大数量,当最大请求数量达到时,连接被关闭。默认是100。这个参数的真实含义,是指一个keep alive建立之后,nginx就会为这个连接设置一个计数器,记录这个keep alive的长连接上已经接收并处理的客户端请求的数量。如果达到这个参数设置的最大值时,则nginx会强行关闭这个长连接,逼迫客户端不得不重新建立新的长连接。高QPS可以提高以减少连接TIME_WAIT时间

3.2 保持与server的长连接

为了让nginx和后端server(nginx称为upstream)之间保持长连接,同时也可以http请求组,典型设置如下。

http {
    upstream  BACKEND {
        server   192.168.0.1:8080  weight=1 max_fails=2 fail_timeout=30s;
        server   192.168.0.2:8080  weight=1 max_fails=2 fail_timeout=30s;
        keepalive 300;        # 这个很重要!
    }
server {
        listen 8080 default_server;
        server_name "";
        location /  {
            proxy_pass http://BACKEND;
            proxy_set_header Host  $Host;
            proxy_set_header x-forwarded-for $remote_addr;
            proxy_set_header X-Real-IP $remote_addr;
            #add_header Cache-Control no-store;
            #add_header Pragma  no-cache;
            proxy_http_version 1.1;         # 这两个最好也设置,http1.1
            proxy_set_header Upgrade $http_upgrade;    
            proxy_set_header Connection "Upgrade";
    }
}

header相关可以参考:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header

4、expires缓存

expires指令控制HTTP应答中的“Expires”和“Cache-Control”Header头部信息,启动控制页面缓存的作用
time可以使用正数或负数。“Expires”头标的值将通过当前系统时间加上设定time值来设定。
time值还控制"Cache-Control"的值:

  • 负数表示no-cache

  • 正数或零表示max-age=time

  • epoch:指定“Expires”的值为 1 January,1970,00:00:01 GMT

  • max:指定“Expires”的值为31 December2037 23:59:59GMT,"Cache-Control"的值为10年。

  • -1:指定“Expires”的值为当前服务器时间-1s,即永远过期。

  • off:不修改“Expires”和"Cache-Control"的值

location /static {
  alias /www/resources;
    #缓存10s
  expires 10s;
    #在23时30分钟之后自动清除缓存
    #expires @23h30m;
    
    #代表不缓存,直接缓存过期
    #expires epoch;
    
    #关闭nginx的缓存机制,直接走浏览器的缓存
    #expires off;
    
    #缓存永不过期
    #expires max;
  }

5、日志文件分割

现有的日志都会存在 access.log以及error.log 文件中,但是随着时间的推移,这个文件的内容会越来越多,体积会越来越大,不便于运维人员查看,所以我们可以通过把文件切割为多份不同的小文件作为日志,切割规则可以以 天 为单位,如果每天有几百G或者几个T的日志的话,则可以按需以 每半天 或者 每小时 对日志切割

5.1 创建脚本

创建一个shell可执行文件 cutlogs.sh。USR1亦通常被用来告知应用程序重载配置文件;例如,向Apache HTTP服务器发送一个USR1信号将导致以下步骤的发生:停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。

#!/bin/bash 
LOG_PATH="/usr/local/nginx/logs" 
RECORD_TIME=$(date -d "yesterday" +"%Y-%m-%d %H:%M:%S") 
PID=/usr/local/nginx/logs/nginx.pid 
mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${RECORD_TIME}.log 
mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${RECORD_TIME}.log 
kill -USR1 `cat $PID`
#为 cutlogs.sh 添加可执行的权限
chmod +x cutlogs.sh 
#运行脚本
./cutlogs.sh

5.2 创建定时任务

#安装定时任务,安装过了就不需要了
yum install crontabs 
#编辑并且添加一行新的任务
crontab -e
#每日执行一次
* * */1 * * /usr/local/nginx/sbin/cutlogs.sh
#重启定时任务
service crond restart

常用定时任务命令

service crond start #启动服务 
service crond stop #关闭服务 
service crond restart #重启服务 
service crond reload #重新载入配置 
crontab -e # 编辑任务 
crontab -l # 查看任务列表 
crontab -h #帮助

定时任务表达式

Cron表达式是,分为5或6个域,每个域代表一个含义,定时参考:https://crontab.guru/

周几 年(可选)
取值范围 0-59 0-23 1-31 1-12 1-7 2019/2020/…

常用表达式

#每分钟执行
*/1 * * * *
#每日凌晨(每天晚上23:59)执行
59 23 * * *
#每日凌晨1点执行
0 1 * * *

五、Nginx配置高可用集群

Nginx入门学习_第6张图片

原理如上,相信大家的水平应该都能看懂,在配置时需要一些准备工作

  1. 两台服务器

  2. 两台服务器都需要安装好Nginx

  3. 两台服务器需要安装keepalived

#安装命令
yum install keepalived -y
#检查是否安装好
rpm -q -a keepalived

安装安成后在/etc/keepalived下有配置文件,原理详看keepalived原理

主从配置(还有双主模式自行学习)

Nginx入门学习_第7张图片

1、修改keepalived配置文件

global_defs {
   ...
   #在/etc/hosts中修改
   router_id LVS_DEVEL    #主机名字
   ...
}

#检测脚本和权重参数
vrrp_script chk_http_port {
  script "/usr/local/src/nginx_check.sh"
  interval 2   #检测间隔
  weight -2  #权重
}

#虚拟IP配置
vrrp_instance VI_1 {
    state MASTER       #备份改成BACKUP
    interface eth0      #网卡  ifconfig可以查看
    virtual_router_id 51    #主备机必须相同
    priority 100      #优先级 主机较大,备份机较小
    advert_int 1    #心跳包间隔
    authentication {     #校验方式
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {    #可以绑定多个虚拟ip
       在这里添加虚拟ip地址
    }
}

2、在/usr/local/src添加检测脚本

#!/bin/bash
A=`ps -C nginx –no-header |wc -l` 
if [ $A -eq 0 ];then
  /usr/local/nginx/sbin/nginx
  sleep 2
  if [ `ps -C nginx --no-header |wc -l` -eq 0   ];then
    killall keepalived
  fi
fi

3、启动两台服务器的nginx和keepalived,其中备份机的keepalived配置需要简单修改,根据注释应该能看懂了。

注意:keepalived一般是在内网段进行,要公网服务器进行的话,需要至少三个公网ip(现阶段没这么多资金于是就没试验了),还有如果是虚拟机进行试验的话防火墙需要注意

六、Nginx配置ssl提供https访问

1、介绍与环境准备

1.1 https配置作用

HTTP (HyperText Transfer Protocol:超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。 简单来说就是一种发布和接收 HTML 页面的方法,被用于在 Web 浏览器和网站服务器之间传递信息。

HTTP 默认工作在 TCP 协议 80 端口,用户访问网站 http:// 打头的都是标准 HTTP 服务。

HTTP 协议以明文方式发送内容,==不提供任何方式的数据加密,==如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。

HTTPS (Hypertext Transfer Protocol Secure:超文本传输安全协议)是一种透过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。

1.2 配置步骤

  • 要有个域名,并且要有服务器(提供ip)并且服务器ip和域名要进行解析。

  • 购买ssl安全证书或者免费领取一个ssl安全证书。

  • 把域名和ssl安全证书进行绑定授权

  • 授权成功以后,然后把证书安装到nginx中。

2、阿里云下载SSL

2.1 前提准备

  • 一台服务器(ECS和轻量云服务器都可以)

  • 一个域名

  • 域名已经实名认证以及解析完毕

  • 服务器已备案

2.2 SSL证书申请

进入阿里云平台,认领免费证书,之后进行申请签发,很快就能审核通过,下载nginx证书到本地。这里注意一个证书只能对应一个具体的域名。
Nginx入门学习_第8张图片
Nginx入门学习_第9张图片

3、Nginx配置https

这里只需要ssl_certificate、ssl_certificate_key,另外配置server为443,并且将http重定向到443端口。配置完成后重启即可。

# 这个服务器是http://www.itbooking.net的服务
server {
    listen 80;
    #需要将yourdomain.com替换成证书绑定的域名。
    server_name www.shawn22.xyz; 
    #将所有HTTP请求通过rewrite指令重定向到HTTPS。
    rewrite ^(.*)$ https://$host$1; 
    location / {
        index index.html index.htm;
    }
}


# 这个服务器是https://www.itbooking.net的服务
server {
    listen 443 ssl;
    #配置HTTPS的默认访问端口为443。
    #如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
    #如果您使用Nginx 1.15.0及以上版本,请使用listen 443 ssl代替listen 443和ssl on。
    #需要将yourdomain.com替换成证书绑定的域名。
    server_name www.shawn22.xyz; 
    root html;
    index index.html index.htm;
    #需要将cert-file-name.pem替换成已上传的证书文件的名称
    ssl_certificate cert/6695459_www.shawn22.xyz.pem; 
    #需要将cert-file-name.key替换成已上传的证书密钥文件的名称。
    ssl_certificate_key cert/6695459_www.shawn22.xyz.key; 
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    #表示使用的加密套件的类型。
    #表示使用的TLS协议的类型。
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
    ssl_prefer_server_ciphers on;
    location / {
        #站点目录。
        root html;  
        index index.html index.htm;
    }
}

注:宝塔面板可能会有问题,可能需要重装


参考:

https://www.cnblogs.com/woshimrf/p/nginx-config-location.html

尚硅谷nginx学习视频


你可能感兴趣的:(#,中间件,nginx)