概述

【澳门金沙国际】nginx简易教程,Nginx简易教程。 

 

nginx简易教程,nginx

 

  • 博客园
  • 首页
  • 新随笔
  • 联系
    • 管理

随笔 – 149  文章 – 28  评论

  • 205

nginx简易教程

目录
nginx简易教程
  概述
  安装与使用
    安装
      从源代码编译 Nginx
      Windows 安装
    使用
  nginx 配置实战
    http反向代理配置
    负载均衡配置
    网站有多个webapp的配置
    https反向代理配置
    静态站点配置
    跨域解决方案
  参考

 

  • 博客园
  • 首页
  • 新随笔
  • 联系
    • 管理
  • 博客园
  • 首页
  • 新随笔
  • 联系
    • 管理

nginx简易教程

什么是nginx?

随笔 – 149  文章 – 28  评论

随笔 – 149  文章 – 28  评论

概述

什么是nginx?

Nginx (engine x) 是一款轻量级的Web 服务器
、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。

什么是反向代理?

反向代理(Reverse
Proxy)格局是指以代理服务器来接受internet上的连天请求,然后将呼吁转载给内部互联网上的服务器,并将从服务器上得到的结果重临给internet上呼吁连接的客户端,此时期理服务器对外就显示为3个反向代理服务器。

Nginx (engine x) 是①款轻量级的Web 服务器
、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。

  • 205
  • 205

安装与应用

 

nginx简易教程

目录

nginx简易教程
  概述
  安装与使用
    安装
      从源代码编写翻译Nginx
      Windows
安装
    使用
  nginx
配置实战
    http反向代理配置
    负载均衡布局
    网址有六个webapp的布署
    https反向代理配置
    静态站点布局
    跨域消除方案
  参考

nginx简易教程

目录

nginx简易教程
  概述
  安装与行使
    安装
      从源代码编译Nginx
      Windows
安装
    使用
  nginx
配置实战
    http反向代理配置
    负载均衡配置
    网站有多少个webapp的布局
    https反向代理配置
    静态站点布局
    跨域解决方案
  参考

安装

nginx官方网址下载地址

发表版本分为 Linux 和 windows 版本。

也能够下载源码,编写翻译后运营。

怎么着是反向代理?

nginx简易教程

nginx简易教程

从源代码编写翻译 Nginx

把源码解压缩之后,在终极里运转如下命令:

$ ./configure
$ make
$ sudo make install

默许情形下,Nginx 会被安装在
/usr/local/nginx。通过设确定人员编制写翻译选项,你能够转移那几个设定。

反向代理(Reverse
Proxy)方式是指以代理服务器来经受internet上的接连请求,然后将请求转载给内部网络上的服务器,并将从服务器上赢得的结果再次来到给internet上呼吁连接的客户端,此时期理服务器对外就显现为一个反向代理服务器。

概述

什么是nginx?

Nginx (engine x) 是一款轻量级的Web 服务器
、反向代理服务器及电子邮件(IMAP/POP三)代理服务器。

怎样是反向代理?

反向代理(Reverse
Proxy)格局是指以代理服务器来经受internet上的连接请求,然后将请求转载给内部互联网上的服务器,并将从服务器上获得的结果回到给internet上呼吁连接的客户端,此时期理服务器对外就突显为2个反向代理服务器。

概述

什么是nginx?

Nginx (engine x) 是一款轻量级的Web 服务器
、反向代理服务器及电子邮件(IMAP/POP三)代理服务器。

什么是反向代理?

反向代理(Reverse
Proxy)方式是指以代理服务器来接受internet上的接二连三请求,然后将呼吁转载给内部互联网上的服务器,并将从服务器上获取的结果再次来到给internet上呼吁连接的客户端,此时期理服务器对外就展现为三个反向代理服务器。

Windows 安装

为了设置 Nginx / Win3二,需先下载它。然后解压之,然后运转就可以。上边以 C
盘根目录为例表明下:

cd C:
cd C:\nginx-0.8.54   start nginx

Nginx / Win3二 是运作在三个调整台程序,而非 windows
服务措施的。服务器方式当下照旧支付尝试中。

澳门金沙国际 1

设置与运用

设置与使用

使用

nginx 的应用比较轻易,正是几条命令。

常用到的授命如下:

nginx -s stop       快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。
nginx -s quit       平稳关闭Nginx,保存相关信息,有安排的结束web服务。
nginx -s reload     因改变了Nginx相关配置,需要重新加载配置而重载。
nginx -s reopen     重新打开日志文件。
nginx -c filename   为 Nginx 指定一个配置文件,来代替缺省的。
nginx -t            不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
nginx -v            显示 nginx 的版本。
nginx -V            显示 nginx 的版本,编译器版本和配置参数。

假定不想每趟都敲命令,能够在nginx安装目录下新扩大三个开首批处理公事startup.bat,双击就能够运营。内容如下:

@echo off
rem 如果启动前已经启动nginx并记录下pid文件,会kill指定进程
nginx.exe -s stop

rem 测试配置文件语法正确性
nginx.exe -t -c conf/nginx.conf

rem 显示版本信息
nginx.exe -v

rem 按照指定配置去启动nginx
nginx.exe -c conf/nginx.conf

若果是运作在 Linux 下,写三个 shell 脚本,营口小异。

 

安装

nginx官方网站下载地址

颁发版本分为 Linux 和 windows 版本。

也足以下载源码,编写翻译后运维。

安装

nginx官方网站下载地址

发表版本分为 Linux 和 windows 版本。

也能够下载源码,编写翻译后运转。

nginx 配置实战

笔者始终感觉,种种开垦工具的配备也许结合实战来讲述,会令人更易驾驭。

安装与行使

从源代码编写翻译 Nginx

把源码解压缩之后,在极端里运行如下命令:

$ ./configure
$ make
$ sudo make install

默许情状下,Nginx 会棉被服装置在
/usr/local/nginx。通过设定编译选项,你能够转移这么些设定。

从源代码编写翻译 Nginx

把源码解压缩之后,在极限里运转如下命令:

$ ./configure
$ make
$ sudo make install

暗中同意情状下,Nginx 会被设置在
/usr/local/nginx。通过设定编写翻译选项,你能够改造那个设定。

http反向代理配置

我们先达成二个小目标:不思虑复杂的铺排,仅仅是马到成功3个 http 反向代理。

nginx.conf 配置文件如下:
注:conf / nginx.conf 是 nginx 的默许配置文件。你也足以行使 nginx -c
钦定你的安插文件

#运行用户
#user somebody;

#启动进程,通常设置成和cpu的数量相等
worker_processes  1;

#全局错误日志
error_log  D:/Tools/nginx-1.10.1/logs/error.log;
error_log  D:/Tools/nginx-1.10.1/logs/notice.log  notice;
error_log  D:/Tools/nginx-1.10.1/logs/info.log  info;

#PID文件,记录当前启动的nginx的进程ID
pid        D:/Tools/nginx-1.10.1/logs/nginx.pid;

#工作模式及连接数上限
events {
    worker_connections 1024;    #单个后台worker process进程的最大并发链接数
}

