Nginx 03篇——Nginx配置实例

  • 1. 关于Nginx 的安装和简单配置
  • 1.1 简单安装
  • 1.2 简单配置
  • 1.3 防火墙问题
  • 2. Nginx配置实例实例1——反向代理
  • 2.1 Nginx安装之后默认配置访问
  • 2.2 修改配置——反向代理
  • 2.2.1 非域名情况
  • 2.2.2 域名情况(模拟)
  • 2.2.2 域名情况(真域名)
  • 2.3 总结
  • 3. Nginx配置实例实例2——反向代理2(代理多地址)
  • 3.1 想要实现的效果:
  • 3.2 准备两个 tomcat 服务器
  • 3.2 修改配置文件
  • 3.3 地址栏访问
  • 4. Nginx配置实例实例3——负载均衡
  • 4.1 Nginx负载均衡实例
  • 4.1.1 负载均衡简单说明
  • 4.1.2 准备工作
  • 4.1.3 配置nginx
  • 4.1.3.1 负载均衡核心配置
  • 4.1.3.2 配置注意问题
  • 4.1.4 看效果
  • 4.2 Nginx负载均衡分配策略
  • 5. Nginx配置实例实例4——动静分离
  • 5.1 准备静态资源
  • 5.2 配置文件
  • 5.3 看效果


1. 关于Nginx 的安装和简单配置

1.1 简单安装

  • 关于Nginx的安装可以看下面的文章Nginx 01篇——Nginx详细安装步骤以及Nginx各种启动方式.

1.2 简单配置

  • 关于Nginx 的简单配置可以看下面的文章:Nginx 02篇——Nginx基本配置与参数说明篇.

1.3 防火墙问题

  • 下面可能会遇到防火墙端口开放问题,如需要处理防火墙问题的,可以看下面的文章:linux下查看防火墙状态、关闭防火墙、开放关闭端口等.

2. Nginx配置实例实例1——反向代理

2.1 Nginx安装之后默认配置访问

  • http块中的server块的默认配置如下:
  • nginx的简单配置 nginx配置实例_nginx的简单配置

  • 访问:地址栏直接输入IP即可
  • nginx的简单配置 nginx配置实例_linux_02

2.2 修改配置——反向代理

  • 接下来我们模拟一个最简单的反向代理实例,首先把本机上的 tomcat 启动

    没有tomcat的可以通过下面方式下载一个:
wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.71/bin/apache-tomcat-9.0.71.tar.gz
  • 如果需要安装jdk请看下面的文章:
    linux下安装JDK1.8

2.2.1 非域名情况

  • 反向代理要实现的效果是:
    当地址栏访问http://ip,访问到的真实地址是Tomcat的主页面http://ip:8080
    即:此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
  • 配置如下:
    在 location 块内添加如下配置:
proxy_pass http://127.0.0.1:8080;
  • 效果如下:
    下面效果实现了:当地址栏访问http://ip(默认端口80),访问到的真实地址是Tomcat的主页面http://ip:8080,如下:

2.2.2 域名情况(模拟)

  • 反向代理要实现的效果是:
    当地址栏访问http://域名,访问到的真实地址是Tomcat的主页面http://ip:8080
  • 如果有域名当然可以直接用,如果没有域名可以简单模拟一下,配置本地的hosts文件即可
  • mac——可以用浏览器插件(Livehosts)或者 sudo vim /etc/hosts,能 ping 通域名
  • nginx的简单配置 nginx配置实例_nginx_03

  • 如果正常情况下,上面配置完之后,地址栏输入 susu.con.cn 就可以实现我们想要的效果了,但是,我这里出现了点问题,可能大家也会遇到,如果遇到不能正常访问的,请先移步到解决一下问题:
    关于 mac 本地配置域名能 ping 通,但是浏览器不能访问的问题(而其他电脑操作可访问).
  • windows——直接修改本地的hosts文件,添加下面的信息即可:
susu.con.cn 服务器IP
  • 效果如下:

2.2.2 域名情况(真域名)

  • 如果有服务器的话,可以弄一个域名玩一下,有的域名也挺便宜的
  • 配置如下:
