Nginx简易教程,nginx简易教程

By admin in 美高梅手机版4858 on 2019年4月13日

概述

 

 

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/POP叁)代理服务器。

怎么着是反向代理?

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

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上呼吁连接的客户端,此时期理服务器对外就展现为3个反向代理服务器。

概述

什么是nginx?

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

怎么着是反向代理?

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

概述

什么是nginx?

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

怎么是反向代理?

反向代理(Reverse
Proxy)情势是指以代理服务器来经受internet上的连年请求,然后将请求转发给内部互连网上的服务器,并将从服务器上赢得的结果重返给internet上呼吁连接的客户端,此时代理服务器对外就显现为一个反向代理服务器。

Windows 安装

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

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

Nginx / Win32 是运维在一个控制台程序,而非 windows
服务方式的。服务器格局当下依然支付尝试中。

美高梅手机版4858 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安装目录下新添1个开首批处理文件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简易教程,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反向代理配置

我们先完毕一个小目的:不思索复杂的配置,仅仅是到位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;
        #}
    }
}

好了,让大家来尝试吧:

安装

Windows 安装

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

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

Nginx / Win3贰 是运作在2个控制台程序,而非 windows
服务方法的。服务器格局当下照旧开发尝试中。

Windows 安装

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

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

Nginx / Win3二 是运作在3个控制台程序,而非 windows
服务措施的。服务器情势当下依旧支付尝试中。

负载均衡配置

上二个例证中,代理仅仅针对叁个服务器。

不过,网址在其实运行进度中,多半都以有多台服务器运营着同等的app,那时供给选择负载均衡来分散。

nginx也足以兑现不难的负载均衡功用。

比方那样2个应用场景:将使用陈设在
19二.16八.一.11:80、1玖2.168.1.1贰:80、1九二.168.一.一三: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;      #缓冲区代理缓冲用户端请求的最大字节数
        }
    }
}

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安装目录下新添一个起动批处理公事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安装目录下新添1个起步批处理公事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的布置

当三个网址成效进一步丰盛时,往往必要将部分效益相对独立的模块剥离出去,独立维护。那样的话,日常,会有多少个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;
        }
    }
}

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

nginx 配置实战

本身始终认为,各样开发工具的安排只怕结合实战来叙述,会令人更易明白。

nginx 配置实战

自笔者始终认为,种种开发工具的布局或许结合实战来描述,会令人更易明白。

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

 

http反向代理配置

咱俩先完成2个小目的:不考虑复杂的布署,仅仅是瓜熟蒂落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
    设置的端口保持1致。
  2. 更改 host:在 C:\Windows\System32\drivers\etc
    目录下的host文件中添加一条 DNS 记录

    127.0.0.1 www.helloworld.com
    
  3. 启航前文中 startup.bat 的通令

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

http反向代理配置

大家先达成一个小目的:不思虑复杂的安插,仅仅是旗开得胜三个 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也足以兑现简单的负荷均衡功用。

假诺那样2个应用场景:将接纳陈设在
1玖二.168.一.11:80、1玖2.16八.一.1二:80、1玖二.16八.壹.一3: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;      #缓冲区代理缓冲用户端请求的最大字节数
        }
    }
}

负载均衡布局

上一个事例中,代理仅仅针对3个服务器。

不过,网址在实际运维进程中,多半都是有多台服务器运维着同等的app,那时急需运用负载均衡来分散。

nginx也能够完毕不难的负载均衡效能。

一经那样叁个用参预景:将使用布署在
1九二.168.壹.1一:80、192.16八.一.1二:80、1玖二.168.一.壹3: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;      #缓冲区代理缓冲用户端请求的最大字节数
        }
    }
}

跨域消除方案

web
领域支出中,平常使用前后端分离格局。这种情势下,前端和后端分别是独立的
web 应用程序,例如:后端是 Java 程序,前端是 React 或 Vue 应用。

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

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

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

那二种思路,本文不展开商量。

亟待注脚的是,nginx 依照第叁种思路,也提供了一种缓解跨域的化解方案。

比喻:www.helloworld.com 网址是由一个前端 app ,三个后端 app
组成的。前端端口号为 7000, 后端端口号为 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玖 文章 – 28 评论 – 20伍 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,若是在1台服务器上还要起步那3个 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的安排

当2个网址作用尤为丰裕时,往往必要将部分成效相对独立的模块剥离出去,独立维护。那样的话,平常,会有多个webapp。

举个例子:要是 www.helloworld.com
站点有有个别个webapp,finance(金融)、product(产品)、admin(用户基本)。访问那个使用的格局经过上下文(context)来进展区分:

www.helloworld.com/finance/

www.helloworld.com/product/

www.helloworld.com/admin/

咱俩领会,http的暗中同意端口号是80,假设在1台服务器上还要开动那3个 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反向代理配置

1些对安全性必要相比较高的站点,可能会选择HTTPS(壹种接纳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;
      }
  }

https反向代理配置

有个别对安全性要求比较高的站点,大概会选择HTTPS(壹种选取ssl通讯标准的安全HTTP协议)。

那里不常见 HTTP 协议和 SSL 标准。可是,使用 nginx 配置 https
要求精通几点:

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

别的和 http 反向代理基本1样,只是在 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. CORS

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

  1. jsonp

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

那三种思路,本文不展开切磋。

亟需表明的是,nginx 依照第3种思路,也提供了一种缓解跨域的搞定方案。

比方:www.helloworld.com 网址是由1个前端 app ,叁个后端 app
组成的。前端端口号为 7000, 后端端口号为 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般有二种思路:

  1. CORS

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

  1. jsonp

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

这两种思路,本文不展开探讨。

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

举例: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;
  }
}

Windows 安装

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

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

Nginx / Win3贰 是运营在3个控制台程序,而非 windows
服务章程的。服务器情势当下照旧支付尝试中。

 

美高梅手机版4858,使用

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安装目录下新添1个运转批处理公事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 配置实战

自个儿始终认为,各个开发工具的安排也许结合实战来描述,会令人更易驾驭。

 

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 记录12七.0.0.1 www.helloworld.com

  3. 运营前文中 startup.bat 的指令

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

 

负载均衡配置

上1个例子中,代理仅仅针对一个服务器。

 

唯独,网址在事实上运行进程中,多半都是有多台服务器运营着平等的app,那时急需利用负载均衡来分散。

 

nginx也得以完成简单的负荷均衡效率。

 

假定那样多少个接纳场景:将应用布置在
19二.16八.一.11:80、1九贰.16八.1.1二:80、1九二.16八.壹.一3:80
三台linux环境的服务器上。网址域名称为 www.helloworld.com,公网IP为
1玖②.16八.一.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的安排

当二个网址功用越来越丰富时,往往要求将1部分功效相对独立的模块剥离出去,独立维护。那样的话,日常,会有三个webapp。

 

举个例子:假诺 www.helloworld.com
站点有某个个webapp,finance(金融)、product(产品)、admin(用户大旨)。访问这几个使用的不二等秘书籍通过上下文(context)来进展区分:

  • www.helloworld.com/finance/

  • www.helloworld.com/product/

  • www.helloworld.com/admin/

 

作者们领略,http的暗中同意端口号是80,借使在1台服务器上还要开动那3个 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:127.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 根据第1种思路,也提供了壹种缓解跨域的化解方案。

 

举例来说:www.helloworld.com 网址是由3个前端 app ,1个后端 app
组成的。前端端口号为 7000, 后端端口号为 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;
 }
}

 

到此,就形成了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有