#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
    #设定mime类型(邮件支持类型),类型由mime.types文件定义
    include       D:/Tools/nginx-1.10.1/conf/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    D:/Tools/nginx-1.10.1/logs/access.log main;
    rewrite_log     on;

    #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
    #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
    sendfile        on;
    #tcp_nopush     on;

    #连接超时时间
    keepalive_timeout  120;
    tcp_nodelay        on;

    #gzip压缩开关
    #gzip  on;

    #设定实际的服务器列表 
    upstream zp_server1{
        server 127.0.0.1:8089;
    }

    #HTTP服务器
    server {
        #监听80端口,80端口是知名端口号,用于HTTP协议
        listen       80;

        #定义使用www.xx.com访问
        server_name  www.helloworld.com;

        #首页
        index index.html

        #指向webapp的目录
        root D:\01_Workspace\Project\github\zp\SpringNotes\spring-security\spring-shiro\src\main\webapp;

        #编码格式
        charset utf-8;

        #代理配置参数
        proxy_connect_timeout 180;
        proxy_send_timeout 180;
        proxy_read_timeout 180;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarder-For $remote_addr;

        #反向代理的路径(和upstream绑定),location 后面设置映射的路径
        location / {
            proxy_pass http://zp_server1;
        } 

        #静态文件,nginx自己处理
        location ~ ^/(images|javascript|js|css|flash|media|static)/ {
            root D:\01_Workspace\Project\github\zp\SpringNotes\spring-security\spring-shiro\src\main\webapp\views;
            #过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。
            expires 30d;
        }

        #设定查看Nginx状态的地址
        location /NginxStatus {
            stub_status           on;
            access_log            on;
            auth_basic            "NginxStatus";
            auth_basic_user_file  conf/htpasswd;
        }

        #禁止访问 .htxxx 文件
        location ~ /\.ht {
            deny all;
        }

        #错误处理页面(可选择性配置)
        #error_page   404              /404.html;
        #error_page   500 502 503 504  /50x.html;
        #location = /50x.html {
        #    root   html;
        #}
    }
}

好了,让大家来试试看啊:

安装

Windows 安装

为了设置 Nginx / Win32,需先下载它。然后解压之,然后运转就可以。上边以 C
盘根目录为例表达下:

cd C:
cd C:\nginx-0.8.54   start nginx

Nginx / Win32 是运作在二个调控台程序,而非 windows
服务措施的。服务器格局当下依旧支付尝试中。

Windows 安装

为了设置 Nginx / Win3二,需先下载它。然后解压之,然后运维就可以。下边以 C
盘根目录为例表达下:

cd C:
cd C:\nginx-0.8.54   start nginx

Nginx / Win3二 是运转在三个调控台程序,而非 windows
服务方法的。服务器形式当下照旧支付尝试中。

负载均衡配置

上多个例子中,代理仅仅针对2个服务器。

唯独,网址在实质上运行进度中,多半都以有多台服务器运维着同样的app,这时急需选用负载均衡来分散。

nginx也足以实现轻易的载荷均衡功效。

即便那样贰个采纳场景:将利用计划在
192.16八.壹.1一:80、19二.168.一.12:80、1玖二.16捌.一.1叁:80
叁台linux环境的服务器上。网址域名称为 www.helloworld.com,公网IP为
1玖二.16八.壹.11。在公网IP所在的服务器上配置
nginx,对持有请求做负载均衡处理。

nginx.conf 配置如下:

http {
     #设定mime类型,类型由mime.type文件定义
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    #设定日志格式
    access_log    /var/log/nginx/access.log;

    #设定负载均衡的服务器列表
    upstream load_balance_server {
        #weigth参数表示权值,权值越高被分配到的几率越大
        server 192.168.1.11:80   weight=5;
        server 192.168.1.12:80   weight=1;
        server 192.168.1.13:80   weight=6;
    }

   #HTTP服务器
   server {
        #侦听80端口
        listen       80;

        #定义使用www.xx.com访问
        server_name  www.helloworld.com;

        #对所有请求进行负载均衡请求
        location / {
            root        /root;                 #定义服务器的默认网站根目录位置
            index       index.html index.htm;  #定义首页索引文件的名称
            proxy_pass  http://load_balance_server ;#请求转向load_balance_server 定义的服务器列表

            #以下是一些反向代理的配置(可选择性配置)
            #proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_connect_timeout 90;          #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout 90;             #后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout 90;             #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_buffer_size 4k;              #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            proxy_buffers 4 32k;               #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
            proxy_busy_buffers_size 64k;       #高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;    #设定缓存文件夹大小,大于这个值,将从upstream服务器传

            client_max_body_size 10m;          #允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k;      #缓冲区代理缓冲用户端请求的最大字节数
        }
    }
}

nginx官方网址下载地址: Linux 和 windows
版本。

使用

nginx 的选拔相比较轻巧,就是几条命令。

常用到的指令如下:

nginx -s stop       快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。
nginx -s quit       平稳关闭Nginx,保存相关信息,有安排的结束web服务。
nginx -s reload     因改变了Nginx相关配置,需要重新加载配置而重载。
nginx -s reopen     重新打开日志文件。
nginx -c filename   为 Nginx 指定一个配置文件,来代替缺省的。
nginx -t            不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
nginx -v            显示 nginx 的版本。
nginx -V            显示 nginx 的版本,编译器版本和配置参数。

假如不想每回都敲命令,能够在nginx安装目录下新增3个起步批处理文件startup.bat,双击就可以运维。内容如下:

@echo off
rem 如果启动前已经启动nginx并记录下pid文件,会kill指定进程
nginx.exe -s stop

rem 测试配置文件语法正确性
nginx.exe -t -c conf/nginx.conf

rem 显示版本信息
nginx.exe -v

rem 按照指定配置去启动nginx
nginx.exe -c conf/nginx.conf

只即使运行在 Linux 下,写三个 shell 脚本,南平小异。

使用

nginx 的应用相比较简单,正是几条命令。

常用到的通令如下:

nginx -s stop       快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。
nginx -s quit       平稳关闭Nginx,保存相关信息,有安排的结束web服务。
nginx -s reload     因改变了Nginx相关配置,需要重新加载配置而重载。
nginx -s reopen     重新打开日志文件。
nginx -c filename   为 Nginx 指定一个配置文件,来代替缺省的。
nginx -t            不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
nginx -v            显示 nginx 的版本。
nginx -V            显示 nginx 的版本,编译器版本和配置参数。

若是不想每一次都敲命令,能够在nginx安装目录下新增加一个起动批处理公事startup.bat,双击就可以运维。内容如下:

@echo off
rem 如果启动前已经启动nginx并记录下pid文件,会kill指定进程
nginx.exe -s stop

rem 测试配置文件语法正确性
nginx.exe -t -c conf/nginx.conf

rem 显示版本信息
nginx.exe -v

rem 按照指定配置去启动nginx
nginx.exe -c conf/nginx.conf

如果是运营在 Linux 下,写1个 shell 脚本,通化小异。

网址有多少个webapp的布局

当3个网址功效越来越充足时,往往必要将有个别功效相对独立的模块剥离出来,独立维护。那样的话,经常,会有四个webapp。

