知识点复习

一、什么是Docker

容器化部署软件

二、有什么特点(VM、单机部署)

轻便、快速,隔离性,跨平台,移植性强

共享宿主机的操作系统内核、高密度

三、常用的指令

docker pull

docker run -d -p 8080 -v xxx:容器目录 --name mynginx nginx

docker tag 容器名 tag:v1.0

docker start/stop/restart

docker rm 容器

docker rmi 镜像

docker save -o

docker load -i

docker build -f xxx -t (DOCKFILE) FROM、COPY、LABEL、EXPOSE、ENTRY['java',' -jar', 'xxx.ja']

docker exec -it xxxx /bin/bash

docker logs -f xxxxx

docker stats

docker compose 容器编排

课堂目标

  1. 理解nginx反向代理
  2. nginx常用功能
  3. 理解nginx的基本配置
  4. 网站部署
  5. 负载均衡

为什么有nginx?

一、早期系统

image-20250913084148984

单体系统,直接用Tomcat作为服务器容器。

优点:快速部署,简单。打包程war或者直接拷贝到服务器里完成部署。

缺点:单体应用,容错性差。小系统,用户量少的内部系统使用。

一旦客户端激增,单体项目无法承载。

image-20250911161824926

可以通过增加nginx的方法,用nginx做负载均衡,分摊访a问量到多个服务器。

多个tomcat集群,也叫横向扩容

nginx->ip hash

image-20250913105741235

二、现代应用架构

nginx不仅可以做web容器,还有缓存、跨域、防火墙等一系列功能。

image-20250913105610029

三、什么nginx

https://nginx.org/

**Nginx  是一个高性能的 HTTP 和反向代理 web 服务器。**同时也提供了 IMAP/POP3/SMTP 服务。

特点:是占有内存少并发能力强

Nginx 是一个安装非常的简单、配置文件非常简洁(还能够支持 perl 语法)、Bug 非常少的服务。
Nginx 迅速,几乎可以 7*24 不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级。
	Nginx 代码完全用 C 语言从头写成。官方数据测试表明能够支持高达

50,000 个并发连接数的响应。

四、什么是web服务器

http://www.baidu.com

image-20250914092306258

Web服务器一般指网站服务器(

、硬),是指Internet上某种类型的计算机程序,可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览,也可以放置数据文件,让全世界下载。

主流的三个Web服务器是

Apache(php)、Nginx(html)、IIS(asp)、Tomcat(jsp)。在选择使用web服务器应考虑的本身特性因素有:性能、安全性、日志和统计、虚拟主机、代理服务器、缓冲服务和集成应用程序等。

五、什么是反向代理

  • 正向代理

    通过某一个软件,代理客户端的请求。

image-20250911162155694

  • 反向代理
通过某一个软件,代理

服务端提供的服务。

image-20250911162640031

六、什么是负载均衡

把大量的请求转发到后端不同的服务器,以分摊高并发请求的压力。

image-20250911163611691

ip_hash

  • 如何保证session?

七、作为开发人员必须要会哪些?

  • 前后端web转发
  • 负载均衡配置
需要知道还可以做哪些?
  • 三方跨域处理
  • https配置 443
  • 常规防火墙、限流等
  • 缓存静态资源

image-20250911164144491

八、常用命令

1、验证配置文件的正确定

修改了 nginx.conf .conf include /conf.d/.conf

nginx -t 

2、查看日志

tail -f /var/log/nginx/access.log

3、启动服务,不中断

nginx -s reload  

systemctl reload nginx  

4、启动

nginx

5、直接停止

nginx -s stop  

6、优雅停止

nginx -s quit

7、平滑启动

nginx -s reload

8、版本查看

nginx -v

9、docker部署的nginx想用nginx命令操作

docker exec my-nginx(容器名) nginx -s reload

九、Centos安装启动

1、通过yum命令安装

sudo yum install nginx

image-20260131153758070

image-20260131153828137

2、查看一下安装目录

find / -name nginx

3、可以指定启动的配置文件

nginx 默认启动
sudo nginx -c /etc/nginx/nginx.conf  指定启动文件

4、nginx停止命令

sudo nginx -s stop

5、查看进程强制结束

ps -ef | grep nginx

kill -9 pid //pid代表是进程id

6、修改了配置可以先验证配置

nginx -t

7、重新启动nginx

nginx -s reload

8、后台服务启动

systemctl start nginx   ///这个命令会启动 Nginx 服务,并且让它在后台运行
systemctl stop nginx   ///后台停止

9、开启自启动

systemctl enable nginx

10、禁止开机自启

systemctl disable nginx

11、删除

yum remove nginx

十、配置说明

nginx.conf是主配置,内容如下:

说明:

# 定义运行nginx工作进程的用户和组
user nginx;

