【Linux】Nginx 部署网页
一、安装 Nginx
【文章以 Ubuntu 系统为例】
Debian/Ubuntu 系统,执行以下指令:
bash
sudo apt update
sudo apt install -y nginx
CentOS / RHEL / Rocky / AlmaLinux 系统,执行以下指令:
bash
# CentOS stream8/9 将 yum 替换为 dnf,效果一样的,查看系统可以看到,yum是dnf的软连接。
sudo yum install -y epel-release
sudo yum install -y nginx
管理 Nginx 服务:
bash
# 查看状态(看到 active (running) 即成功)
sudo systemctl status nginx
# 启动 nginx(如果未启动)
sudo systemctl start nginx
# 开机自启(如果未设置)
sudo systemctl enable nginx
查看默认网页,在浏览器地址栏输入服务器IP地址(nginx 默认启动在 80 端口):

二、Nginx 部署网页
2.1 Nginx 核心文件 / 目录
| 用途 | 路径 |
|---|---|
| 主配置文件 | /etc/nginx/nginx.conf |
| 网站配置目录【你写的nginx配置放在这里】 | /etc/nginx/sites-available/(可用配置) |
| 生效配置目录 | /etc/nginx/sites-enabled/(软链接) |
| 通用扩展目录 | /etc/nginx/conf.d/ (扩展目录) |
| 默认网页根目录【关键】 | /var/www/html/ |
| 日志目录 | /var/log/nginx/(访问日志 / 错误日志) |
| 启动命令 | systemctl start/stop/restart/reload nginx |
你需要注意的几个文件 / 目录:
- 默认配置文件:
/etc/nginx/nginx.conf。nginx 启动 / 重启时,默认读取的配置文件。 - 自定义配置文件存放目录:
/etc/nginx/sites-available/。你自己写的 nginx 配置文件。 - 默认网页根目录:
/var/www/html/。存放你的网站页面,nginx 启动时,默认从该目录读取 index.html 文件。
2.2 Nginx 启动原理
看不懂就略过,不影响使用。你只需要知道在哪里放你的网站页面,在哪里添加 / 修改你的 nginx 配置文件就行。
-
Nginx 启动 / 重启时,只先读一个文件:
/etc/nginx/nginx.conf。在nginx.conf里面会自动包含sites-enabled里的所有配置!! -
在默认配置文件中(
nginx.conf第59,60行),默认读取/etc/nginx/conf.d/*.conf和/etc/nginx/sites-enabled/*文件里面的配置文件。使用 vim 编辑器,输入:set nu可以显示行号。
-
/etc/nginx/conf.d/*.conf:通用扩展目录,放零碎全局配置,不适合放完整站点,新安装时,里面什么也没有。 -
/etc/nginx/sites-enabled/*:开机生效文件夹,里面 全是软链接(快捷方式,Nginx 只读这里) ,链接/etc/nginx/sites-available/文件夹里面的文件。重启 / 重载 nginx服务,nginx 会读取这里面的配置文件。
-
/etc/nginx/sites-available/。nginx 配置仓库,存放所有网站配置。你自己写的 nginx 配置文件存放在这里。文件夹里面默认有一个配置文件:default。bash# default 文件,已将注释文件删除,保留关键部分。 server { # 默认监听本地 80 端口(ipv4) listen 80 default_server; # 默认监听本地 80 端口(ipv6) listen [::]:80 default_server; # 网站根目录:nginx 启动后,从这个目录搜索首页文件 root /var/www/html; # 首页文件:在根目录中优先找 index.html文件,如果找不到,接着找下一个文件:index.htm,依次寻找... # 如果全部找完还找不到,则直接报错 404 index index.html index.htm index.nginx-debian.html; server_name _; location / { try_files $uri $uri/ =404; } } -
从 default 文件,可以看到,nginx 启动后默认监听本地80端口,并且从网站根目录
/var/www/html读取首页文件index.html,index.htm,index.nginx-debian.html。 -
打开网站根目录
/var/www/html, 发现只有一个文件index.nginx-debian.html。将文件修改 / 删除(需要 sudo 权限),网站界面立即发生变化。 -
如果要将自己的网站部署在服务器上,最简单的方式就是找到网站根目录,将所有文件删除,并上传自己的网站。接着将自己网站首页页面,修改为:
index.html。访问时,直接输入服务器IP。如果要使用域名访问,就写一个 nginx 配置文件,做反向代理即可。
nginx 启动原理总结:nginx 启动,读取默认配置文件 /etc/nginx/nginx.conf (包含 /etc/nginx/sites-enabled/ ) ,找到网站根目录 /var/www/html ,从根目录找到网站首页: index.html ,渲染到浏览器,展示前端界面。
2.3 普通部署网页
现在给出一个测试网页代码,保存到服务器 /var/www/html/index.html 文件:
bash
sudo vim /var/www/html/index.html
填写以下内容:
html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>我的第一个Nginx网页</title>
</head>
<body>
<h1>你好,Nginx 配置成功!</h1>
<p>这是我自己的网页</p>
</body>
</html>

网页展示: http://服务器IP地址

2.4 使用域名访问
准备一个域名,并做好域名解析。文章以 open.izhu.cc 域名为例。
新建网页文件:
bash
# 路径 "open.izhu.cc" 替换为你自己的域名
sudo vim /var/www/open.izhu.cc/index.html
- 网页根目录名一般以域名命名。手动新建目录:
/var/www/open.izhu.cc, 并将网页文件放在里面。
html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>我的第二个Nginx网页</title>
</head>
<body>
<h1>你好,Nginx 配置成功!</h1>
<p>这是我自己的网页------使用域名访问</p>
</body>
</html>
编写 nginx 配置文件:
bash
# 文件名 "open.izhu.cc" 替换为你自己的域名
sudo vim /etc/nginx/sites-available/open.izhu.cc
- 存放目录:
/etc/nginx/sites-available/ - nginx 配置文件名一般也是以域名命名,方便区分。当然,你也可以使用其他名称。
填写以下内容:
bash
server {
# 让 nginx 监听 80 端口
listen 80;
# 这里改成你的域名!!
server_name <your-domain.com>; # 修改为你自己的域名
# 你的网页根目录
root /var/www/<your-domain.com>; # 修改为你自己的域名
# 默认首页
index index.html;
# 按顺序找文件,找不到返回 404
location / {
try_files $uri $uri/ =404;
}
}
创建软连接,测试配置,并重新加载 nginx:
bash
# 1. 创建符号链接,启用站点。------替换为你自己的域名
sudo ln -s /etc/nginx/sites-available/<your-domain.com> /etc/nginx/sites-enabled/
# 2. 检查配置文件语法是否正确
sudo nginx -t
# 3. 如果没有报错,重新加载 Nginx 使配置生效
sudo systemctl reload nginx
访问域名: open.izhu.cc

2.5 配置 SSL 证书(开启 HTTPS)
使用 Let's Encrypt 获取免费 SSL 证书。
安装 Certbot 工具:
Debian/Ubuntu 系统,执行以下指令:
bash
sudo apt update
sudo apt install certbot python3-certbot-nginx
CentOS/Rocky Linux 执行以下指令:
bash
sudo yum install -y certbot python3-certbot-nginx
为域名申请 SSL 证书:
bash
# 替换为你自己的域名和邮箱
# sudo certbot --nginx -d <your-domain.com> --email <your-email@your-email.com>
# 你也可以跳过邮箱验证
sudo certbot --nginx -d <your-domain.com> --register-unsafely-without-email
- <your-domain.com> 要修改为你自己的实际域名。
- your-email@your-email.com 修改为你自己的邮箱(申请的证书有效期是90天,快到期时会给你发邮箱,提醒你续期)。
- 但是 Cerbot 会帮你自动续期,这里我们忽略邮箱验证(--register-unsafely-without-email)。



手动续期 SSL 证书:
- 在使用 certbot --nginx 指令时,Certbot 会自动在系统后台创建一个自动化任务,帮你自动续期。
- 它默认每天会运行两次,智能地检查所有证书,并在到期前 30 天自动执行续期。
- 如果没有,请执行以下指令,手动续期:
bash
sudo certbot renew
三、使用 Docker 部署
虽然使用系统(apt install)安装的 nginx 部署网页非常简单,但是有时候系统并不是纯净的(比如你安装了宝塔面板或者其他运维工具,如果你的 nginx 是从宝塔里面安装的,nginx 配置路径就不是系统默认的配置路径,此时认为系统 "不纯净"),你可能需要百度找他的配置文件路径和网页根目录路径,比较麻烦。使用 docker 部署,你不需要关心宿主机nginx的环境是什么样子的,也不需要关心配置文件在哪里?你只需要将本地文件任意目录挂载到容器内部即可,更加灵活。
宝塔安装的 nginx:
- 默认网页路径:
/www/server/nginx/html相当于/var/www/html/(网站根目录) - 默认配置文件:
/www/server/nginx/conf/nginx.conf相当于/etc/nginx/nginx.conf(nginx 默认配置文件) - 站点配置文件目录:
/www/server/panel/vhost/nginx/相当于/etc/nginx/sites-available/(自己写的配置)
其实这样分析后,找到了网站根目录存放位置,和 nginx 配置文件存放位置,你自己也能部署了,但是如果换一种管理面板呢?那么他的nginx 安装目录肯定和宝塔面板的 nginx 安装目录不同。当然,你既然安装了宝塔面板,直接使用宝塔的可视化界面部署就行了,简单方便,鼠标点点点就完成部署了,但是我们目前做的是在没有可视化界面的条件下,如何手动部署网页,所以最方便的就是使用 docker 容器化部署。
3.1 docker 简介
一种容器化部署工具。(怎么样?够不够简洁(介)?)
docker 通过镜像 images 可以创建多个不同的容器,每个容器拥有独立的运行环境。这个镜像相当于模板,容器相当于由模板创建出来的实例。类比:Java的类和对象。Student 类相当于模板,镜像,Student zhangsan= new Student("张三"),这里的 "张三" 就是对象,就是这里的容器。每个容器之间相互独立。因此,你可以在同一个系统中,创建多个不同版本的 nginx。
-
Docker官方镜像仓库: https://hub.docker.com
-
B站视频(这个博主讲的很详细):【40分钟的Docker实战攻略,一期视频精通Docker】
3.2 安装 docker
文章以 ubuntu 系统为例:
bash
# 1. 下载脚本
curl -fsSL https://get.docker.com -o install-docker.sh
# 2. 安装 docker
sudo sh install-docker.sh
# 3. 如果安装后未启动,手动启动
sudo systemctl start docker
配置国内镜像加速 / 科学上网,否则无法拉取镜像:
bash
# 创建 docker 配置文件夹
sudo mkdir -p /etc/docker
# 写入国内镜像加速地址
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://mirror.ccs.tencentyun.com",
"https://docker.1panel.live",
"https://hub.rat.dev",
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
]
}
EOF
# 重新加载配置
sudo systemctl daemon-reload
# 重启 docker
sudo systemctl restart docker
3.3 常用指令
docker 的所有指令都需要 sudo 权限。
拉取镜像:
bash
# 语法:
sudo docker pull 镜像名[:镜像版本] (不指定版本号,默认拉取最新版本)
# eg: 拉取最新版本 nginx 镜像
sudo docker pull nginx
查看所有镜像:
bash
sudo docker images
删除镜像:
bash
# 语法:
sudo docker rmi 镜像ID/镜像名
# eg: 删除 nginx 镜像
sudo docker rmi nginx
# 删除所有镜像【危险操作】
# sudo docker rmi -f $(sudo docker images -q)
【关键】创建并运行一个容器:
bash
sudo docker run -d --name test_nginx -p 80:80 -v /home/ubuntu/myweb:/usr/share/nginx/html nginx
-
sudo docker run:创建并运行一个 docker 容器,如果没有这个容器的镜像,docker 首先会自动拉取镜像(sudo docker pull 镜像名),然后再创建容器。
-
-d:detached mode 分离模式,表示让容器在后台运行,不会阻塞当前的窗口
-
--name: 给容器起一个名字 test_nginx,容器名字唯一,不可重名。
-
-p:端口映射,宿主机端口:容器内端口。 将主机的80端口映射到容器的80端口,如果主机80端口被占用,则会创建失败。
-
-v:volume 挂载卷,挂载目录, 宿主机目录:容器内目录。将宿主机目录/home/ubuntu/myweb与容器内目录/usr/share/nginx/html相互关联。相互关联的目录相当于一个全局资源,任意一方对其修改都会使之改变。比如在容器内部新增一个test.txt 文件,在宿主机上就能看到新增的文件。当删除容器时,容器内部所有文件(包括关联的这个目录)都会被删除,但是宿主机上的这个关联的目录会被保存下来。
-
nginx:创建容器的镜像名,代表这个容器是一个 nginx 容器。你可以指定不同的版本号,来创建不同版本的 nginx 容器,即一个系统可以同时存在多个不同版本的 nginx,每个 nginx 之间,相互独立,互不干扰。
【关键】查看 docker 容器的进程状态:
bash
sudo docker ps -a
- ps: process status, 进程状态,只能查看到正在运行的容器
- -a: 表示 all, 查看所有的容器状态
启动/停止一个容器:
bash
# 语法:
sudo docker start/stop 容器ID/容器名
# eg: 停止 test_nginx 容器
sudo docker stop test_nginx
配置容器在停止时的重启策略:
bash
sudo docker run -d --restart always nginx
sudo docker run -d --restart unless-stopped nginx
- --restart always: 只要容器停止了,就立即重启。包含容器因为内部错误崩溃或宿主机断电等场景。
- --restart unless-stopped:跟always 类似,但是手动停止的容器,不会自动重启。
进入容器内部,并执行 Linux 指令:
bash
# 语法:
sudo docker exec -it 容器ID/容器名 /bin/bash
# 创建一个 nginx 容器
sudo docker run -d --name test -p 8080:80 nginx
# 进入 test 容器内部
sudo docker exec -it test /bin/bash
# docker 内部 nginx 容器的默认网页存放目录
cd /usr/share/nginx/html
# 容器内部是一个极简的操作系统,很多命令会缺失,有些命令要自己下载
# 首先查看容器内的linux发行版本
cat /etc/os-release
# 此时发现是debian的,包管理是apt,如果是centos, 则使用yum
# 更新索引
apt update
apt install vim
# 修改文件等操作 ...
# ... ...
# 输入:exit 退出容器
删除容器:
bash
# 语法:
sudo docker rm 容器ID/容器名
# eg: 删除名为 test_nginx 的容器
sudo docker rm -f test_nginx
# 删除所有容器【危险操作】
# sudo docker rm -f $(sudo docker ps -a -q)
- rm:remove 删除,无法删除正在运行的容器。
- -f:force 强制删除,可以在容器正常运行的状态下,删除容器。
- -a:--all 显示全部
- -q:--quiet(安静模式),只输出容器 / 镜像的 ID 号,不输出任何多余文字。
docker 网络:
处于同一个 docker 网络的几个容器,他们之间可以通过容器名相互访问,创建 docker 网络 network1 :
bash
sudo docker network create network1
你需要掌握 【创建并运行一个容器】 和 【查看容器】
3.4 普通部署网页
在家目录新建文件夹 /home/ubuntu/myweb ,并存放网站文件 /home/ubuntu/myweb/index.html:
bash
sudo mkdir -p /home/ubuntu/myweb && sudo vim /home/ubuntu/myweb/index.html
写入以下内容:
html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>我的第三个Nginx网页</title>
</head>
<body>
<h1>你好,Nginx 配置成功!</h1>
<p>这是我自己的网页------使用docker创建</p>
</body>
</html>
创建并运行 docker 容器:
bash
sudo docker run -d \
--name myweb-nginx3 \
-p 80:80 \
-v /home/ubuntu/myweb:/usr/share/nginx/html \
--restart unless-stopped \
nginx
--name myweb-nginx3:给容器取个名字,唯一,且不可重复。-p 80:80:宿主机本地80端口,映射到容器内部80端口。-v /home/ubuntu/myweb:/usr/share/nginx/html:挂载卷,将宿主机/home/ubuntu/myweb目录挂载容器内/usr/share/nginx/html目录。--restart unless-stopped:配置容器的重启策略。- 如果你在宝塔面板里面安装了nginx,请先停止宝塔的nginx,否则80端口被占用,导致容器创建失败。
- 或者映射其他端口,比如:8080端口(-p 8080:80)。
访问地址: http://服务器IP地址

3.5 使用域名访问
只需要在上一步容器的基础上新增一个挂载目录:挂载 nginx 的配置文件目录即可。为了规范性,现在调整网站存放路径,将 /home/ubuntu/myweb 修改为 /var/www/open.izhu.cc 并将网站文件放在这个文件夹。
- 请自行调整。
**接着,**创建存放配置文件的目录,并编辑 nginx 配置文件 /var/www/nginx-config/open.izhu.cc.conf:
bash
sudo mkdir -p /var/www/nginx-config && sudo vim /var/www/nginx-config/open.izhu.cc.conf
写入以下内容:
bash
server {
listen 80;
server_name <your-domain.com>; # 修改为你自己的域名
# 容器内部网站根目录
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
创建一个新容器(容器名唯一,不可重名):
bash
# 因为上一个容器已经映射了宿主机的80端口,为避免冲突,本次使用81端口,或者你将上一个容器停止/删除,继续使用80端口
sudo docker run -d \
--name docker-myweb-nginx \
-p 81:80 \
-v /var/www/open.izhu.cc:/usr/share/nginx/html \
-v /var/www/nginx-config:/etc/nginx/conf.d/ \
--restart unless-stopped \
nginx
-v /var/www/nginx-config:/etc/nginx/conf.d/:新增 nginx 配置文件的挂载目录 ,将宿主机/var/www/nginx-config目录挂载容器内/etc/nginx/conf.d/目录。
访问地址: http://open.izhu.cc:81
- 必须要带81端口,浏览器 http 默认端口是80, https 默认端口是 443, 只有 80 和 443 端口可以省略。
- 如果你不想带81,你可以将上一个容器停止/删除,然后重新创建一个新的容器,新的容器,映射宿主机80端口。
- 或者使用 nginx 反向代理。

3.6 配置 SSL 证书(开启 HTTPS)
同样的,只需要在上一步容器的基础上新增一个挂载目录:挂载 SSL 证书路径,同时修改nginx 配置文件。
使用 Let's Encrypt 获取免费 SSL 证书。由于 2.5 配置 SSL 证书(开启 HTTPS)(#2.5 配置 SSL 证书(开启 HTTPS)) 已经为域名 open.izhu.cc 申请过证书,这里不再重复申请。证书的存放路径为: /etc/letsencrypt/live/open.izhu.cc 。
bash
# 创建证书的存放路径
sudo mkdir -p /var/www/ssl-certs
# 拷贝证书
sudo cp /etc/letsencrypt/live/open.izhu.cc/fullchain.pem /var/www/ssl-certs/
sudo cp /etc/letsencrypt/live/open.izhu.cc/privkey.pem /var/www/ssl-certs/
修改 nginx 配置文件 /var/www/nginx-config/open.izhu.cc.conf:
bash
sudo vim /var/www/nginx-config/open.izhu.cc.conf
清空文件内容,并写入以下内容:
bash
server {
listen 80;
server_name open.izhu.cc;
# 将所有 HTTP 请求重定向到 HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
http2 on;
# ====== 修改为你自己的域名 =====
server_name <your-domain.com>;
# ============================
# 容器内部网站根目录
root /usr/share/nginx/html;
index index.html;
# 容器内部证书存放路径
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
location / {
try_files $uri $uri/ =404;
}
}
将之前容器删除,然后创建一个新的容器:
bash
sudo docker run -d \
--name docker-myweb-nginx-https \
-p 80:80 \
-p 443:443 \
-v /var/www/open.izhu.cc:/usr/share/nginx/html \
-v /var/www/nginx-config:/etc/nginx/conf.d \
-v /var/www/ssl-certs:/etc/nginx/ssl:ro \
--restart unless-stopped \
nginx
-p 80:80:让容器响应 HTTP 请求(用于重定向)-p 443:443:让容器响应 HTTPS 请求-v /var/www/open.izhu.cc:/usr/share/nginx/html:把网站根目录挂载到容器内的/usr/share/nginx/html。-v /var/www/nginx-config:/etc/nginx/conf.d:把 nginx 配置文件目录挂载到容器内的/etc/nginx/conf.d。-v /var/www/ssl-certs:/etc/nginx/ssl:ro:**新增 SSL 证书的挂载目录。**把证书目录挂载到容器内的/etc/nginx/ssl,ro表示只读。
访问地址: https://open.izhu.cc

四、docker+nginx 反向代理
4.1 知识拓展
正向代理:
正向代理是客户端的代理,用于帮助客户端访问目标服务器。客户端通过正向代理服务器发送请求,代理服务器再将请求转发给目标服务器,并将响应返回给客户端。
正向代理的主要特点:
- 隐藏客户端真实IP:目标服务器无法知道真正的客户端是谁。
- 突破访问限制:例如访问被限制的网站或国外资源。
- 提高访问速度:通过缓存常用数据,减少重复请求。
- 典型场景:翻墙访问国外网站。
反向代理:
反向代理是服务器的代理,用于接收客户端请求并将其转发给后端服务器。客户端只与反向代理服务器交互,而不知道后端服务器的存在。nginx 反向代理就是使用 nginx 软件,代理服务端。
反向代理的主要特点:
- 隐藏服务器真实IP:保护后端服务器的安全。
- 负载均衡:根据后端服务器的负载情况分配请求。
- 提高访问速度:缓存静态内容或高频访问的动态内容。
- 安全防护:提供防火墙功能,抵御DDoS攻击等。
- 典型场景:Web服务器的负载均衡和安全防护。
对比:
| 对比维度 | 正向代理 | 反向代理(Nginx) |
|---|---|---|
| 代理对象 | 客户端 | 服务端 |
| 隐藏谁 | 隐藏用户 IP | 隐藏后端服务器 |
| 配置方 | 客户端手动配置 | 服务端配置 Nginx |
| 访问方向 | 内网→外网 | 外网→内网服务 |
| 典型场景 | 翻墙、公司上网代理 | 网站部署、微服务、负载均衡 |
| 用户感知 | 知道自己用了代理 | 完全无感知 |
正向代理 :我要上网,找人替我去 → 藏自己。
反向代理 :别人找我,我找人干活 → 藏后台。
4.2 网页配置
编写网站文件 /var/www/open.izhu.cc/index.html :
bash
sudo vim /var/www/open.izhu.cc/index.html
写入以下内容:
html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>我的第六个Nginx网页</title>
</head>
<body>
<h1>你好,Nginx 配置成功!</h1>
<p>这是我自己的网页------docker+nginx 反向代理。</p>
</body>
</html>
4.3 docker 配置
创建 docker 网络 network1 ,处于同一个 docker 网络的容器,他们之间可以通过容器名相互访问:
bash
sudo docker network create network1
将上面这个网页使用 docker 部署在本地 8080 端口,并加入到 network1 网络:
bash
sudo docker run -d \
--name localhost-8080 \
-p 8080:80 \
-v /var/www/open.izhu.cc:/usr/share/nginx/html \
--network network1 \
--restart unless-stopped \
nginx


4.4 nginx 反向代理
现在使用 nginx 反向代理,将本地8080端口的这个网页 localhost:8080 ,可以使用域名访问 https://open.izhu.cc 。
bash
# 创建证书的存放路径
sudo mkdir -p /var/www/ssl-certs
# 拷贝证书
sudo cp /etc/letsencrypt/live/open.izhu.cc/fullchain.pem /var/www/ssl-certs/
sudo cp /etc/letsencrypt/live/open.izhu.cc/privkey.pem /var/www/ssl-certs/
编写 nginx 配置文件 /var/www/nginx-config/open.izhu.cc.conf :
bash
sudo vim /var/www/nginx-config/open.izhu.cc.conf
写入以下内容:
bash
server {
listen 80;
# ==== 替换为你自己的域名 =======
server_name <your-domain.com>;
# ============================
# HTTP 80 强制跳转 HTTPS
return 301 https://$host$request_uri;
}
# HTTPS 443 反向代理核心
server {
listen 443 ssl;
# ====== 替换为你自己的域名 =======
server_name <your-domain.com>;
# ==============================
# 容器内部证书存放路径
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
# 基础SSL优化
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
# 核心反向代理规则
location / {
# 转发到本地8080程序(反向代理),在docker 容器内部是80端口
# 处于同一个docker网络的容器,容器之间可以使用容器名字访问,默认同属于bridge网络
# localhost-8080 是上一个容器的名字,80是容器内部的端口号
proxy_pass http://localhost-8080:80;
# 固定必须加的请求头(否则后端拿不到真实IP、域名)
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-Proto $scheme;
# 超时配置(可选)
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
}
}
新建 docker 容器,绑定网页目录,绑定配置文件,加入到 network1 网络:
bash
docker run -d \
--name nginx-proxy \
-p 80:80 \
-p 443:443 \
-v /var/www/nginx-config:/etc/nginx/conf.d \
-v /var/www/ssl-certs:/etc/nginx/ssl:ro \
--network network1 \
--restart unless-stopped \
nginx
-v /var/www/nginx-config:/etc/nginx/conf.d:挂载 nginx 配置-v /var/www/ssl-certs:/etc/nginx/ssl:ro:挂载 SSL 证书--network network1:加入 docker 网络 network1- 因为是反向代理,只需要挂载配置文件目录和证书目录即可。

看着挺麻烦的,其实一点也不简单。这个例子举得不好。。。超纲了。。应该反向代理宿主机本地的某个端口的服务,但是我刚开始使用docker 容器创建了这个网页(8080端口),后面懒得改了。我觉得反向代理很简单,本质就一个指令 proxy_pass http://127.0.0.1:<宿主机端口号>; ,应该是我写复杂了。。。嗯,就这样,不懂得自己去查资料。
五、补充
nginx 反向代理
使用系统安装(apt install)的 nginx 部署网页,在本地8080端口运行。无需docker。
- 与 2.3 普通部署网页(#2.3 普通部署网页) 一样,这里只需要修改配置文件
/etc/nginx/sites-available/default,将80端口修改为8080。然后重启nginx,让修改的配置生效即可。不再重复操作。
效果展示:

反向代理配置:
现在本地8080端口已经有一个程序(网页)在跑,接下来我们使用 nginx 反向代理,将这个8080端口运行的网页,代理到域名:open.izhu.cc ,即访问 https://open.izhu.cc 就是访问本地的8080端口的这个网页。
新建配置文件: /etc/nginx/sites-available/nginx-proxy
bash
sudo vim /etc/nginx/sites-available/nginx-proxy
写入以下内容:
bash
server {
# 监听 443 端口
listen 443 ssl;
# ====== 替换为你自己的域名 =======
server_name <your-domain.com>;
# ==============================
# ==================== 替换为你自己的域名 ==============================
# 宿主机本地 SSL 证书存放路径
ssl_certificate /etc/letsencrypt/live/<your-domain.com>/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/<your-domain.com>/privkey.pem;
# ===================================================================
# 基础SSL优化
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
# 核心反向代理规则
location / {
# 转发到本地8080程序(反向代理)
proxy_pass http://127.0.0.1:8080;
# 或者写 localhost 也是一样的
# proxy_pass http://localhost:8080;
# 固定必须加的请求头(否则后端拿不到真实IP、域名)
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-Proto $scheme;
# 超时配置(可选)
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
}
}
创建软连接:
bash
# 1. 创建软连接
sudo ln -s /etc/nginx/sites-available/nginx-proxy /etc/nginx/sites-enabled/
# 2. 检查配置文件语法是否正确
sudo nginx -t
# 3. 如果没有报错,重新加载 Nginx 使配置生效
sudo systemctl reload nginx
访问域名: https://open.izhu.cc

End
你好,少年,未来可期~