举个例证:倘使 www.helloworld.com
站点有几许个webapp,finance(金融)、product(产品)、admin(用户宗旨)。访问那么些使用的法子通过上下文(context)来开始展览区分:

www.helloworld.com/finance/

www.helloworld.com/product/

www.helloworld.com/admin/

大家领略,http的暗中认可端口号是80,假诺在1台服务器上同时起步那二个 webapp
应用,都用80端口,确定是不成的。所以,那多少个使用要求各自绑定差异的端口号。

那正是说,难点来了,用户在其实访问 www.helloworld.com 站点时,访问区别webapp,总不会还带着相应的端口号去访问吧。所以,你再一次索要运用反向代理来做拍卖。

布局也简单,来探视怎么办吧:

http {
    #此处省略一些基本配置

    upstream product_server{
        server www.helloworld.com:8081;
    }

    upstream admin_server{
        server www.helloworld.com:8082;
    }

    upstream finance_server{
        server www.helloworld.com:8083;
    }

    server {
        #此处省略一些基本配置
        #默认指向product的server
        location / {
            proxy_pass http://product_server;
        }

        location /product/{
            proxy_pass http://product_server;
        }

        location /admin/ {
            proxy_pass http://admin_server;
        }

        location /finance/ {
            proxy_pass http://finance_server;
        }
    }
}

也得以下载源码,编写翻译后运营。

nginx 配置实战

小编始终认为,种种开辟工具的配备或许结合实战来描述,会令人更易领会。

nginx 配置实战

本身始终感到,各样开采工具的配备只怕结合实战来讲述,会令人更易驾驭。

https反向代理配置

壹对对安全性要求比较高的站点,或者会利用
HTTPS(壹种采纳ssl通讯标准的安全HTTP协议)。

这边不广泛 HTTP 协议和 SSL 标准。可是,使用 nginx 配置 https
须要通晓几点:

  • HTTPS 的固定端口号是 4四3,不相同于 HTTP 的 80 端口
  • SSL 标准须求引进安全证书,所以在 nginx.conf
    中您要求钦点证书和它对应的 key

其余和 http 反向代理基本等同,只是在 Server 部分铺排有些分裂。

  #HTTP服务器
  server {
      #监听443端口。443为知名端口号,主要用于HTTPS协议
      listen       443 ssl;

      #定义使用www.xx.com访问
      server_name  www.helloworld.com;

      #ssl证书文件位置(常见证书文件格式为:crt/pem)
      ssl_certificate      cert.pem;
      #ssl证书key位置
      ssl_certificate_key  cert.key;

      #ssl配置参数(选择性配置)
      ssl_session_cache    shared:SSL:1m;
      ssl_session_timeout  5m;
      #数字签名,此处使用MD5
      ssl_ciphers  HIGH:!aNULL:!MD5;
      ssl_prefer_server_ciphers  on;

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

 

http反向代理配置

咱俩先达成一个小目的:不挂念复杂的布局,仅仅是产生3个 http 反向代理。

nginx.conf 配置文件如下:
注:conf / nginx.conf 是 nginx 的暗中认可配置文件。你也得以选用 nginx -c
内定你的布署文件

#运行用户
#user somebody;

#启动进程,通常设置成和cpu的数量相等
worker_processes  1;

#全局错误日志
error_log  D:/Tools/nginx-1.10.1/logs/error.log;
error_log  D:/Tools/nginx-1.10.1/logs/notice.log  notice;
error_log  D:/Tools/nginx-1.10.1/logs/info.log  info;

#PID文件,记录当前启动的nginx的进程ID
pid        D:/Tools/nginx-1.10.1/logs/nginx.pid;

#工作模式及连接数上限
events {
    worker_connections 1024;    #单个后台worker process进程的最大并发链接数
}

#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
    #设定mime类型(邮件支持类型),类型由mime.types文件定义
    include       D:/Tools/nginx-1.10.1/conf/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    D:/Tools/nginx-1.10.1/logs/access.log main;
    rewrite_log     on;

    #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
    #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
    sendfile        on;
    #tcp_nopush     on;

    #连接超时时间
    keepalive_timeout  120;
    tcp_nodelay        on;

    #gzip压缩开关
    #gzip  on;

    #设定实际的服务器列表 
    upstream zp_server1{
        server 127.0.0.1:8089;
    }

    #HTTP服务器
    server {
        #监听80端口,80端口是知名端口号,用于HTTP协议
        listen       80;

        #定义使用www.xx.com访问
        server_name  www.helloworld.com;

        #首页
        index index.html

        #指向webapp的目录
        root D:\01_Workspace\Project\github\zp\SpringNotes\spring-security\spring-shiro\src\main\webapp;

        #编码格式
        charset utf-8;

        #代理配置参数
        proxy_connect_timeout 180;
        proxy_send_timeout 180;
        proxy_read_timeout 180;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarder-For $remote_addr;

        #反向代理的路径(和upstream绑定),location 后面设置映射的路径
        location / {
            proxy_pass http://zp_server1;
        } 

        #静态文件,nginx自己处理
        location ~ ^/(images|javascript|js|css|flash|media|static)/ {
            root D:\01_Workspace\Project\github\zp\SpringNotes\spring-security\spring-shiro\src\main\webapp\views;
            #过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。
            expires 30d;
        }

        #设定查看Nginx状态的地址
        location /NginxStatus {
            stub_status           on;
            access_log            on;
            auth_basic            "NginxStatus";
            auth_basic_user_file  conf/htpasswd;
        }

        #禁止访问 .htxxx 文件
        location ~ /\.ht {
            deny all;
        }

        #错误处理页面(可选择性配置)
        #error_page   404              /404.html;
        #error_page   500 502 503 504  /50x.html;
        #location = /50x.html {
        #    root   html;
        #}
    }
}

好了,让我们来试试看啊:

  1. 启航 webapp,注意运行绑定的端口要和nginx中的 upstream
    设置的端口保持一致。
  2. 更改 host:在 C:\Windows\System32\drivers\etc
    目录下的host文件中加多一条 DNS 记录

    127.0.0.1 www.helloworld.com
    
  3. 开端前文中 startup.bat 的通令

  4. 在浏览器中访问 www.helloworld.com,不出意外,已经能够访问了。

http反向代理配置

我们先完毕一个小目的:不思量复杂的陈设,仅仅是达成2个 http 反向代理。

澳门金沙国际,nginx.conf 配置文件如下:
注:conf / nginx.conf 是 nginx 的暗中同意配置文件。你也得以行使 nginx -c
钦点你的安顿文件

#运行用户
#user somebody;

#启动进程,通常设置成和cpu的数量相等
worker_processes  1;

#全局错误日志
error_log  D:/Tools/nginx-1.10.1/logs/error.log;
error_log  D:/Tools/nginx-1.10.1/logs/notice.log  notice;
error_log  D:/Tools/nginx-1.10.1/logs/info.log  info;

#PID文件,记录当前启动的nginx的进程ID
pid        D:/Tools/nginx-1.10.1/logs/nginx.pid;

#工作模式及连接数上限
events {
    worker_connections 1024;    #单个后台worker process进程的最大并发链接数
}