# 设置工作进程数,auto表示自动设置为CPU核心数
worker_processes auto;

# 错误日志文件路径
error_log /var/log/nginx/error.log;

# nginx主进程ID文件路径
pid /run/nginx.pid;

# 包含modules目录下的所有配置文件
include /usr/share/nginx/modules/*.conf;

# events块:配置连接处理相关的参数
events {
    # 每个工作进程允许的最大连接数
    worker_connections 1024;
}

# http块:HTTP服务器相关配置
http {
    # 定义日志格式,main是格式名称
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    # 访问日志文件路径,使用main格式
    access_log  /var/log/nginx/access.log  main;

    # 启用sendfile系统调用来传输文件
    sendfile            on;
  
    # 仅在sendfile开启时有效,优化数据包发送
    tcp_nopush          on;
  
    # 禁用Nagle算法,减少延迟
    tcp_nodelay         on;
  
    # 客户端保持连接的超时时间(秒)
    keepalive_timeout   65;
  
    # 类型哈希表的最大大小
    types_hash_max_size 4096;

    # 包含MIME类型定义文件
    include             /etc/nginx/mime.types;
  
    # 默认MIME类型
    default_type        application/octet-stream;

    # 包含conf.d目录下的所有配置文件
    include /etc/nginx/conf.d/*.conf;

    # 定义一个虚拟主机(server块)
    server {
        # 监听80端口
        listen       80;
      
        # 服务器名称,_表示匹配所有域名(默认服务器)
        server_name  _;
      
        # 网站根目录
        root         /data/nginx/html;

        # 包含默认服务器块的额外配置文件
        include /etc/nginx/default.d/*.conf;

        # 404错误页面
        error_page 404 /404.html;
      
        # 精确匹配404页面的location块
        location = /404.html {
        }

        # 50x系列错误页面
        error_page 500 502 503 504 /50x.html;
      
        # 精确匹配50x错误页面的location块
        location = /50x.html {
        }
    }

}

server块一般都会提出来,存在如下目录:include /etc/nginx/conf.d/*.conf;

server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;


        error_page 404 /404.html;
        location = /404.html {
        }

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

十一、容器配置说明

1、nginx.conf配置(主置)

进容器、查看nginx.conf

进入容器查看配置
docker exec -it proxy /bin/bash
cat /etc/nginx/nginx.conf

显示如下

user  nginx;   
worker_processes  auto;  #工作进程数

error_log  /var/log/nginx/error.log notice;
pid        /run/nginx.pid;

#必须有,处理连接事件
events {
    worker_connections  1024; //进程可连接的最大数量
}

##http处理
http {
    include       /etc/nginx/mime.types;  #content-type 对应的请求头
    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  /var/log/nginx/access.log  main;  #日志路径

    sendfile        on;   #内核空间直接拷贝
    #tcp_nopush     on;

    keepalive_timeout  65;  #超时时间

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;  
}

2、转发说明

server {  #server块 一个server块可以处理某一个特定的域名或者ip地址的请求
        listen 80;     #只处理80端口
        server_name  www.023hrm.com;    #只处理指定的域名
        charset utf-8;               #配置响应头content-typ编码 ,避免乱码
     
        location /{     #匹配的请求路径  '/'代表根路径,会匹配任何以/开头的请求
           root /data/html/site/;       #location定位到的目录,到这个目录去寻找访问的文件
           #比如请求地址 输入 :www.023hrm.com/about/index.html ,就访问/data/html/site/about/index.html
           try_files $uri $uri/ /index.html;  
        }
}

try_files ​uri uri/ /index.html;

说明:先检查匹配路径,如果没有;就会上层去找到对应的文件。

eg.输入地址www.023hrm.com/about/index.html ,先判断是否有 /data/html/site/about/index.html 是否有这个文件。

如果没有,就查找  /data/html/site/index.html

3、负载均衡配置步骤

image-20250911181823025

注意:ip_hash 指令必须放在 server 指令之前

  • 在宿主机进入映射目录
cd /data/nginx/conf.d
vi ./default.conf
  • 增加负载均衡配置

image-20250915161108081

    upstream page {
       #ip_hash;  注意ip_hash与weight不兼容
       server 47.109.102.26:9090 weight=3 fail_timeout=20s; # weight权重  负载地址
       server 47.109.102.26:9091 weight=1 fail_timeout=20s; # weight权重负载地址
    }

    server {
        listen 80;
        server_name www.woniu.com;
      
        # 定义位置块,匹配所有请求路径 (/test)
        location /test/ {
           # 将请求代理到名为'page'的upstream
           # 注意/必须要
           proxy_pass http://page/;  
           # 限制并发连接数
           #limit_conn one 1000;
           # 限制响应速率(带宽限制)
           #	limit_rate 1024k;
           # zone=my_req_zone: 使用名为'my_req_zone'的共享内存区域存储状态
           # burst=10000: 允许突发最多10000个请求
           # limit_req zone=my_req_zone burst=10000;
       }
   }

  • 因为访问的是javaapp应用需要启动两个java服务
docker run -d --name javaapp -p 9090:9090 javaapp

docker run -d --name javaapp_sub -p 9091:9090 javaapp
  • 重启nginx配置
docker stop proxy
docker restart proxy
  • 浏览器访问测试
http://ip:port/api/hello?chat=hello

4、443端口转发(http ->https)(可选)

一般情况都要同一转发到443

  • 单独建立一个 xxx.conf,也可以直接写在default.conf里
 server {
        listen 80;
        server_name www.woniu.com;
        rewrite ^(.*)$ https://${server_name}$1 permanent;   //跳转
   }

443端口是https,443端口和80端口一样都是默认

rewrite ^(.*)​ https://{server_name}$1 permanent;

rewrite 重写url

^ url的开始

.* url的所有内容

$ url结束

() 捕获内容,作为一个变量存储

$1 方向应用第一个()的变量价

效果:

http://www.023hrm.com/site/index.html
https://www.023hrm.com/site/index.html
  • 增加转发后的server{}块,注意listen是443和ssl证书的地址
server {
        listen 443 ssl;
        server_name  www.woniu.com;  #改域名
        ssl_session_cache   shared:SSL:10m;
        ssl_session_timeout 10m;
        ssl_certificate /etc/nginx/ca/www/woniu.com.pem;     #改证书
        ssl_certificate_key /etc/nginx/ca/www/woniu.com.key; #改证书

        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
}

5、跨域(可选)

安装 headers-more-nginx-module 模块才可以支持more_set_headers

对自己的 default.conf文件进行编辑,

vi /data/nginx/default.conf

跨域的核心配置如下

image-20250915161628578

server {
    listen 8002;
    server_name  172.30.218.95;
    charset utf-8;
     
    location /{
       root /data/html;
    }
  
    location /panpank-oss-cors/ {
       # 设置跨域访问允许头
       more_set_headers 'access-control-allow-origin:*';
     
       # 所有发送到/cors/的请求会被转发到https://view.inews.qq.com/
       proxy_pass https://panpank.oss-accelerate.aliyuncs.com/;
   }
}

6、缓存(可选)

编辑 default.conf文件

vi /data/nginx/default.conf
#location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
            # 启用缓存
       #     proxy_cache static_cache;
       #     proxy_cache_valid 200 302 7d;  # 缓存200/302状态码的资源7天
       #     proxy_cache_valid 404 1m;       # 缓存404的资源1分钟
       #     proxy_cache_use_stale error timeout updating;
          
            # 设置缓存Key(基于URI)
       #     proxy_cache_key "$scheme$request_method$host$request_uri";
          
            # 添加缓存命中状态头(便于调试)
       #     add_header X-Cache-Status $upstream_cache_status;
          
       #     # 静态文件直接由Nginx返回,不走后端
       #     root /var/www/static;
       #     expires 30d;  # 设置浏览器缓存30天
       #     access_log off;
       # }

其他生产案例学习(可选):

server
{
    listen 80;
    listen 443 ssl;
    listen 443 quic;
    http2 on;
    server_name zgzlyh.com;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/zgzlyh.com;
    #CERT-APPLY-CHECK--START
    # 用于SSL证书申请时的文件验证相关配置 -- 请勿删除
    include /www/server/panel/vhost/nginx/well-known/zgzlyh.com.conf;
    #CERT-APPLY-CHECK--END

    #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
    #error_page 404/404.html;
    #HTTP_TO_HTTPS_START
    set $isRedcert 1;
    if ($server_port != 443) {
        set $isRedcert 2;
    }
    if ( $uri ~ /\.well-known/ ) {
        set $isRedcert 1;
    }
    if ($isRedcert != 1) {
        rewrite ^(/.*)$ https://$host$1 permanent;
    }
    #HTTP_TO_HTTPS_END
    ssl_certificate    /www/server/panel/vhost/cert/zgzlyh.com/fullchain.pem;
    ssl_certificate_key    /www/server/panel/vhost/cert/zgzlyh.com/privkey.pem;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_tickets on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security "max-age=31536000";
    add_header Alt-Svc 'quic=":443"; h3=":443"; h3-29=":443"; h3-27=":443";h3-25=":443"; h3-T050=":443"; h3-Q050=":443";h3-Q049=":443";h3-Q048=":443"; h3-Q046=":443"; h3-Q043=":443"';
    error_page 497  https://$host$request_uri;

    #SSL-END
  
    location /api/ {
            proxy_pass http://127.0.0.1:8080/;
            proxy_http_version 1.1;

            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";

            proxy_redirect off;
        }
     
      
    location /papi/ {
            proxy_pass http://127.0.0.1:5000/;
            proxy_http_version 1.1;

            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";

            proxy_redirect off;
        }

   # ------------------------
   # WebSocket 代理
   # ------------------------
   location /websocket {
            proxy_pass http://127.0.0.1:9206;  # 根据实际后端路径决定是否加斜线
            proxy_http_version 1.1;

            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";  # 使用固定值
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_read_timeout 3600s;
            proxy_send_timeout 3600s;
            proxy_connect_timeout 7d;   
          
            proxy_socket_keepalive on;
            proxy_buffering off;  # 关闭缓冲
}
  
  
    #ERROR-PAGE-START  错误页配置,可以注释、删除或修改
    error_page 404 /404.html;
    #error_page 502 /502.html;
    #ERROR-PAGE-END

    #PHP-INFO-START  PHP引用配置,可以注释或修改
    include enable-php-82.conf;
    #PHP-INFO-END

    #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
    include /www/server/panel/vhost/rewrite/zgzlyh.com.conf;
    #REWRITE-END

    #禁止访问的文件或目录
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }

    #一键申请SSL证书验证目录相关设置
    location ~ \.well-known{
        allow all;
    }

    #禁止在证书验证目录放入敏感文件
    if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
        return 403;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
        error_log /dev/null;
        access_log /dev/null;
    }

    location ~ .*\.(js|css)?$
    {
        expires      12h;
        error_log /dev/null;
        access_log /dev/null;
    }
    access_log  /www/wwwlogs/zgzlyh.com.log;
    error_log  /www/wwwlogs/zgzlyh.com.error.log;
}

十二、Docker安装

1、编辑docker-compose.yaml

第一次拉取,去掉文件映射,执行 docker compose up -d

image-20250915155332825

version: '2.1'
services:
  nginx:
    image: nginx
    container_name: proxy
    #volumes:
    #  - /data/nginx/conf.d:/etc/nginx/conf.d
    #  - /data/nginx/ca:/etc/nginx/ca
    #  - /data/nginx/logs:/var/log/nginx
    #  - /data/nginx/page:/usr/share/nginx/html
    #  - /etc/localtime:/etc/localtime
    ports:
      - "80:80"
      - "443:443"
    restart: always
    mem_limit: 256M 
#    network_mode: host 

network_mode: host 含义

有两种模式,一种是bridge和host。

默认是bridge,可以理解成一个路由功能,把容器和宿主机网络打通,容器内部会给一个172的地址,

host模式是主机模式,直接把容器应用的端口和宿主机绑定,不可再-p映射端口出来:

2、创建映射配置的目录给权限

拷贝前先创建一下目录 mkdir /data/nginx/conf.d

cd /data

chmod 777 ./nginx

3、复制容器配置出来

docke cp proxy:/etc/nginx/conf.d/default.conf /data/nginx/conf.d

4、修改docker-compose.yaml映射配置

version: '2.1'
services:
  nginx:
    image: nginx
    container_name: proxy
    volumes:
      - /data/nginx/conf.d:/etc/nginx/conf.d
      - /data/nginx/ca:/etc/nginx/ca
      - /data/nginx/logs:/var/log/nginx
      - /data/nginx/page:/usr/share/nginx/html
      - /etc/localtime:/etc/localtime
    ports:
      - "80:80"
      - "443:443"
    restart: always
    mem_limit: 256M 
#    network_mode: host 

5、查看映射的nginx配置

cd /data/nginx/default.conf
cat ./default.conf
这个时候应该是默认的nginx配置

6、修改默认配置页面

cd /data/nginx/page
vi ./index.html

image-20250915160445624

修改后保存退出

image-20250915160510948

7、测试访问变化

image-20250915160544209

upstream app {
   server 47.109.102.26:9090 fail_timeout=20s; 
   #ip_hash;
}

server {
  listen       80;
  server_name  localhost;


location / {
  root   /usr/share/nginx/html;
  index  index.html index.htm;
}

location /test/ {
   proxy_pass http://app/;
   #proxy_set_header Host $host;
   #proxy_set_header X-Real-IP $remote_addr;
   #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   #proxy_set_header X-Forwarded-Host $http_host;
   #proxy_set_header X-Forwarded-Port $server_port;
   #proxy_set_header X-Forwarded-Proto $scheme;
   #limit_conn one 1000;
   #limit_rate 1024k;
   #limit_req zone=my_req_zone burst=10000;

}

}

upstream app {
   server 47.109.102.26:9090 weight=3 fail_timeout=20s;
   #server 47.109.102.26:9091 weight=1 fail_timeout=20s;
}

server {
    listen       80;
    server_name  localhost;


    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

   location /test/ {
    proxy_pass http://app/;
  }
}