P2M1_Nginx

186 阅读3分钟

文章内容输出来源:拉钩教育Java高薪训练营

Nginx

Nginx基础回顾

  • Nginx是什么?

    • 高性能的HTTP和反向代理Web服务器,核心特点是占有内存少,并发能力强
  • Nginx可以做什么?(应用场景)

    • HTTP服务器(Web服务器)
      • 性能非常高,注重效率,经受高负载的考验
    • 反向代理服务器
      • 正向代理:在浏览器中配置代理服务器的相关信息,通过代理服务器访问目标网站,代理服务器收到目标网站的响应之后,返回给我们自己的浏览器客户端。
      • 反向代理:浏览器客户端发送请求到反向代理服务器,由反向代理服务器选择原始服务器提供服务获取相应,最终再返回给客户端浏览器。浏览器不做任何配置,不可见提供服务的原始服务器。
    • 负载均衡服务器
      • 寻找确定合理的目标服务器(多选一)的过程就叫负载均衡,解决高负载的问题。
    • 动静分离
      • Nginx:静态资源 html/js/css/jpg...
      • Tomcat:动态资源 jsp/servlet
  • Nginx的特点

    • 跨平台
    • 上手容易,配置简单
    • 高并发,性能好
    • 稳定性好,宕机概率低
  • Nginx安装

    wget https://mirrors.huaweicloud.com/nginx/nginx-1.18.0.tar.gz
    yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
    tar -xvf nginx-1.18.0.tar.gz
    cd nginx-1.18.0
    ./configure
    make
    make install
    cd /usr/local/
    cd nginx/sbin
    ./nginx <-- 启动
    

    判断nginx是否启动

    ps -ef|grep nginx
    

    访问服务器的80端口(nginx默认监听80端口)

    http://47.101.165.107:80/

  • Nginx主要命令

    • ./nginx 启动nginx
    • ./nginx -s stop 终止nginx(也可以找到nginx进程号,使用kill -9杀掉进程)
    • ./nginx -s reload

Nginx核心配置文件解读

  • 全局块

    • 影响nginx服务器整体的运行

      # 运行用户
      #user  nobody;
      # worker进程数量,通常设置为和cpu数量相等
      worker_processes  1;
      
      # 全局错误日志及pid文件位置
      #error_log  logs/error.log;
      #error_log  logs/error.log  notice;
      #error_log  logs/error.log  info;
      
      #pid        logs/nginx.pid;
      
  • events块

    • 影响nginx服务器与用户的网络连接

      events {
          # 单个worker进程的最大并发连接数
          worker_connections  1024;
      }
      
  • http块

    • 虚拟主机、监听端口、请求转发、反向代理、负载均衡等等

      http {
          # 引入mime类型定义文件
          include       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  logs/access.log  main;
      
          sendfile        on;
          #tcp_nopush     on;
          # 连接超时时间
          #keepalive_timeout  0;
          keepalive_timeout  65;
          # 是否开启gzip压缩
          #gzip  on;
          # 配置虚拟主机,可以有多个,类似tomcat下host
          server {
              # 监听端口
              listen       9003;
              # 定义使用localhost访问
              server_name  localhost;
      
              #charset koi8-r;
      
              #access_log  logs/host.access.log  main;
              # 默认请求,类似tomcat下host/context
              location / {
                  # 默认的网站根目录位置
                  root   html;
                  # 索引页,欢迎页
                  index  index.html index.htm;
              }
      
              #error_page  404              /404.html;
      
              # redirect server error pages to the static page /50x.html
              #
              error_page   500 502 503 504  /50x.html;
              location = /50x.html {
                  root   html;
              }
      
              # proxy the PHP scripts to Apache listening on 127.0.0.1:80
              #
              #location ~ \.php$ {
              #    proxy_pass   http://127.0.0.1;
              #}
      
              # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
              #
              #location ~ \.php$ {
              #    root           html;
              #    fastcgi_pass   127.0.0.1:9000;
              #    fastcgi_index  index.php;
              #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
              #    include        fastcgi_params;
              #}
      
              # deny access to .htaccess files, if Apache's document root
              # concurs with nginx's one
              #
              #location ~ /\.ht {
              #    deny  all;
              #}
          }
      
          # another virtual host using mix of IP-, name-, and port-based configuration
          #
          #server {
          #    listen       8000;
          #    listen       somename:8080;
          #    server_name  somename  alias  another.alias;
      
          #    location / {
          #        root   html;
          #        index  index.html index.htm;
          #    }
          #}
      
          # HTTPS server
          #
          #server {
          #    listen       443 ssl;
          #    server_name  localhost;
      
          #    ssl_certificate      cert.pem;
          #    ssl_certificate_key  cert.key;
      
          #    ssl_session_cache    shared:SSL:1m;
          #    ssl_session_timeout  5m;
      
          #    ssl_ciphers  HIGH:!aNULL:!MD5;
          #    ssl_prefer_server_ciphers  on;
      
          #    location / {
          #        root   html;
          #        index  index.html index.htm;
          #    }
          #}
      
      }
      