#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
    #设定mime类型(邮件支持类型),类型由mime.types文件定义
    include       D:/Tools/nginx-1.10.1/conf/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    D:/Tools/nginx-1.10.1/logs/access.log main;
    rewrite_log     on;

    #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
    #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
    sendfile        on;
    #tcp_nopush     on;

    #连接超时时间
    keepalive_timeout  120;
    tcp_nodelay        on;

    #gzip压缩开关
    #gzip  on;

    #设定实际的服务器列表 
    upstream zp_server1{
        server 127.0.0.1:8089;
    }

    #HTTP服务器
    server {
        #监听80端口,80端口是知名端口号,用于HTTP协议
        listen       80;

        #定义使用www.xx.com访问
        server_name  www.helloworld.com;

        #首页
        index index.html

        #指向webapp的目录
        root D:\01_Workspace\Project\github\zp\SpringNotes\spring-security\spring-shiro\src\main\webapp;

        #编码格式
        charset utf-8;

        #代理配置参数
        proxy_connect_timeout 180;
        proxy_send_timeout 180;
        proxy_read_timeout 180;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarder-For $remote_addr;

        #反向代理的路径(和upstream绑定),location 后面设置映射的路径
        location / {
            proxy_pass http://zp_server1;
        } 

        #静态文件,nginx自己处理
        location ~ ^/(images|javascript|js|css|flash|media|static)/ {
            root D:\01_Workspace\Project\github\zp\SpringNotes\spring-security\spring-shiro\src\main\webapp\views;
            #过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。
            expires 30d;
        }

        #设定查看Nginx状态的地址
        location /NginxStatus {
            stub_status           on;
            access_log            on;
            auth_basic            "NginxStatus";
            auth_basic_user_file  conf/htpasswd;
        }

        #禁止访问 .htxxx 文件
        location ~ /\.ht {
            deny all;
        }

        #错误处理页面(可选择性配置)
        #error_page   404              /404.html;
        #error_page   500 502 503 504  /50x.html;
        #location = /50x.html {
        #    root   html;
        #}
    }
}

好了,让大家来试试吧:

  1. 运营 webapp,注意运维绑定的端口要和nginx中的 upstream
    设置的端口保持壹致。
  2. 更改 host:在 C:\Windows\System32\drivers\etc
    目录下的host文件中增加一条 DNS 记录

    127.0.0.1 www.helloworld.com
    
  3. 开发银行前文中 startup.bat 的命令

  4. 在浏览器中访问 www.helloworld.com,不出意外,已经能够访问了。

静态站点布局

偶尔,大家须求安排静态站点(即 html 文件和一群静态财富)。

比喻来说:假诺具有的静态能源都献身了 /app/dist 目录下,大家只必要在
nginx.conf 中钦赐首页以及那么些站点的 host 就可以。

安插如下:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    gzip on;
    gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/javascript image/jpeg image/gif image/png;
    gzip_vary on;

    server {
        listen       80;
        server_name  static.zp.cn;

        location / {
            root /app/dist;
            index index.html;
            #转发任何请求到 index.html
        }
    }
}

然后,添加 HOST:

127.0.0.1 static.zp.cn

此刻,在本土浏览器访问 static.zp.cn ,就能够访问静态站点了。

从源代码编写翻译 Nginx

负载均衡布局

上二个事例中,代理仅仅针对多少个服务器。

唯独,网址在实际运行进度中,多半都以有多台服务器运转着同样的app,那时急需运用负载均衡来分散。

nginx也能够实现轻易的载荷均衡作用。

只要那样二个利用场景:将接纳安顿在
1九二.168.1.1一:80、19二.168.壹.1二:80、1玖贰.168.一.13:80
3台linux环境的服务器上。网址域名称叫 www.helloworld.com,公网IP为
1玖贰.168.一.1壹。在公网IP所在的服务器上配备
nginx,对持有请求做负载均衡处理。

nginx.conf 配置如下:

http {
     #设定mime类型,类型由mime.type文件定义
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    #设定日志格式
    access_log    /var/log/nginx/access.log;

    #设定负载均衡的服务器列表
    upstream load_balance_server {
        #weigth参数表示权值,权值越高被分配到的几率越大
        server 192.168.1.11:80   weight=5;
        server 192.168.1.12:80   weight=1;
        server 192.168.1.13:80   weight=6;
    }

   #HTTP服务器
   server {
        #侦听80端口
        listen       80;

        #定义使用www.xx.com访问
        server_name  www.helloworld.com;

        #对所有请求进行负载均衡请求
        location / {
            root        /root;                 #定义服务器的默认网站根目录位置
            index       index.html index.htm;  #定义首页索引文件的名称
            proxy_pass  http://load_balance_server ;#请求转向load_balance_server 定义的服务器列表

            #以下是一些反向代理的配置(可选择性配置)
            #proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_connect_timeout 90;          #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout 90;             #后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout 90;             #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_buffer_size 4k;              #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            proxy_buffers 4 32k;               #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
            proxy_busy_buffers_size 64k;       #高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;    #设定缓存文件夹大小,大于这个值,将从upstream服务器传

            client_max_body_size 10m;          #允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k;      #缓冲区代理缓冲用户端请求的最大字节数
        }
    }
}

负载均衡配置

上一个例证中,代理仅仅针对三个服务器。

不过,网站在实质上运行进度中,多半都以有多台服务器运营着同等的app,那时急需选拔负载均衡来分散。

nginx也足以完结轻便的负载均衡功用。

即使那样二个应用场景:将应用布置在
1九2.16八.一.1一:80、192.168.一.1二:80、1九二.16八.一.1三:80
三台linux环境的服务器上。网址域名为 www.helloworld.com,公网IP为
1九贰.16八.1.1一。在公网IP所在的服务器上安排nginx,对负有请求做负载均衡处理。

nginx.conf 配置如下:

http {
     #设定mime类型,类型由mime.type文件定义
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    #设定日志格式
    access_log    /var/log/nginx/access.log;

    #设定负载均衡的服务器列表
    upstream load_balance_server {
        #weigth参数表示权值,权值越高被分配到的几率越大
        server 192.168.1.11:80   weight=5;
        server 192.168.1.12:80   weight=1;
        server 192.168.1.13:80   weight=6;
    }

   #HTTP服务器
   server {
        #侦听80端口
        listen       80;

        #定义使用www.xx.com访问
        server_name  www.helloworld.com;

        #对所有请求进行负载均衡请求
        location / {
            root        /root;                 #定义服务器的默认网站根目录位置
            index       index.html index.htm;  #定义首页索引文件的名称
            proxy_pass  http://load_balance_server ;#请求转向load_balance_server 定义的服务器列表

            #以下是一些反向代理的配置(可选择性配置)
            #proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_connect_timeout 90;          #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout 90;             #后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout 90;             #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_buffer_size 4k;              #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            proxy_buffers 4 32k;               #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
            proxy_busy_buffers_size 64k;       #高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;    #设定缓存文件夹大小,大于这个值,将从upstream服务器传

            client_max_body_size 10m;          #允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k;      #缓冲区代理缓冲用户端请求的最大字节数
        }
    }
}

跨域解决方案