server {
        listen       80;
        # server_name  ip;
        server_name 域名;   # 客户端在地址栏访问的域名地址

        location / {
            root   html;
            proxy_pass http://127.0.0.1:8080;  # 真实访问的服务器地址
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }
  • 效果如下:
  • nginx的简单配置 nginx配置实例_运维_04


2.3 总结

  • nginx 反向代理主要通过 proxy_pass 来配置,将你的项目的开发地址填写到 proxy_pass 后面:
location / {
    root   html;
    proxy_pass http://127.0.0.1:8080; # 被代理的真实地址
    index  index.html index.htm;
}

3. Nginx配置实例实例2——反向代理2(代理多地址)

  • 下面用到的端口如果没有开放记得开放端口:
    云服务器上开放端口,如下:
  • nginx的简单配置 nginx配置实例_linux_05

  • 关于防火墙的问题(当然你可以直接把防火墙关闭),如下:
    linux下查看防火墙状态、关闭防火墙、开放关闭端口等.

3.1 想要实现的效果:

  • 当服务器上部署两个不同的项目或者多个项目的时候,客户端访问入口的端口一样的情况下,可通过前缀配置location ,参考下面的配置

3.2 准备两个 tomcat 服务器

  • 上面准备一个8080端口的tomcat9,再准备一个8082端口的tomcat8,不多说如下:
  • 在两个服务器下分别准备两个静态文件
  • 确保静态文件可以访问,不演示了,自己试试
http://IP:8080/t9/tom9.html
http://IP:8082/t8/tom8.html

3.2 修改配置文件

  • 修改配置文件如下:
server {
        listen       9003;
        # listen       somename:8080;
        server_name  XXX; #IP

        location ~ /t8/ {
           proxy_pass http://127.0.0.1:8082;
         } 

        location ~ /t9/ {
          #  root html;
          proxy_pass http://127.0.0.1:8080;
          # index index.html index.htm;
       }

    }
  • 修改完记得加载,重新加载之前可以检查一下配置文件是否有误
  • 检查命令:
./nginx -t
  • 重新加载命令:
./nginx -s reload

3.3 地址栏访问

  • 如下:

4. Nginx配置实例实例3——负载均衡

4.1 Nginx负载均衡实例

4.1.1 负载均衡简单说明

  • 负载均衡是将请求分配到不同的服务单元,既可以是同一台服务器的不同进程,也可以是不同服务器,这样既保证服务的高可用性,又保证高并发情况下的响应速度,能够给用户更好的体验。

4.1.2 准备工作

  1. 首先先说一下情况,我这边是将同一个应用程序(比如:继续用tomcat)分别部署到两台或者多台服务器上,如下:

    所以,我这里准备了两台服务器,分别部署了tomcat9
  2. 分别为两台服务器开放8089端口
    由于我这里,8080端口有占用,所以开放8089端口
  3. 静态页面 hello.html
    分别在下面路径下写静态页面(根据自己的安装路径来)
/home/susu/soft/install/apache-tomcat-9.0.71/webapps/tomact/hello.html
  1. 启动并检查两台服务运行的tomcat 以及确保静态页面可以访问,如下效果即可:

4.1.3 配置nginx

4.1.3.1 负载均衡核心配置
  • 配置如下:
  • nginx的简单配置 nginx配置实例_nginx的简单配置_06

  • 配置代码如下:
include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    # 配置负载均衡
    upstream tomactServer {
      server A服务器IP:8089;
      server B服务器IP:8089;
   }

 server {
     listen   9005;
     server_name nginx服务器IP;

     location /{
           proxy_pass http://tomactServer;
       }
  }
4.1.3.2 配置注意问题
  1. upstream 后起的服务名参不能有下划线(比如tomact_server不可以,可以用tomact Server),否则报错
    如下,错误:
类型 异常报告

消息 The character [_] is never valid in a domain name.

描述 由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者虚拟的请求路由),服务器无法或不会处理当前请求。

例外情况

