Skip to content

Nginx

NGINX-logo-rgb-large

概述

Nginx是一种http协议服务器软件,使用C和C++语言开发,让程序员可以将网页发布在Nginx服务器上,让成千上万的用户可以浏览。除此之外,Nginx还是一种高性能的HTTP和反向代理服务器,同时也是一个代理邮件服务器。国内使用Nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。由俄罗斯的程序设计师Igor Sysoev所开发,官方测试nginx能够支支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定。

Nginx与Tomcat的区别

Nginx

  1. 是异步多进程处理请求,异步方式意味着多个请求(万级别的)只创建一个进程使用,适合高并发

  2. 只能处理静态资源请求,称为 http 协议服务器

Tomcat

  1. Tomcat 是同步多进程处理请求,同步方式意味着 1 个请求创建一个进程使用,多个请求创建多个进程使用,不适合高并发。

  2. 不仅可以处理静态资源请求,还可以处理动态资源请求。成为 web 应用服务器

总结

使用nginx用来接收互联网上大量的高并发请求,之后nginx分发(反向代理)给多台tomcat去处理。

Nginx作用

反向代理

  1. 正向代理

1576571197290

1576571005997

  1. 反向代理

1576571619653

1576571552695

动静分离

automating-installation-WordPress-Unit_topology

负载均衡

1576571577362

当每次有用户来访问的时候,nginx服务器先判断哪个真实访问服务器负载最小,分配这个用户去访问这个真实的服务器。

Nginx命令

  • ./nginx

启动Nginx

  • ./nginx -s reload

重启Nginx

  • ./nginx -s stop

停止Nginx

安装

安装Nginx

  • docker-compose.yml
yml
version: '3.9'
services:
  nginx:
    restart: always
    image: nginx:1.19.4
    container_name: nginx
    ports:
      - 80:80

networks:
 default:
   external: true
   name: global
  • 命令行
bash
docker-compose up -d

Nginx配置文件

  • worker_processes

工作进程数

  • worker_connections

单个工作进程可以允许同时建立外部连接的数量

  • include

代表引入一个外部的文件

  • nginx.conf
nginx
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

修改docker-compose文件

  • docker-compose.yml
yml
version: '3.9'
services:
  nginx:
    restart: always
    image: nginx:1.19.4
    container_name: nginx
    ports:
      - 80:80
    volumes:
      - ./conf.d/:/etc/nginx/conf.d
      - ./nginx.conf:/etc/nginx/nginx.conf

networks:
  default:
    external: true
 name: global
  • 命令行
bash
docker-comopse up -d

反向代理

Location映射路径匹配策略

http://nginx.org/en/docs/beginners_guide.html

匹配语法

nginx
location [ = | ~ | ~* | ^~ ] uri { ... }
  • =

严格匹配

  • ^~

前缀匹配

  • ~

正则匹配,不区分大小写

  • ~*

正则匹配,区分大小写

  • ``

不严格匹配

示例

nginx
location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}
  • /

匹配A配置

  • /index.html

匹配B配置

  • /documents/document.html

匹配C配置

  • /images/1.gif

匹配D配置

  • /documents/1.jpg

匹配E配置

练习

基于反向代理访问到Tomcat服务器

  • 准备资源

    Static_Dynamic.png

  • docker-compose.yml

    yml
    version: '3.9'
    services:
      nginx:
        restart: always
        image: nginx:1.19.4
        container_name: nginx
        ports:
          - 80:80
        volumes:
          - ./nginx.conf:/etc/nginx/nginx.conf
          - ./conf.d:/etc/nginx/conf.d
          - ./static:/usr/share/static
    
      tomcat:
        restart: always
        image: tomcat:8.5.68-jdk8
        container_name: tomcat
        volumes:
          - ./webapps:/usr/local/tomcat/webapps
    
    networks:
     default:
       external: true
       name: global
  • config.d/default.conf

    nginx
    server {
        listen       80;
        listen  [::]:80;
        server_name  localhost;
    
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
    
        location /static {
            alias  /usr/share/static/;
            index  index.html index.htm; 
        }
    
        location /dynamic {
            proxy_pass http://tomcat:8080/;
        }
    
        error_page   500 502 503 504  /50x.html;
    
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }

3 仿vue反向代理

rewrite即为vue-proxy中的pathRewrite 跨域主要涉及4个响应头:

Access-Control-Allow-Origin 用于设置允许跨域请求源地址 (预检请求和正式请求在跨域时候都会验证)

Access-Control-Allow-Headers 跨域允许携带的特殊头信息字段(只在预检请求验证)

Access-Control-Allow-Methods 跨域允许的请求方法或者说HTTP动词(只在预检请求验证)

Access-Control-Allow-Credentials 是否允许跨域使用cookies,如果要跨域使用cookies,可以添加上此请求响应头,值设为true(设置或者不设置,都不会影响请求发送,只会影响在跨域时候是否要携带cookies,但是如果设置,预检请求和正式请求都需要设置)。不过不建议跨域使用(项目中用到过,不过不稳定,有些浏览器带不过去),除非必要,因为有很多方案可以代替。

nginx
location  /foo {
  rewrite /foo/(.*) /$1  break;
  proxy_pass         http://localhost:3200;
  proxy_redirect     off;
  proxy_set_header   Host $host;
  proxy_set_header   Access-Control-Allow-Origin *;
#  proxy_set_header   Access-Control-Allow-Methods: POST, GET, OPTIONS;
#  proxy_set_header   Access-Control-Allow-Headers: X-PINGOTHER, Content-Type;
#  proxy_set_header   Access-Control-Allow-Credentials: true;
}

动静分离

nginx
server {
    listen       80;
    server_name  localhost;
    location / {
        proxy_next_upstream http_502 http_504 error timeout invalid_header;
        proxy_pass http://localhost:8082;
        # 真实的客户端IP
        proxy_set_header   X-Real-IP        $remote_addr; 
        # 请求头中Host信息
        proxy_set_header   Host             $host; 
        # 代理路由信息,此处取IP有安全隐患
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        # 真实的用户访问协议
        proxy_set_header   X-Forwarded-Proto $scheme;
    }

    #静态文件交给nginx处理
    location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
        root /static;
        expires 30d;
    }

    #静态文件交给nginx处理
    location ~ .*\.(js|css)?$ {
        root /static;
        expires 1h;
    }
 
    #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;
    }

负载均衡

Nginx支持以下负载均衡策略

  • 轮循
  • 权重
  • ip_hash
  • least_conn
  • fair(第三方)
  • url_hash(第三方)

轮循方案

docker-compose.yml

yml
version: '3.9'
services:
  nginx:
    restart: always
    image: nginx:1.19.4
    container_name: nginx
    ports:
      - 80:80
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./conf.d:/etc/nginx/conf.d
      - ./static:/usr/share/static

  tomcat1:
    restart: always
    image: tomcat:8.5.68-jdk8
    container_name: tomcat1
    volumes:
      - ./webapps:/usr/local/tomcat/webapps

  tomcat2:
    restart: always
    image: tomcat:8.5.68-jdk8
    container_name: tomcat2

networks:
 default:
   external: true
   name: global

default.conf

nginx
upstream user {
  server tomcat1:8080;
  server tomcat2:8080;
}

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    location /static {
        alias  /usr/share/static/;
        index  index.html index.htm;
    }

    location /dynamic {
        proxy_pass http://user/;
    }

    error_page   500 502 503 504  /50x.html;

    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

权重方案

default.conf

nginx
upstream 名字 {
  server ip:port weight=权重比例,默认为1;
  server ip:port weight=权重比例;
}

server {
  listen 80;
  server_name localhost;
  
  location / {
    proxy_pass http://upstream的名字/;
  }
}

ip_hash方案

default.conf

nginx
upstream 名字 {
  ip_hash;
  server ip:port;
  server ip:port;
}

server {
  listen 80;
  server_name localhost;
  
  location / {
    proxy_pass http://upstream的名字/;
  }
}

参考资料

http://nginx.org/en/docs/http/ngx_http_core_module.html

学习目标总结

  • 掌握 Nginx 的三种负载均衡方案
  • 了解 Nginx 的六种负载均衡方案
  • 掌握 Nginx 的动静分离配置