web
领域支出中,平常利用前后端分离形式。那种格局下,前端和后端分别是单身的
web 应用程序,例如:后端是 Java 程序,前端是 React 或 Vue 应用。

分级独立的 web app
在交互访问时,势必存在跨域难题。消除跨域难点壹般有三种思路:

在后端服务器设置 HTTP 响应头,把您供给周转访问的域名参与参加
Access-Control-Allow-Origin 中。

把后端根据请求,构造json数据,并回到,前端用 jsonp 跨域。

那三种思路,本文不张开研商。

亟待验证的是,nginx 依据第3种思路,也提供了1种缓解跨域的缓解方案。

举例:www.helloworld.com 网址是由三个前端 app ,一个后端 app
组成的。前端端口号为 七千, 后端端口号为 8080。

前者和后端若是利用 http
进行互动时,请求会被驳回,因为存在跨域难题。来看望,nginx
是怎么化解的吧:

首先,在 enable-cors.conf 文件中装置 cors :

# allow origin list
set $ACAO '*';

# set single origin
if ($http_origin ~* (www.helloworld.com)$) {
  set $ACAO $http_origin;
}

if ($cors = "trueget") {
    add_header 'Access-Control-Allow-Origin' "$http_origin";
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}

if ($request_method = 'OPTIONS') {
  set $cors "${cors}options";
}

if ($request_method = 'GET') {
  set $cors "${cors}get";
}

if ($request_method = 'POST') {
  set $cors "${cors}post";
}

接下去,在您的服务器中 include enable-cors.conf 来引进跨域配置:

# ----------------------------------------------------
# 此文件为项目 nginx 配置片段
# 可以直接在 nginx config 中 include(推荐)
# 或者 copy 到现有 nginx 中,自行配置
# www.helloworld.com 域名需配合 dns hosts 进行配置
# 其中,api 开启了 cors,需配合本目录下另一份配置文件
# ----------------------------------------------------
upstream front_server{
  server www.helloworld.com:9000;
}
upstream api_server{
  server www.helloworld.com:8080;
}

server {
  listen       80;
  server_name  www.helloworld.com;

  location ~ ^/api/ {
    include enable-cors.conf;
    proxy_pass http://api_server;
    rewrite "^/api/(.*)$" /$1 break;
  }

  location ~ ^/ {
    proxy_pass http://front_server;
  }
}

今日头条 首页 新小说 联系 管理
小说 – 14九 文章 – 2八 评论 – 205 nginx简易教程 目录 nginx简易教程   概述
  安装与利用…

把源码解压缩之后,在终点里运营如下命令:

网址有多少个webapp的配备

当一个网址功用越来越丰富时,往往须要将部分效益相对独立的模块剥离出去,独立维护。这样的话,常常,会有多个webapp。

举个例子:若是 www.helloworld.com
站点有几许个webapp,finance(金融)、product(产品)、admin(用户主题)。访问这么些使用的措施经过上下文(context)来进展区分:

www.helloworld.com/finance/

www.helloworld.com/product/

www.helloworld.com/admin/

我们驾驭,http的默许端口号是80,假使在壹台服务器上还要运维那一个 webapp
应用,都用80端口,料定是不成的。所以,这四个应用须求各自绑定差别的端口号。

那么,难题来了,用户在其实访问 www.helloworld.com 站点时,访问分化webapp,总不会还带着相应的端口号去访问吧。所以,你再一次索要运用反向代理来做拍卖。

安插也轻巧,来看望怎么办呢:

http {
    #此处省略一些基本配置

    upstream product_server{
        server www.helloworld.com:8081;
    }

    upstream admin_server{
        server www.helloworld.com:8082;
    }

    upstream finance_server{
        server www.helloworld.com:8083;
    }

    server {
        #此处省略一些基本配置
        #默认指向product的server
        location / {
            proxy_pass http://product_server;
        }

        location /product/{
            proxy_pass http://product_server;
        }

        location /admin/ {
            proxy_pass http://admin_server;
        }

        location /finance/ {
            proxy_pass http://finance_server;
        }
    }
}

网址有多个webapp的配置

当一个网址作用越来越足够时,往往必要将一些成效相对独立的模块剥离出来,独立维护。那样的话,日常,会有多个webapp。

举个例证:借使 www.helloworld.com
站点有几许个webapp,finance(金融)、product(产品)、admin(用户中央)。访问那些应用的不二等秘书诀通过上下文(context)来进展区分:

www.helloworld.com/finance/

www.helloworld.com/product/

www.helloworld.com/admin/

我们掌握,http的暗中认可端口号是80,如若在1台服务器上同时起步这1个 webapp
应用,都用80端口,分明是不成的。所以,那三个使用要求各自绑定差别的端口号。

这正是说,难题来了,用户在事实上访问 www.helloworld.com 站点时,访问分歧webapp,总不会还带着相应的端口号去做客吧。所以,你重新索要运用反向代理来做处理。

配置也轻易,来看望如何做吧:

http {
    #此处省略一些基本配置

    upstream product_server{
        server www.helloworld.com:8081;
    }

    upstream admin_server{
        server www.helloworld.com:8082;
    }

    upstream finance_server{
        server www.helloworld.com:8083;
    }

    server {
        #此处省略一些基本配置
        #默认指向product的server
        location / {
            proxy_pass http://product_server;
        }

        location /product/{
            proxy_pass http://product_server;
        }

        location /admin/ {
            proxy_pass http://admin_server;
        }

        location /finance/ {
            proxy_pass http://finance_server;
        }
    }
}
$ ./configure
$ make
$ sudo make install

https反向代理配置

有的对安全性需要相比高的站点,也许会利用
HTTPS(1种接纳ssl通讯标准的平安HTTP协议)。

此间不普遍 HTTP 协议和 SSL 标准。可是,使用 nginx 配置 https
必要了然几点:

  • HTTPS 的固定端口号是 4四三,不一样于 HTTP 的 80 端口
  • SSL 标准需求引进安全证明,所以在 nginx.conf
    中你须要钦命证书和它对应的 key

