Nginx(三):Nginx基本概念以及用法

目录结构

  • Nginx
    • conf   配置目录
      • nginx.conf  主配置文件
      • fastcgi.conf  fastcgi的配置文件
      • mime.types  支持的mime.types资源类型
    • sbin   启动目录
      • nginx. 默认启动nginx的二进制文件
    • logs  日志目录
      • access.log  默认访问日志文件
      • error.log     默认错误日志文件
      • nginx.pid    nginx的pid文件
    • html 静态页面目录
      • index.html  默认首页文件
      • 50x.html     错误页面文件

静态HTTP服务器

首先,Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端。配置如下:

server {
    listen 80; # 端口号
    location / {
        root /usr/share/nginx/html; # 静态文件路径
    }
}

虚拟主机

  • 概念
    • 一个server标签就是一个虚拟主机,可以有多个server标签,也就是多个虚拟主机。
    • 一个虚拟主机拥有独立的资源和程序,可以独立地对外提供服务供用户访问。
  • 类型
    • 基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站
    • 基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站,外部网站的管理后台

    • 基于ip的虚拟主机,几乎不用。

1.基于虚拟主机配置域名

#当客户端访问www.eureka.com,监听端口号为80,直接跳转到data/www目录下文件

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  www.eureka.com;
        location / {
            root   data/www;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
#当客户端访问bbs.eureka.com,监听端口号为80,直接跳转到data/bbs目录下文件 server { listen
80; server_name bbs.eureka.com; location / { root data/bbs; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }  

2.基于端口的虚拟主机


#当客户端访问192.168.177.133:8080:,监听端口号为8080,直接跳转到data/www目录下文件

server {
       listen 8080;
       server_name 192.168.177.133;
       location / {
          root data/www;
          index index.html index.htm;
          }
       error_page   500 502 503 504  /50x.html;
       location = /50x.html {
           root   html;
       }
   }
#当客户端访问192.168.177.133:8081:,监听端口号为8081,直接跳转到data/bbs目录下文件 server { listen
8081; server_name 192.168.177.133; location / { root data/bbs; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }

3.基于IP的虚拟主机

#当客户端访问192.168.177.133:8080:,监听端口号为8080,直接跳转到data/bbs目录下文件
server { listen
8080; server_name 192.168.177.133; location / { root data/www; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }

#当客户端访问192.168.177.134,监听端口号为8080,直接跳转到data/bbs目录下文件 server { listen
8080; server_name 192.168.177.134; location / { root data/bbs; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }

反向代理

1.反向代理作用

    反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。如下图所示:

2.反向代理好处

  隐藏真实内部ip地址,请求先访问nginx代理服务器(外网可以访问到),在使用nginx服务器转发到真实服务器中。

3.反向代理配置示例

#当客户端访问www.eureka.com,监听端口号为80直接跳转到真实ip服务器地址 192.168.177.133:8080
    server {
        listen       80;
        server_name  www.eureka.com;
        location / {
         proxy_pass http://192.168.177.133:8080;
            index  index.html index.htm;
        }
}

负载均衡

1.负载均衡作用

负载均衡是将所有请求拦截到负载均衡器中,在由负载均衡器采用负载均衡算法(轮询、IP绑定、权重)分发到不同实际的服务器中,这也就是服务器集群, 减轻单台服务器压力。如下图eureka集群示例:

2.负载均衡好处

负载均衡英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

3.四层和七层负载均衡区别

网络模型图

  • 四层负载均衡
    • 在网络模型中的传输层中,基于主要是基于tcp协议报文实现负载均衡(比如LVS、haproxy就是四层负载均衡器),使用改写报文的源地址和目的地址。(Nginx1.9之后)
  • 七层负载均衡
    • 在网络模型中应用层中,基于URL或者HTTP协议实现负载均衡,Web服务器。

4. 负载均衡配置示例

  • 轮询机制
    • 每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。
#定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮询机制
    upstream  eurekaServer{
        server 192.168.177.133:8080;
        server 192.168.177.133:8081;
server
192.168.177.133:8082; } server { listen 80; server_name www.eureka.com; location / { # 指定上游服务器负载均衡服务器 proxy_pass http://eurekaServer; index index.html index.htm; } }
  • weight(权重)
    • weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。
 upstream  eurekaServer{
    server 192.168.177.133:8080 weight=1;
    server 192.168.177.133:8081 weight=2;
server 192.168.177.133:8082 weight=2; } server { listen 80; server_name www.eureka.com; location / { # 指定上游服务器负载均衡服务器 proxy_pass http://eurekaServer; index index.html index.htm; } }
  • ip_hash
    • 每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。俗称IP绑定。
upstream  eurekaServer{
        server 192.168.177.133:8080;
        server 192.168.177.133:8081;
server
192.168.177.133:8082; ip_hash; } server { listen 80; server_name www.eureka.com; location / { # 指定上游服务器负载均衡服务器 proxy_pass http://eurekaServer; index index.html index.htm; } }
  • fair(第三方
    •  比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间 来分配请求,响应时间短的优先分配。Nginx本身不支持fair,如果需要这种调度算法,则必须安装upstream_fair模块。
upstream  eurekaServer{
        server 192.168.177.133:8080;
        server 192.168.177.133:8081;
server
192.168.177.133:8082;
fair; } server { listen 80; server_name www.eureka.com; location / { # 指定上游服务器负载均衡服务器 proxy_pass http://eurekaServer; index index.html index.htm; } }
  • url_hash(第三方)
    • 按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包。

故障转移

当上游服务器(真实访问服务器),一旦出现故障或者是没有及时相应的话,应该直接轮训到下一台服务器,保证服务器的高可用。配置如下

server {
        listen       80;
        server_name  www.eureka.com;
        location / {
            # 指定上游服务器负载均衡服务器
            proxy_pass http://eurekaServer;
            #nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
            proxy_connect_timeout 1s;
            #nginx发送给上游服务器(真实访问的服务器)超时时间
            proxy_send_timeout 1s;
            # nginx接受上游服务器(真实访问的服务器)超时时间
            proxy_read_timeout 1s;
            index  index.html index.htm;
        }
    }

Location(正则表达式)

1.location的作用

  location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。

2.location的语法

已=开头表示精确匹配
如 A 中只匹配根目录结尾的请求,后面不能带任何字符串。
  ^~ 开头表示uri以某个常规字符串开头,不是正则匹配
  ~ 开头表示区分大小写的正则匹配;
  ~* 开头表示不区分大小写的正则匹配
  / 通用匹配, 如果没有其它匹配,任何请求都会匹配到

3.Location正则案例

3.1 精确匹配,/后面不能带任何字符

server {
        listen       80;
        server_name  www.eureka.com;
        #精确匹配,注解后面不能带任何字符
        location =/ {
            proxy_pass http://192.168.177.133:8080;
            index  index.html index.htm;
        }
}

3.2 匹配所有以/开头请求

server {
        listen       80;
        server_name  www.eureka.com;
       #匹配所有以/开头请求 
        location / {
            proxy_pass http://192.168.177.133:8080;
            index  index.html index.htm;
        }
    }

3.3 以开头/oauth拦截  默认开启不区分大小写

    server {
        listen       80;
        server_name  www.eureka.com;
        #  以开头/eureka 最终跳转到http://192.168.177.133:8080/;
        location /eureka/ {
            proxy_pass http://192.168.177.133:8080/;
            index  index.html index.htm;
        }
        #  以开头/oauth 最终跳转到http://192.168.177.133:8081/;
        location /oauth/ {
            proxy_pass http://192.168.177.133:8081/;
            index  index.html index.htm;
        }
    }

nginx rewrite

Nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用

ps:Rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用Pcre,perl兼容正则表达式的语法规则匹配,如果需要Nginx的Rewrite功能,在编译Nginx之前,需要编译安装PCRE库。

1.Rewrite全局变量

nginx的rewrite规则就是使用正则匹配请求的url,然后根据定义的规则进行重写和改变,需ngx_http_rewrite_module模块来支持url重写功能,该模块是标准模块,默认已经安装。

变量

含义

$args

这个变量等于请求行中的参数,同$query_string

$content length

请求头中的Content-length字段。

$content_type

请求头中的Content-Type字段。

$document_root

当前请求在root指令中指定的值。

$host

请求主机头字段,否则为服务器名称。

$http_user_agent

客户端agent信息

$http_cookie

客户端cookie信息

$limit_rate

这个变量可以限制连接速率。

$request_method

客户端请求的动作,通常为GET或POST。

$remote_addr

客户端的IP地址。

$remote_port

客户端的端口。

$remote_user

已经经过Auth Basic Module验证的用户名。

$request_filename

当前请求的文件路径,由root或alias指令与URI请求生成。

$scheme

HTTP方法(如http,https)。

$server_protocol

请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

$server_addr

服务器地址,在完成一次系统调用后可以确定这个值。

$server_name

服务器名称。

$server_port

请求到达服务器的端口号。

$request_uri

包含请求参数的原始URI,不包含主机名,如”/foo/bar.php?arg=baz”。

$uri

不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。

$document_uri

与$uri相同。

2.配置示例

1.判断IP地址来源

## 如果访问的ip地址为192.168.177.133,则返回403
     if  ($remote_addr = 192.168.177.133) {  
         return 403;  
     }  

2.限制浏览器访问

## 不允许谷歌浏览器访问 如果是谷歌浏览器返回500
 if ($http_user_agent ~ Chrome) {   
         return 500;  
        }

 

posted @ 2019-09-12 16:03  空留意  阅读(429)  评论(0编辑  收藏  举报