Nginx

前言

  • Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,其特点是占有内存少,并发能力强。

  • Nginx 是 lgor Sysoev 为俄罗斯访问量第二的 rambler.ru 站点设计开发的。从 2004 年发布至今,凭借开源的力量,已经接近成熟与完善。

  • Nginx 功能丰富,可作为 HTTP 服务器,也可作为反向代理服务器,邮件服务器。支持 FastCGI、SSL、Virtual Host、URL Rewrite、Gzip 等功能。并且支持很多第三方的模块扩展。

  • Nginx 的稳定性、功能集、示例配置文件和低系统资源的消耗让他后来居上,在全球活跃的网站中有 12.18% 的使用比率,大约为 2220 万个网站。

  • Nginx 官网

  • Nginx 在线支持

  • Nginx 中文社区

  • Nginx 入门指南

  • Nginx 使用手册

  • Nginx 配置详解

  • Nginx 快速入门

1、Nginx

  • Nginx 是一个 Web 服务器,很快速,但是不能作为 Servlet 容器独立运行,所以通常的工作方式是 Nginx 配合 Tomcat 来协同工作。

  • Nginx 在处理静态文件的吞吐量上面比 Tomcat 好很多,通常他们俩配合,不会把所有的请求都交给 Tomcat。

  • 而是把静态请求交给 Nginx,动态请求,如 jsp, servlet,ssm,struts 等请求交给 Tomcat,从而达到动静分离的效果。

2、配置

2.1 配置文件

  • nginx.conf 是 nginx 的核心配置文件,里面的内容也不少。

  • 端口号

    1
    listen 8080;
  • 页面存放位置,表示页面都存放在 nginx 的 html 目录下。

    1
    root html;
  • 欢迎页面,默认会访问 index.html 或者 index.htm 文件。

    1
    index index.html index.htm;

