知识点复习
一、什么是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 容器编排
课堂目标
- 理解nginx反向代理
- nginx常用功能
- 理解nginx的基本配置
- 网站部署
- 负载均衡
为什么有nginx?
一、早期系统

单体系统,直接用Tomcat作为服务器容器。
优点:快速部署,简单。打包程war或者直接拷贝到服务器里完成部署。
缺点:单体应用,容错性差。小系统,用户量少的内部系统使用。
一旦客户端激增,单体项目无法承载。

可以通过增加nginx的方法,用nginx做负载均衡,分摊访a问量到多个服务器。
多个tomcat集群,也叫横向扩容
nginx->ip hash

二、现代应用架构
nginx不仅可以做web容器,还有缓存、跨域、防火墙等一系列功能。

三、什么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

Web服务器一般指网站服务器(
软、硬),是指Internet上某种类型的计算机程序,可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览,也可以放置数据文件,让全世界下载。
主流的三个Web服务器是
Apache(php)、Nginx(html)、IIS(asp)、Tomcat(jsp)。在选择使用web服务器应考虑的本身特性因素有:性能、安全性、日志和统计、虚拟主机、代理服务器、缓冲服务和集成应用程序等。
五、什么是反向代理
-
正向代理
通过某一个软件,代理客户端的请求。

- 反向代理
通过某一个软件,代理
服务端提供的服务。

六、什么是负载均衡
把大量的请求转发到后端不同的服务器,以分摊高并发请求的压力。

ip_hash
- 如何保证session?
七、作为开发人员必须要会哪些?
- 前后端web转发
- 负载均衡配置
需要知道还可以做哪些?
- 三方跨域处理
- https配置 443
- 常规防火墙、限流等
- 缓存静态资源

八、常用命令
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


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、负载均衡配置步骤

注意:ip_hash 指令必须放在 server 指令之前
- 在宿主机进入映射目录
cd /data/nginx/conf.d
vi ./default.conf
- 增加负载均衡配置

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
跨域的核心配置如下

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

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

修改后保存退出

7、测试访问变化

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/;
}
}
19-3阶内容-2.1.2-nginx
https://xiaochenblog.icu/archives/19-3jie-nei-rong-2.1.2-nginx
评论