其余和 http 反向代理基本一样,只是在 Server 部根据地署有个别不相同。

  #HTTP服务器
  server {
      #监听443端口。443为知名端口号,主要用于HTTPS协议
      listen       443 ssl;

      #定义使用www.xx.com访问
      server_name  www.helloworld.com;

      #ssl证书文件位置(常见证书文件格式为:crt/pem)
      ssl_certificate      cert.pem;
      #ssl证书key位置
      ssl_certificate_key  cert.key;

      #ssl配置参数(选择性配置)
      ssl_session_cache    shared:SSL:1m;
      ssl_session_timeout  5m;
      #数字签名,此处使用MD5
      ssl_ciphers  HIGH:!aNULL:!MD5;
      ssl_prefer_server_ciphers  on;

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

https反向代理配置

局地对安全性须要比较高的站点,也许会利用
HTTPS(1种采纳ssl通讯标准的双鸭山HTTP协议)。

那里不常见 HTTP 协议和 SSL 标准。不过,使用 nginx 配置 https
供给精晓几点:

  • HTTPS 的固定端口号是 44叁,不一样于 HTTP 的 80 端口
  • SSL 标准须求引进安全表明,所以在 nginx.conf
    中您需求钦点证书和它对应的 key

别的和 http 反向代理基本均等,只是在 Server 部总局署有个别不一致。

  #HTTP服务器
  server {
      #监听443端口。443为知名端口号,主要用于HTTPS协议
      listen       443 ssl;

      #定义使用www.xx.com访问
      server_name  www.helloworld.com;

      #ssl证书文件位置(常见证书文件格式为:crt/pem)
      ssl_certificate      cert.pem;
      #ssl证书key位置
      ssl_certificate_key  cert.key;

      #ssl配置参数(选择性配置)
      ssl_session_cache    shared:SSL:1m;
      ssl_session_timeout  5m;
      #数字签名,此处使用MD5
      ssl_ciphers  HIGH:!aNULL:!MD5;
      ssl_prefer_server_ciphers  on;

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

默许意况下,Nginx 会棉被服装置在
/usr/local/nginx。通过设定编写翻译选项,你可以转移那么些设定。

静态站点布局

神跡,我们必要配备静态站点(即 html 文件和一批静态财富)。

比喻来讲:尽管全数的静态能源都献身了 /app/dist 目录下,我们只供给在
nginx.conf 中钦命首页以及那几个站点的 host 就可以。

安插如下:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    gzip on;
    gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/javascript image/jpeg image/gif image/png;
    gzip_vary on;

    server {
        listen       80;
        server_name  static.zp.cn;

        location / {
            root /app/dist;
            index index.html;
            #转发任何请求到 index.html
        }
    }
}

然后,添加 HOST:

127.0.0.1 static.zp.cn

那儿,在本土浏览器访问 static.zp.cn ,就足以访问静态站点了。

静态站点布局

神迹,大家必要配备静态站点(即 html 文件和一批静态资源)。

举例来讲来讲:即便持有的静态财富都位于了 /app/dist 目录下,我们只须要在
nginx.conf 中钦定首页以及那么些站点的 host 即可。

布局如下:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    gzip on;
    gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/javascript image/jpeg image/gif image/png;
    gzip_vary on;

    server {
        listen       80;
        server_name  static.zp.cn;

        location / {
            root /app/dist;
            index index.html;
            #转发任何请求到 index.html
        }
    }
}

然后,添加 HOST:

127.0.0.1 static.zp.cn

此刻,在地面浏览器访问 static.zp.cn ,就可以访问静态站点了。

 

跨域化解方案

web
领域支出中,常常利用前后端分离格局。那种方式下,前端和后端分别是单身的
web 应用程序,例如:后端是 Java 程序,前端是 React 或 Vue 应用。

分级独立的 web app
在互动访问时,势必存在跨域难题。消除跨域问题1般有两种思路:

  1. CORS

在后端服务器设置 HTTP 响应头,把您须求周转访问的域名加入插手
Access-Control-Allow-Origin 中。

  1. jsonp

把后端遵照请求,构造json数据,并赶回,前端用 jsonp 跨域。

那两种思路,本文不张开钻探。

内需验证的是,nginx 依据第2种思路,也提供了1种缓解跨域的消除方案。

举例:www.helloworld.com 网址是由二个前端 app ,三个后端 app
组成的。前端端口号为 捌仟, 后端端口号为 8080。

前端和后端假若运用 http
实行交互时,请求会被驳回,因为存在跨域难点。来探视,nginx
是怎么消除的啊:

率先,在 enable-cors.conf 文件中安装 cors :

# allow origin list
set $ACAO '*';

# set single origin
if ($http_origin ~* (www.helloworld.com)$) {
  set $ACAO $http_origin;
}

if ($cors = "trueget") {
    add_header 'Access-Control-Allow-Origin' "$http_origin";
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}

if ($request_method = 'OPTIONS') {
  set $cors "${cors}options";
}

if ($request_method = 'GET') {
  set $cors "${cors}get";
}

if ($request_method = 'POST') {
  set $cors "${cors}post";
}

接下去,在您的服务器中 include enable-cors.conf 来引进跨域配置:

# ----------------------------------------------------
# 此文件为项目 nginx 配置片段
# 可以直接在 nginx config 中 include(推荐)
# 或者 copy 到现有 nginx 中,自行配置
# www.helloworld.com 域名需配合 dns hosts 进行配置
# 其中,api 开启了 cors,需配合本目录下另一份配置文件
# ----------------------------------------------------
upstream front_server{
  server www.helloworld.com:9000;
}
upstream api_server{
  server www.helloworld.com:8080;
}

server {
  listen       80;
  server_name  www.helloworld.com;

  location ~ ^/api/ {
    include enable-cors.conf;
    proxy_pass http://api_server;
    rewrite "^/api/(.*)$" /$1 break;
  }

  location ~ ^/ {
    proxy_pass http://front_server;
  }
}

跨域消除方案

web
领域支出中,平日利用前后端分离形式。那种形式下,前端和后端分别是独自的
web 应用程序,例如:后端是 Java 程序,前端是 React 或 Vue 应用。

分级独立的 web app
在相互访问时,势必存在跨域难题。解决跨域难点壹般有三种思路:

  1. CORS

在后端服务器设置 HTTP 响应头,把你须求周转访问的域名加入插足
Access-Control-Allow-Origin 中。

  1. jsonp

把后端依据请求,构造json数据,并赶回,前端用 jsonp 跨域。

那三种思路,本文不展开探究。

急需证实的是,nginx 依照第一种思路,也提供了一种缓解跨域的缓解方案。

比喻:www.helloworld.com 网址是由二个前端 app ,1个后端 app
组成的。前端端口号为 七千, 后端端口号为 8080。

前者和后端倘诺选用 http
举办互动时,请求会被拒绝,因为存在跨域难点。来看望,nginx
是怎么消除的呢:

首先,在 enable-cors.conf 文件中装置 cors :

# allow origin list
set $ACAO '*';

# set single origin
if ($http_origin ~* (www.helloworld.com)$) {
  set $ACAO $http_origin;
}

if ($cors = "trueget") {
    add_header 'Access-Control-Allow-Origin' "$http_origin";
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}

if ($request_method = 'OPTIONS') {
  set $cors "${cors}options";
}

if ($request_method = 'GET') {
  set $cors "${cors}get";
}

if ($request_method = 'POST') {
  set $cors "${cors}post";
}

接下去,在你的服务器中 include enable-cors.conf 来引进跨域配置:

# ----------------------------------------------------
# 此文件为项目 nginx 配置片段
# 可以直接在 nginx config 中 include(推荐)
# 或者 copy 到现有 nginx 中,自行配置
# www.helloworld.com 域名需配合 dns hosts 进行配置
# 其中,api 开启了 cors,需配合本目录下另一份配置文件
# ----------------------------------------------------
upstream front_server{
  server www.helloworld.com:9000;
}
upstream api_server{
  server www.helloworld.com:8080;
}

server {
  listen       80;
  server_name  www.helloworld.com;

  location ~ ^/api/ {
    include enable-cors.conf;
    proxy_pass http://api_server;
    rewrite "^/api/(.*)$" /$1 break;
  }

  location ~ ^/ {
    proxy_pass http://front_server;
  }
}