Nginx应用场景之反向代理

  • 需求一:浏览器请求nginx,nginx将请求转发给目标服务器(tomcat)

    • 部署tomcat,监听8080端口

    • 修改nginx配置

      location / {
          proxy_pass http://127.0.0.1:8080/;
      }
      
    • 重新加载nginx配置

      ./nginx -s reload

    • 测试,访问 http://47.101.165.107:80/ 返回tomcat页面

  • 需求二:浏览器请求 nginx/abc,转发给tomcat:8080; 请求 nginx/def,转发给tomcat:80801

    • 部署两个tomcat,分别监听8080,8081端口

    • 修改nginx配置

      location /abc {
          proxy_pass http://127.0.0.1:8080/;
      }
      
      location /def {
          proxy_pass http://127.0.0.1:8081/;
      }
      
    • 测试

location语法

location [=|~|~*|^~] /uri/ {...}
  1. 正则匹配 location ~ /abc {}
  2. 不区分大小写的正则匹配 location ~* /abc {}
  3. 匹配路径的前缀 location ^~ /abc {}
  4. 精确匹配 location = /abc {}
  5. 普通路径前缀匹配 location /abc {}

优先级: 4 > 3 > 2 > 1 > 5

Nginx应用场景之负载均衡

  • 轮询

    默认策略,每个请求按时间顺序逐一分配到不同的服务器,如果某一个服务器下线,能自动剔除

    upstream carolServer{
        server 127.0.0.1:8080;
        server 127.0.0.1:8082;
    }
    
    location /abc {
        proxy_pass http://carolServer/;
    }
    
  • weight

    权重,默认每个负载的服务器为1,权重越高被分配的请求越多

    upstream carolServer{
        server 127.0.0.1:8080 weight=1;
        server 127.0.0.1:8082 weight=2;
    }
    
  • ip_hash

    每个请求按照ip的hash结果分配,每一个客户端的请求会固定分配到同一个目标服务器处理,可以解决session问题

    upstream carolServer{
        ip_hash;
        server 127.0.0.1:8080;
        server 127.0.0.1:8082;
    }
    

Nginx应用场景之动静分离

  • 动态资源(jsp, servlet)

    Nginx反向代理到tomcat可以看到Tomcat ROOT项目的index.jsp页面

  • 静态资源(html,js,css,img等等)

    • 放置静态资源到nginx服务器

    image-20201111012632373

Nginx底层进程机制剖析

  • Nginx启动后,以daemon多进程方式在后台运行。包括一个Master进程和多个Worker进程
    • Master进程:管理Worker进程
      • 接受外界信号向各worker进程发送信号(./nginx -s reload)
      • 监控worker进程的运行状态,当worker进程异常退出后master进程会自动重新自动新的worker
    • Worker进程:具体处理网络请求
      • 多个worker之间是对等的,同等竞争来自客户端的请求
      • 各worker进程之间是独立的
  • ./nginx -s reload 举例说明信号处理方式
    1. master进程对配置文件进行语法检查
    2. 尝试配置(比如修改了监听端口,检查是否可以使用)
    3. 尝试成功则使用新的配置,新建worker进程
    4. 新建成功,给旧的worker进程发送关闭信息
    5. 旧的worker收到信号后会继续服务,直到把当前进程接受到的请求处理完毕后关闭
  • worker进程处理请求部分说明
    • master进程创建之后,会建立好需要监听的socket,从master进程再fork出多个worker进程
    • worker进程的监听描述符listenfd在新连接到来时都可读->惊群效应?
    • 使用互斥锁保证只有一个worker进程能够处理请求
  • nginx多进程模型好处
    • 每个worker进程都是独立的,不需要加锁,节省开销
    • 每个worker进程都是独立的,互不影响,一个异常其他的照样能服务
    • 多进程模型为reload热部署机制提供了支撑