2.2 端口号修改

  • 查看 8080 端口被哪些程序占用

    1
    2
    3
    4
    5
    # Windows
    $ netstat -ano|findstr "8080"

    # macOS
    $ lsof -i:8080
  • 根据 pid(进程 id)查询对应的应用程序

    1
    2
    # Windows
    $ tasklist|findstr "1828"
  • 结束该程序

    1
    2
    3
    4
    5
    6
    7
    # Windows
    $ taskkill /f /pid 1828

    $ taskkill /f /t /im java.exe

    # macOS kill pid
    $ kill 1828
  • 可以修改为其他端口号,打开 nginx 目录下的 nginx.conf 文件。

  • 然后找到 listen 8080,修改为 9090,关闭 nginx 再启动,就可以通过 http://localhost:9090/ 地址访问了。

    1
    2
    3
    4
    5
    server {
    listen 9090;
    server_name localhost;

    #charset koi8-r;

3、反向代理

  • 先说正向代理,比如要访问 youtube,但是不能直接访问,只能先找个翻墙软件,通过翻墙软件才能访问 youtube,翻墙软件就叫做正向代理。

  • 所谓的反向代理,指的是用户要访问 youtube,但是 youtube 悄悄地把这个请求交给 bilibili 来做,那么 bilibili 就是反向代理了。

  • 在当前指的就是访问 Nginx,但是 Nginx 把请求交给 Tomcat 来做。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # Nginx

    server {
    listen 8080;
    server_name localhost;

    # 反向代理
    location / {
    proxy_pass http://127.0.0.1:8111;
    }
    }
    • location / :表示处理所有请求。
    • proxy_pass http://127.0.0.1:8111; :表示把请求都交给 http://127.0.0.1:8111 来处理。
  • 重启 nginx,访问地址 http://127.0.0.1/ 就会观察到已经反向代理到 Tomcat 了。

4、动静分离

  • 所谓的动静分离就是指图片,css, js 之类的都交给 Nginx 来处理,Nginx 处理不了的,比如 jsp 就交给 Tomcat 来处理。

  • 好处是 Nginx 处理静态内容的吞吐量很高,比 Tomcat 高多了,这样无形中提升了性能。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # Nginx

    server {
    listen 8080;
    server_name localhost;

    location / {
    proxy_pass http://127.0.0.1:8111;
    }

    # 动静分离
    location ~\.(css|js|png)$ {
    root C:/Users/X7TI/Downloads/tomcat_8111/webapps/ROOT;
    }
    }
    • 表示所有的 css、js、png 访问都由 Nginx 来做,访问的地址是 C:/Users/X7TI/Downloads/tomcat_8111/webapps/ROOT
    • 这里要注意,填写本地地址的时候,要用正斜杠 / 不要用反斜杠 \。
  • 图示

5、负载均衡

  • 负载均衡的概念就是当访问量很大的时候,一个 Tomcat 吃不消了,这时候就准备多个 Tomcat,由 Nginx 按照权重来对请求进行分配,从而缓解单独一个 Tomcat 受到的压力。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # Nginx

    # 负载均衡
    upstream tomcat_8111_8222 {
    server 127.0.0.1:8111 weight=1;
    server 127.0.0.1:8222 weight=2;
    }

    server {
    listen 8080;
    server_name localhost;

    # 反向代理
    location / {
    proxy_pass http://tomcat_8111_8222;
    }

    location ~\.(css|js|png)$ {
    root C:/Users/X7TI/Downloads/tomcat_8111/webapps/ROOT;
    }
    }
    • weight 表示权重,值越大,被分配到的几率越大。
  • 图示

6、Session 共享

  • 负载均衡 Session 问题:

    • 通过负载均衡,我们可以把请求分发到不同的 Tomcat 来缓解服务器的压力。
    • 但是这里存在一个问题:当同一个用户第一次访问 tomcat_8111 并且登录成功,而第二次访问却被分配到了 tomcat_8222。
    • 这里并没有记录他的登陆状态,那么就会呈现未登录状态了,严重伤害了用户体验。
  • 解决办法一:

    • 通过 ip 地址标记用户,如果多次请求都是从同一个 ip 来的,那么就都分配到同一个 Tomcat,这样就不会出现负载均衡 Session 问题了。

      1
      2
      3
      4
      5
      upstream tomcat_8111_8222 {
      server 127.0.0.1:8111 weight=1;
      server 127.0.0.1:8222 weight=2;
      ip_hash;
      }
    • 不过这种方案并不完美,当如下几种情况发生时就有问题:

      • 大量请求来自某个局域网,那么相当于就没有负载均衡了。
      • 如果 tomcat_8111 挂了,那么此时 Nginx 只能把请求交给 tomcat_8222,但是这里却没有记录 Session,用户体验依然受影响。
  • 解决办法二:

    • Redis 来存取 Session。

      • 用户提交账号密码的行为被分配在了 tomcat_8111 上,登陆信息被存放在 Redis 里。
      • 当用户第二次访问的时候,被分配到了 tomcat_8222 上。
      • 那么此时 tomcat_8222 就会从 Redis 去获取相关信息,一看有对应信息,那么就会呈现登陆状态。
    • Tomcat 需要连接 Redis,所以需要专门的 Jar 包。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      # Tomcat,tomcat/conf/context.xml

      <Context>
      <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
      <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
      host="127.0.0.1"
      port="6379"
      database="0"
      maxInactiveInterval="60" />
      </Context>
  • Redis Session 共享机制和 Nginx 其实无关,是发生在 Nginx 之后的事情。

7、WebSocket

  • 如果做了 Nginx 和 Tomcat 整合的话,那么 Nginx 需要加上这么一段话,才能够正常的把 WebSocket 请求交给 Tomcat,不然 Tomcat 也不知道怎么处理。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # Nginx

    # WebSocket 处理
    location /ws/ {
    proxy_pass http://127.0.0.1:11180;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    }

8、常见问题

8.1 端口被占用

  • 问题

    1
    nginx: [emerg] bind() to 0.0.0.0:8080 failed (48: Address already in use)
  • 解决方法:修改 nginx.conf 文件里的端口号

8.2 权限不够

  • 问题

    1
    nginx: [alert] could not open error log file: open() “/usr/local/var/log/nginx/error.log” failed (13: Permission denied)
  • 解决方法:在命令前加上 sudo,这时可能会要求输入密码,密码就是电脑的开机密码。

文章目录
  1. 1. 前言
  2. 2. 1、Nginx
  3. 3. 2、配置
    1. 3.1. 2.1 配置文件
    2. 3.2. 2.2 端口号修改
  4. 4. 3、反向代理
  5. 5. 4、动静分离
  6. 6. 5、负载均衡
  7. 7. 6、Session 共享
  8. 8. 7、WebSocket
  9. 9. 8、常见问题
    1. 9.1. 8.1 端口被占用
    2. 9.2. 8.2 权限不够
隐藏目录