java.lang.IllegalArgumentException: The character [_] is never valid in a domain name.
	org.apache.tomcat.util.http.parser.HttpParser$DomainParseState.next(HttpParser.java:1029)
	org.apache.tomcat.util.http.parser.HttpParser.readHostDomainName(HttpParser.java:912)
	org.apache.tomcat.util.http.parser.Host.parse(Host.java:71)
	org.apache.tomcat.util.http.parser.Host.parse(Host.java:45)
	org.apache.coyote.AbstractProcessor.parseHost(AbstractProcessor.java:298)
	org.apache.coyote.http11.Http11Processor.prepareRequest(Http11Processor.java:793)
	org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:375)
	org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:891)
	org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1784)
	org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	java.lang.Thread.run(Thread.java:748)

nginx的简单配置 nginx配置实例_服务器_07

  1. 淡定

4.1.4 看效果

  • 地址栏访问:
http://nginx服务IP:9005/tomact/hello.html
  • 每次刷新访问到的真实tomcat服务地址是A、B交替着
  • 即实现了下图所要的效果:

4.2 Nginx负载均衡分配策略

  1. 轮询(默认)
  • 默认不配置的话就是轮询策略,比如我们上面的实例,没有配置策略是按轮询策略走的。
  • 轮询策略,就是每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
  1. weight (权重策略)
  • weight 代表权重,默认值为1,权重越高背分配的客户端越多。
    比如,下面的配置:
# 配置负载均衡
 upstream tomactServer {
   server A服务器IP:8089 weight=10;
   server B服务器IP:8089 weight=20;
}
  1. ip_hash (IP绑定)
  • 每个请求按访问IP的hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
    即:如果某用户的客户端第一次访问到的服务器是A服务器,那个他后续访问的都是A服务器。
upstream tomactServer {
   ip_hash;
   server A服务器IP:8089;
   server B服务器IP:8089;
}
  1. fair(第三方模块的fair)
  • 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
    即:可以根据页面大小、加载时间的长短,很智能地进行负载均衡
upstream tomactServer {
   server A服务器IP:8089;
   server B服务器IP:8089;
   fair;
}

5. Nginx配置实例实例4——动静分离

  • 什么是动静分离?
    动静分离指的是将动态请求和静态请求分隔开,然后分别路由到相应的后端服务器。
    通常用户的请求中,一部分需要后台程序处理,例如查询数据库或者进行一些数据运算,这类请求我们称之为动态请求
    还有一部分不需要后台程序处理,如请求 html、css、js、图片等静态资源,这类请求我们称之为静态请求。Nginx 实现动静分离的基础是它可以根据配置对不同的请求做不同的转发,动静分离有利于提高整个服务器系统的性能。
  • 为什么要动静分离?
    拿tomcat 来说,我们当然知道它既可以处理动态资源也可以处理静态资源,但是单节点的tomcat本身处理请求的资源是有限的,如果项目中的动态请求和静态资源都由tomcat来处理的话,可能会遇到tomcat的性能瓶颈问题,所以这样处理不是很合理。所以我们需要用像nginx这样更好的服务器来处理静态资源,这样处理静态资源的能力比Tomcat强很多,同时也能减轻tomcat的处理压力,从而提高整个服务器系统的性能。

5.1 准备静态资源

  • 静态资源的位置需要注意,如果用root 用户启动的,尽量放在根目录下就行了,否则可能会因为启动用户和nginx工作用户不一致导致403问题(Nginx 403 forbidden)。
    当然你可以参考下面的文章解决:Nginx 403 forbidden 错误的原因及解决方法.
  • 所以,我这里直接就放根目录下了:
/nginx_test/nginx_web/html/hello_world.html
/nginx_test/nginx_web/images/dog.jpeg

5.2 配置文件

  • 配置文件配置如下:
server {
		 listen 9006;
		  server_name nginx服务器IP地址;
		
		  location /html/ {
		    root /nginx_test/nginx_web/;
		 }
		
		 location /images/ {
		    root /nginx_test/nginx_web/;
		    autoindex on;  #nginx开启目录浏览下载功能
		 }
   }

5.3 看效果

  • 访问静态页面和静态图片如下:
  • autoindex on; 代表:nginx开启目录浏览下载功能,效果如下: