乐趣区

关于nginx:nginx简介

我的 github 该文档地址

nginx 简介

官网:https://nginx.org/

[TOC]

nginx 装置

yum install nginx

nginx 常用命令

名称 命令 备注
查看版本 nginx -v
查找装置门路 find / -name nginx 配置文件个别在 /etc/nginx/nginx.conf
启动 systemctl start nginx
查看状态 systemctl status nginx
从新加载配置文件 nginx -s reload 批改配置文件后,运行它,立即失效
疾速敞开 nginx -s stop
优雅的敞开 nginx -s quit

nginx 动态内容服务

web 服务一个重要工作就是提供文件服务,图片,html 页面

咱们举个例子:

​ 咱们创立一个动态页面,外面有一张图片,这须要咱们在配置文件中设置 http 中 server 中的 location

  • 我的项目文件构造

    [root@VM-0-5-centos data]# pwd
    /data
    [root@VM-0-5-centos data]# tree
    .
    └── fptxl
        ├── fptxl.html
        └── images
            └── rich_woman.jpg
  • 动态文件代码

    动态内容代码

  • nginx 配置

    nginx.conf 文件的 http–>server->location 配置

        # 前缀 "/" 会匹配所有申请,如果有多个 location 匹配一个申请,则抉择前缀最长的
        location / {
            #每个申请加上 root 的地址,就是文件在服务器的实在地址
            root /data/fptxl;
            #默认关上网页
            index fptxl.html
        }
        

    每次更改配置文件后,记得从新加载配置文件

    nginx -s reload

nginx 简略代理服务(前后端拆散例子)

nginx 一个罕用性能是当作代理服务器,承受申请,传给被代理服务器,获取响应,返回给客户端。

+------------+                +------------+                +----------------+
|            | +------------> |            | +------------> |                |
| http client|                |proxy server|                | proxied server |
|            | <------------+ |            | <------------+ |                |
+------------+                +------------+                +----------------+
   browser                        nginx                          tomcat

咱们举个例子:配置一个简略的代理服务用于解决后端申请,nginx 动态内容服务用于解决前端申请,这能够作为一种前后端拆散配置计划。

  1. 代理服务 nginx 配置

    nginx.conf 文件的 http–>server->location 配置

        location /fptxl/ {
            #每个申请都会加上 root 对应的地址,就是文件在服务器的实在地址
            proxy_pass http://localhost:8080/;
        }
    

    proxy_pass: 一个申请如果匹配了 location,匹配 location 的局部会被替换成 proxy_pass, 比方一个公网申请 http://fptxl.com/fptxl/actuat…,”/fptxl/actuator/env” 中匹配前缀 ”/fptxl/” 的局部会被替换为 http://localhost:8080/,最终地址为:“http://localhost:8080/”+“actuator/env”

    通过含有 proxy_pass 的 location,能够将多个不同 ip:port 的服务映射成同一个 ip:port 下不同门路的服务

    占用 8080 端口的是咱们在服务器运行的一个后端服务,用于查看后端服务

  2. 动态内容配置

    本例子中能够间接应用上方 nginx 动态内容服务

    动态文件地位:

    [root@VM-0-5-centos data]# tree
    .
    ├── fptxl
    │   ├── fetch.html
    │   ├── fptxl.html

    fetch.html 内容 拜访地址

    <button>get instance port</button>
    <script>
        const btn = document.querySelector('button');
        btn.addEventListener('click', () => {
            //https 拜访的时候此处会报错,该当应用
            //var url=window.location.protocol+"//fptxl.com/fptxl/actuator/env";
            var promise=fetch('http://fptxl.com/fptxl/actuator/env').then(response => response.json())
                .then(data => {var port=data["propertySources"][0]["properties"]["local.server.port"]["value"];
                    let pElem = document.createElement('p');
                    pElem.textContent = '外部服务端口为:'+port;
                    document.body.appendChild(pElem);
                })
        });
    </script>

    nginx 残缺配置

            # 前缀 "/" 会匹配所有申请,如果有多个 location 匹配一个申请,则抉择前缀最长的
            location / {
                #每个申请都会加上 root 对应的地址,就是文件在服务器的真是地址
                root /data/fptxl;
                #默认关上网页
                index fptxl.html;
            }
            
            # 如果有多个 location 匹配一个申请,则抉择前缀最长的
            location /fptxl/ {
                #每个申请都会加上 root 对应的地址,就是文件在服务器的真是地址
                proxy_pass http://localhost:8080/;
            }