Windows 安装

为了设置 Nginx / Win3二,需先下载它。然后解压之,然后运转就可以。上面以 C
盘根目录为例表达下:

cd C:
cd C:\nginx-0.8.54   start nginx

Nginx / Win3贰 是运作在二个调节台程序,而非 windows
服务措施的。服务器方式当下还是付出尝试中。

 

使用

nginx 的运用比较轻巧,就是几条命令。

 

常用到的授命如下:

  • nginx -s stop
    敏捷关闭Nginx,大概不保留相关音信,并飞快终止web服务。

  • nginx -s quit
    政通人和关闭Nginx,保存相关消息,有安插的了断web服务。

  • nginx -s reload
    因改动了Nginx相关配置,须求再行加载配置而重载。

  • nginx -s reopen :再度张开日志文件。

  • nginx -c filename :为 Nginx 钦定三个配备文件,来顶替缺省的。

  • nginx -t :不运维,而独自测试配置文件。nginx
    将检查计划文件的语法的不易,并尝试展开配置文件中所引用到的文本。

  • nginx -v:显示 nginx 的版本。

  • nginx -V:来得 nginx 的本子,编写翻译器版本和布局参数。

 

假使不想每便都敲命令,能够在nginx安装目录下新增加一个起动批处理文件startup.bat,双击就可以运转。内容如下:

@echo off
rem 如果启动前已经启动nginx并记录下pid文件,会kill指定进程
nginx.exe -s stop

rem 测试配置文件语法正确性
nginx.exe -t -c conf/nginx.conf

rem 显示版本信息
nginx.exe -v

rem 按照指定配置去启动nginx
nginx.exe -c conf/nginx.conf

万一是运营在 Linux 下,写3个 shell 脚本,承德小异。

 

nginx 配置实战

自家始终以为,各个开辟工具的配备恐怕结合实战来讲述,会令人更易掌握。

 

http反向代理配置

大家先达成1个小目的:不思考复杂的安排,仅仅是水到渠成三个 http 反向代理。

 

nginx.conf 配置文件如下:

注:conf / nginx.conf 是 nginx 的暗中认可配置文件。你也足以行使 nginx -c
钦赐你的安插文件

#运行用户
#user somebody;

#启动进程,通常设置成和cpu的数量相等
worker_processes  1;

#全局错误日志
error_log  D:/Tools/nginx-1.10.1/logs/error.log;
error_log  D:/Tools/nginx-1.10.1/logs/notice.log  notice;
error_log  D:/Tools/nginx-1.10.1/logs/info.log  info;

#PID文件,记录当前启动的nginx的进程ID
pid        D:/Tools/nginx-1.10.1/logs/nginx.pid;

#工作模式及连接数上限
events {
   worker_connections 1024;    #单个后台worker process进程的最大并发链接数
}

#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
   #设定mime类型(邮件支持类型),类型由mime.types文件定义
   include       D:/Tools/nginx-1.10.1/conf/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    D:/Tools/nginx-1.10.1/logs/access.log main;
   rewrite_log     on;
   
   #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
   #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
   sendfile        on;
   #tcp_nopush     on;

   #连接超时时间
   keepalive_timeout  120;
   tcp_nodelay        on;
   
   #gzip压缩开关
   #gzip  on;

   #设定实际的服务器列表 
   upstream zp_server1{
       server 127.0.0.1:8089;
   }

   #HTTP服务器
   server {
       #监听80端口,80端口是知名端口号,用于HTTP协议
       listen       80;
       
       #定义使用www.xx.com访问
       server_name  www.helloworld.com;
       
       #首页
       index index.html
       
       #指向webapp的目录
       root D:\01_Workspace\Project\github\zp\SpringNotes\spring-security\spring-shiro\src\main\webapp;
       
       #编码格式
       charset utf-8;
       
       #代理配置参数
       proxy_connect_timeout 180;
       proxy_send_timeout 180;
       proxy_read_timeout 180;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarder-For $remote_addr;

       #反向代理的路径(和upstream绑定),location 后面设置映射的路径
       location / {
           proxy_pass http://zp_server1;
       } 

       #静态文件,nginx自己处理
       location ~ ^/(images|javascript|js|css|flash|media|static)/ {
           root D:\01_Workspace\Project\github\zp\SpringNotes\spring-security\spring-shiro\src\main\webapp\views;
           #过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。
           expires 30d;
       }
   
       #设定查看Nginx状态的地址
       location /NginxStatus {
           stub_status           on;
           access_log            on;
           auth_basic            "NginxStatus";
           auth_basic_user_file  conf/htpasswd;
       }
   
       #禁止访问 .htxxx 文件
       location ~ /\.ht {
           deny all;
       }
       
       #错误处理页面(可选择性配置)
       #error_page   404              /404.html;
       #error_page   500 502 503 504  /50x.html;
       #location = /50x.html {
       #    root   html;
       #}
   }
}

 

好了,让我们来试试看啊:

  1. 起步 webapp,注意运行绑定的端口要和nginx中的 upstream
    设置的端口保持一致。

  2. 更改 host:在 C:\Windows\System32\drivers\etc
    目录下的host文件中增多一条DNS 记录1二7.0.0.一 www.helloworld.com

  3. 运转前文中 startup.bat 的下令

  4. 在浏览器中访问 www.helloworld.com,不出意外,已经能够访问了。

 

负载均衡布局

上1个例证中,代理仅仅针对3个服务器。

 

不过,网址在其实运行进程中,多半都以有多台服务器运营着平等的app,那时需求选用负载均衡来分散。

 

nginx也足以兑现轻松的负荷均衡功效。

 

若果那样八个利用场景:将利用布署在
1玖二.16八.1.1壹:80、1九贰.16八.一.1贰:80、1九贰.168.一.一三:80
3台linux环境的服务器上。网址域名字为 www.helloworld.com,公网IP为
1玖二.16八.1.1一。在公网IP所在的服务器上安排nginx,对持有请求做负载均衡处理。

 

nginx.conf 配置如下:

http {
    #设定mime类型,类型由mime.type文件定义
   include       /etc/nginx/mime.types;
   default_type  application/octet-stream;
   #设定日志格式
   access_log    /var/log/nginx/access.log;

   #设定负载均衡的服务器列表
   upstream load_balance_server {
       #weigth参数表示权值,权值越高被分配到的几率越大
       server 192.168.1.11:80   weight=5;
       server 192.168.1.12:80   weight=1;
       server 192.168.1.13:80   weight=6;
   }

  #HTTP服务器
  server {
       #侦听80端口
       listen       80;
       
       #定义使用www.xx.com访问
       server_name  www.helloworld.com;

       #对所有请求进行负载均衡请求
       location / {
           root        /root;                 #定义服务器的默认网站根目录位置
           index       index.html index.htm;  #定义首页索引文件的名称
           proxy_pass  http://load_balance_server ;#请求转向load_balance_server 定义的服务器列表

           #以下是一些反向代理的配置(可选择性配置)
           #proxy_redirect off;
           proxy_set_header Host $host;
           proxy_set_header X-Real-IP $remote_addr;
           #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
           proxy_set_header X-Forwarded-For $remote_addr;
           proxy_connect_timeout 90;          #nginx跟后端服务器连接超时时间(代理连接超时)
           proxy_send_timeout 90;             #后端服务器数据回传时间(代理发送超时)
           proxy_read_timeout 90;             #连接成功后,后端服务器响应时间(代理接收超时)
           proxy_buffer_size 4k;              #设置代理服务器(nginx)保存用户头信息的缓冲区大小
           proxy_buffers 4 32k;               #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
           proxy_busy_buffers_size 64k;       #高负荷下缓冲大小(proxy_buffers*2)
           proxy_temp_file_write_size 64k;    #设定缓存文件夹大小,大于这个值,将从upstream服务器传
           
           client_max_body_size 10m;          #允许客户端请求的最大单文件字节数
           client_body_buffer_size 128k;      #缓冲区代理缓冲用户端请求的最大字节数
       }
   }
}

 