负载平衡

简介

负载平衡通过多个利用实例来实现优化资源利用,最大化吞吐量,进步容错。

nginx 能够提供无效的 HTTP 负载平衡来散发信息到多个 web 利用的应用服务器中来进步性能、吞吐量、可靠性。

负载平衡的机制

nginx 提供以下几种负载平衡机制

轮询:以轮询的形式顺次将申请调度不同的服务器,即每次调度执行 i = (i + 1) mod n,并选出第 i 台服务器。

起码连贯:下一个申请会被指派给连接数起码的服务器

ip 哈希:应用基于客户端 ip 地址的哈希函数来决定应用哪台服务器提供服务

默认的负载平衡配置(轮询)

最简略的负载平衡配置:

http {
    #名称尽量不要应用特殊字符,防止应用了 nginx 关键字
    upstream backend {  #服务器集群名字   
        server    localhost:8080;# 服务器配置    
        server    localhost:18080;# 服务器配置  
    }

    server {
        listen 80;

        location /fptxl/ {proxy_pass http://backend/;}
    }
}

负载平衡默认应用 轮询,nginx 反向代理能够给 HTTP, HTTPS, FastCGI, uwsgi, SCGI, memcached, and gRPC 提供负载平衡。

最小连接数负载平衡

当有些工作耗时较长时,比拟适宜用起码连接数的形式。

黑话:当有些人工作过多时,给他少派发一些工作。

http {
    #名称尽量不要应用特殊字符,防止应用了 nginx 关键字
    upstream backend {  #服务器集群名字  
        least_conn;
        server    localhost:8080;# 服务器配置    
        server    localhost:18080;# 服务器配置  
    }
}

会话长久化(ip-hash)

轮询和最小连接数会使得后续的申请被派发给不同的服务,ip-hash 应用客户的 ip 地址作为哈希的 key 值来决定那个服务器提供服务,如果服务器没有做会话共享,能够应用这种形式。

# 名称尽量不要应用特殊字符,防止应用了 nginx 关键字
upstream backend {  #服务器集群名字  
    ip_hash;
    server    localhost:8080;# 服务器配置    
    server    localhost:18080;# 服务器配置  
}

权重负载平衡

权重能够应用在轮询、最小连接数、ip-hash 中

upstream backend {  #服务器集群名字  
    server    localhost:8080 weight=3; #服务器配置    
    server    localhost:18080;# 服务器配置  
}

这个配置,当有四个申请的时候,第一个服务器解决 3 个,第二个解决 1 个

配置 https 服务

生成 https 证书形式

点我取得 生成 https 证书形式的详细信息

sudo mkdir /etc/nginx/ssl
sudo openssl req -x509 -nodes -days 36500 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt

配置 https 服务

ssl 参数必须启用,证书和私匙必须指定,配置如下

    # HTTPS server
    #
    server {
        listen       443 ssl;
        ssl_certificate /etc/nginx/ssl/nginx.crt;
        ssl_certificate_key /etc/nginx/ssl/nginx.key;

        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers         HIGH:!aNULL:!MD5;

        # 前缀 "/" 会匹配所有申请,如果有多个 location 匹配一个申请,则抉择前缀最长的
        location / {
            #每个申请都会加上 root 对应的地址,就是文件在服务器的真是地址
            root /data/fptxl;
            #默认关上网页
            index fptxl.html;
        }
        
        location /fptxl/ {proxy_pass http://backend/;}
    }

留神:编码时候,尽量不要指定协定头,能够从通过 js(window.location.protocol)中获取,缩小 http 转化为 https 时协定不统一引起的异样。

websocket 配置

HTTP 1.1 反对将 HTTP/1.1 协定转化为 WebSocket

nginx 配置如下

http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

    server {
        location /chat/ {
            proxy_pass http://chat/;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_read_timeout 6000;
            proxy_set_header Origin "";
        }
    }

websocket 的 wss 配置

wss 与 ws 的区别在于一些 ssl 的配置,与 http 和 https 的区别统一

http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

    server {
        listen       8443 ssl;
        ssl_certificate /etc/nginx/ssl/nginx.crt;
        ssl_certificate_key /etc/nginx/ssl/nginx.key;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers         HIGH:!aNULL:!MD5;
    
        location /chat/ {
            proxy_pass http://chat/;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_read_timeout 6000;
            proxy_set_header Origin "";
        }
    }

wss 和 https 是能够共享 443 端口的。

这里不共享一个端口是因为 wss 的我的项目和 https 的我的项目是两个我的项目,动态文件地址不能合并在一起

nginx 局部指令解释

location:nginx 抉择 location 为申请提供服务,优先应用正则,其次应用最长前缀。

root:申请的根目录,一个残缺的申请是 root+uri,如果以后指令中没有 root, 则会应用上下文的 root. 如下配置,申请 /fptxl.html 的返回文件为 /data/fptxl/fptxl.html。

location /fptxl.html {root /data/fptxl;}

申请 ”/i/top.gif” 的响应是文件 ”/data/w3/i/top.gif”, 如果 location 没有 root 指令,则会应用 server 中配置的 root 指令

proxy_pass: 设置被代理服务的协定、地址和 uri,地址能够是域名或者 ip 和一个可选的端口

演示中的 nginx.conf


#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {worker_connections  1024;}


http {
    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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    
    #websocket 配置时应用
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

    #名称尽量不要应用特殊字符,防止应用了 nginx 关键字
    upstream backend {  #服务器集群名字  
        server    localhost:8080; #服务器配置    
        server    localhost:18080;# 服务器配置  
    }
    
    #名称尽量不要应用特殊字符,防止应用了 nginx 关键字
    upstream talk {  #服务器集群名字  
        server    localhost:8090; #服务器配置    
        server    localhost:8091;# 服务器配置  
    }
    
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        
        # 前缀 "/" 会匹配所有申请,如果有多个 location 匹配一个申请,则抉择前缀最长的
        location / {
            #每个申请加上 root 的地址,就是文件在服务器的实在地址
            root /data/fptxl;
            #默认关上网页
            index fptxl.html;
        }
        
        location /fptxl/ {proxy_pass http://backend/;}

        #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;}

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }
    
    
    server {
        listen       8088;
        server_name  localhost;
        
        location / {
            proxy_pass http://talk;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Origin "";
        }

    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

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


    # HTTPS server
    #
    server {
        listen       443 ssl;
        ssl_certificate /etc/nginx/ssl/nginx.crt;
        ssl_certificate_key /etc/nginx/ssl/nginx.key;

        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers         HIGH:!aNULL:!MD5;

        # 前缀 "/" 会匹配所有申请,如果有多个 location 匹配一个申请,则抉择前缀最长的
        location / {
            #每个申请加上 root 的地址,就是文件在服务器的实在地址
            root /data/fptxl;
            #默认关上网页
            index fptxl.html;
        }

        location /fptxl/ {proxy_pass http://backend/;}
        
    }
    
    server {
        listen       8443 ssl;
        ssl_certificate /etc/nginx/ssl/nginx.crt;
        ssl_certificate_key /etc/nginx/ssl/nginx.key;

        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers         HIGH:!aNULL:!MD5;

        location / {
            proxy_pass http://talk;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Origin "";
        }
        
    }

}

配置文件的服务器为 www.fptxl.com, 能够间接拜访,但因为是测试服务器,随时会生效

其它

问题:前端请代理中的后端申请地址,为什么不间接应用后端服务器的地址?参考答案:后端负载平衡。

退出移动版