网址有多个webapp的配置

当一个网址作用尤为丰裕时,往往供给将一些功能相对独立的模块剥离出来,独立维护。那样的话,平日,会有多个webapp。

 

举个例证:若是 www.helloworld.com
站点有好些个少个webapp,finance(金融)、product(产品)、admin(用户中心)。访问那个使用的办法通过上下文(context)来进行区分:

  • www.helloworld.com/finance/

  • www.helloworld.com/product/

  • www.helloworld.com/admin/

 

咱们领会,http的暗中同意端口号是80,假诺在壹台服务器上还要运营那二个 webapp
应用,都用80端口,鲜明是不成的。所以,那多个应用必要各自绑定不一样的端口号。

 

那就是说,难题来了,用户在其实访问 www.helloworld.com 站点时,访问不同webapp,总不会还带着相应的端口号去访问吧。所以,你再度索要运用反向代理来做拍卖。

 

陈设也简单,来看望怎么办呢:

http {
   #此处省略一些基本配置
   
   upstream product_server{
       server www.helloworld.com:8081;
   }
   
   upstream admin_server{
       server www.helloworld.com:8082;
   }
   
   upstream finance_server{
       server www.helloworld.com:8083;
   }

   server {
       #此处省略一些基本配置
       #默认指向product的server
       location / {
           proxy_pass http://product_server;
       }

       location /product/{
           proxy_pass http://product_server;
       }

       location /admin/ {
           proxy_pass http://admin_server;
       }
       
       location /finance/ {
           proxy_pass http://finance_server;
       }
   }
}

 

https反向代理配置

有的对安全性供给比较高的站点,只怕会利用
HTTPS(壹种选择ssl通信标准的克拉玛依HTTP协议)。

 

那里不常见 HTTP 协议和 SSL 标准。不过,使用 nginx 配置 https
要求掌握几点:

  • HTTPS 的固定端口号是 4四三,不相同于 HTTP 的 80 端口

  • SSL 标准需求引进安全证书,所以在 nginx.conf
    中你必要钦点证书和它对应的 key

 

其他和 http 反向代理基本一样,只是在 Server 部分局署有个别分裂。

#HTTP服务器
 server {
     #监听443端口。443为知名端口号,主要用于HTTPS协议
     listen       443 ssl;

     #定义使用www.xx.com访问
     server_name  www.helloworld.com;

     #ssl证书文件位置(常见证书文件格式为:crt/pem)
     ssl_certificate      cert.pem;
     #ssl证书key位置
     ssl_certificate_key  cert.key;

     #ssl配置参数(选择性配置)
     ssl_session_cache    shared:SSL:1m;
     ssl_session_timeout  5m;
     #数字签名,此处使用MD5
     ssl_ciphers  HIGH:!aNULL:!MD5;
     ssl_prefer_server_ciphers  on;

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

 

静态站点布局

突发性,咱们需要配置静态站点(即 html 文件和一群静态能源)。

 

举例来讲:假诺具有的静态财富都位居了 /app/dist 目录下,大家只须求在
nginx.conf 中钦点首页以及这一个站点的 host 就能够。

 

配置如下:

worker_processes  1;

events {
   worker_connections  1024;
}

http {
   include       mime.types;
   default_type  application/octet-stream;
   sendfile        on;
   keepalive_timeout  65;

   gzip on;
   gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/javascript image/jpeg image/gif image/png;
   gzip_vary on;

   server {
       listen       80;
       server_name  static.zp.cn;

       location / {
           root /app/dist;
           index index.html;
           #转发任何请求到 index.html
       }
   }
}

下一场,增添 HOST:1二7.0.0.1 static.zp.cn,此时,在地方浏览器访问
static.zp.cn ,就可以访问静态站点了。

 

跨域搞定方案

web
领域支出中,平日利用前后端分离格局。那种格局下,前端和后端分别是单身的
web 应用程序,例如:后端是 Java 程序,前端是 React 或 Vue 应用。

 

分别独立的 web app
在相互走访时,势必存在跨域难题。化解跨域难题一般有两种思路:

 

CORS

在后端服务器设置 HTTP 响应头,把您须求周转访问的域名加入参预Access-Control-Allow-Origin 中。

 

jsonp

把后端依照请求,构造json数据,并赶回,前端用 jsonp 跨域。

 

那三种思路,本文不展开探究。

 

亟需注解的是,nginx 遵照第3种思路,也提供了壹种缓解跨域的消除方案。

 

举例:www.helloworld.com 网址是由四个前端 app ,1个后端 app
组成的。前端端口号为 捌仟, 后端端口号为 8080。

 

前者和后端倘若选择 http
实行交互时,请求会被拒绝,因为存在跨域难题。来看望,nginx
是怎么化解的吧:

 

率先,在 enable-cors.conf 文件中安装 cors :

# allow origin list
set $ACAO '*';

# set single origin
if ($http_origin ~* (www.helloworld.com)$) {
 set $ACAO $http_origin;
}

if ($cors = "trueget") {
   add_header 'Access-Control-Allow-Origin' "$http_origin";
   add_header 'Access-Control-Allow-Credentials' 'true';
   add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
   add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}

if ($request_method = 'OPTIONS') {
 set $cors "${cors}options";
}

if ($request_method = 'GET') {
 set $cors "${cors}get";
}

if ($request_method = 'POST') {
 set $cors "${cors}post";
}

 

接下去,在你的服务器中 include enable-cors.conf 来引进跨域配置:

# ----------------------------------------------------
# 此文件为项目 nginx 配置片段
# 可以直接在 nginx config 中 include(推荐)
# 或者 copy 到现有 nginx 中,自行配置
# www.helloworld.com 域名需配合 dns hosts 进行配置
# 其中,api 开启了 cors,需配合本目录下另一份配置文件
# ----------------------------------------------------
upstream front_server{
 server www.helloworld.com:9000;
}
upstream api_server{
 server www.helloworld.com:8080;
}

server {
 listen       80;
 server_name  www.helloworld.com;

 location ~ ^/api/ {
   include enable-cors.conf;
   proxy_pass http://api_server;
   rewrite "^/api/(.*)$" /$1 break;
 }

 location ~ ^/ {
   proxy_pass http://front_server;
 }
}

 

到此,就完事了。

相关文章