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

| 用途 | 路径 |
|---|---|
| 主配置文件 | /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 文件。
看不懂就略过,不影响使用。你只需要知道在哪里放你的网站页面,在哪里添加 / 修改你的 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 。
xxxxxxxxxx181# default 文件,已将注释文件删除,保留关键部分。2server {3 # 默认监听本地 80 端口(ipv4)4 listen 80 default_server;5 # 默认监听本地 80 端口(ipv6)6 listen [::]:80 default_server;7 8 # 网站根目录:nginx 启动后,从这个目录搜索首页文件9 root /var/www/html;10 # 首页文件:在根目录中优先找 index.html文件,如果找不到,接着找下一个文件:index.htm,依次寻找...11 # 如果全部找完还找不到,则直接报错 40412 index index.html index.htm index.nginx-debian.html;13
14 server_name _;15 location / {16 try_files $uri $uri/ =404;17 }18}从 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 ,渲染到浏览器,展示前端界面。
现在给出一个测试网页代码,保存到服务器 /var/www/html/index.html 文件:
xxxxxxxxxx11sudo vim /var/www/html/index.html填写以下内容:
xxxxxxxxxx1112<html>3<head>4 <meta charset="utf-8">5 <title>我的第一个Nginx网页</title>6</head>7<body>8 <h1>你好,Nginx 配置成功!</h1>9 <p>这是我自己的网页</p>10</body>11</html>
网页展示:

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

使用 Let’s Encrypt 获取免费 SSL 证书。
安装 Certbot 工具:
Debian/Ubuntu 系统,执行以下指令:
xxxxxxxxxx21sudo apt update2sudo apt install certbot python3-certbot-nginxCentOS/Rocky Linux 执行以下指令:
xxxxxxxxxx11sudo yum install -y certbot python3-certbot-nginx为域名申请 SSL 证书:
xxxxxxxxxx51# 替换为你自己的域名和邮箱2# sudo certbot --nginx -d <your-domain.com> --email <your-email@your-email.com>3
4# 你也可以跳过邮箱验证5sudo 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 天自动执行续期。
如果没有,请执行以下指令,手动续期:
xxxxxxxxxx11sudo certbot renew
虽然使用系统(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 容器化部署。
一种容器化部署工具。(怎么样?够不够简洁(介)?)
docker 通过镜像 images 可以创建多个不同的容器,每个容器拥有独立的运行环境。这个镜像相当于模板,容器相当于由模板创建出来的实例。类比:Java的类和对象。Student 类相当于模板,镜像,Student zhangsan= new Student("张三"),这里的 “张三” 就是对象,就是这里的容器。每个容器之间相互独立。因此,你可以在同一个系统中,创建多个不同版本的 nginx。
Docker官方镜像仓库: https://hub.docker.com
B站视频(这个博主讲的很详细):【40分钟的Docker实战攻略,一期视频精通Docker】
文章以 ubuntu 系统为例:
xxxxxxxxxx81# 1. 下载脚本2curl -fsSL https://get.docker.com -o install-docker.sh3
4# 2. 安装 docker5sudo sh install-docker.sh6
7# 3. 如果安装后未启动,手动启动8sudo systemctl start docker配置国内镜像加速 / 科学上网,否则无法拉取镜像:
xxxxxxxxxx221# 创建 docker 配置文件夹2sudo mkdir -p /etc/docker3
4# 写入国内镜像加速地址5sudo tee /etc/docker/daemon.json <<-'EOF'6{7 "registry-mirrors": [8 "https://docker.m.daocloud.io",9 "https://mirror.ccs.tencentyun.com",10 "https://docker.1panel.live",11 "https://hub.rat.dev",12 "https://docker.mirrors.ustc.edu.cn",13 "https://hub-mirror.c.163.com"14 ]15}16EOF17
18# 重新加载配置19sudo systemctl daemon-reload20
21# 重启 docker22sudo systemctl restart dockerdocker 的所有指令都需要 sudo 权限。
拉取镜像:
xxxxxxxxxx51# 语法:2sudo docker pull 镜像名[:镜像版本] (不指定版本号,默认拉取最新版本)3
4# eg: 拉取最新版本 nginx 镜像5sudo docker pull nginx查看所有镜像:
xxxxxxxxxx11sudo docker images删除镜像:
xxxxxxxxxx81# 语法:2sudo docker rmi 镜像ID/镜像名3
4# eg: 删除 nginx 镜像5sudo docker rmi nginx6
7# 删除所有镜像【危险操作】8# sudo docker rmi -f $(sudo docker images -q)【关键】创建并运行一个容器:
xxxxxxxxxx11sudo 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 容器的进程状态:
xxxxxxxxxx11sudo docker ps -aps: process status, 进程状态,只能查看到正在运行的容器
-a: 表示 all, 查看所有的容器状态
启动/停止一个容器:
xxxxxxxxxx51# 语法:2sudo docker start/stop 容器ID/容器名3
4# eg: 停止 test_nginx 容器5sudo docker stop test_nginx配置容器在停止时的重启策略:
xxxxxxxxxx21sudo docker run -d --restart always nginx 2sudo docker run -d --restart unless-stopped nginx --restart always: 只要容器停止了,就立即重启。包含容器因为内部错误崩溃或宿主机断电等场景。
--restart unless-stopped:跟always 类似,但是手动停止的容器,不会自动重启。
进入容器内部,并执行 Linux 指令:
xxxxxxxxxx201# 语法:2sudo docker exec -it 容器ID/容器名 /bin/bash3
4# 创建一个 nginx 容器5sudo docker run -d --name test -p 8080:80 nginx6# 进入 test 容器内部7sudo docker exec -it test /bin/bash8# docker 内部 nginx 容器的默认网页存放目录9cd /usr/share/nginx/html10
11# 容器内部是一个极简的操作系统,很多命令会缺失,有些命令要自己下载12# 首先查看容器内的linux发行版本13cat /etc/os-release14# 此时发现是debian的,包管理是apt,如果是centos, 则使用yum15# 更新索引16apt update17apt install vim18# 修改文件等操作 ...19# ... ...20# 输入:exit 退出容器删除容器:
xxxxxxxxxx81# 语法:2sudo docker rm 容器ID/容器名3
4# eg: 删除名为 test_nginx 的容器5sudo docker rm -f test_nginx6
7# 删除所有容器【危险操作】8# sudo docker rm -f $(sudo docker ps -a -q)rm:remove 删除,无法删除正在运行的容器。
-f:force 强制删除,可以在容器正常运行的状态下,删除容器。
-a:--all 显示全部
-q:--quiet(安静模式),只输出容器 / 镜像的 ID 号,不输出任何多余文字。
docker 网络:
处于同一个 docker 网络的几个容器,他们之间可以通过容器名相互访问,创建 docker 网络 network1 :
xxxxxxxxxx11sudo docker network create network1你需要掌握 【创建并运行一个容器】 和 【查看容器】
在家目录新建文件夹 /home/ubuntu/myweb ,并存放网站文件 /home/ubuntu/index.html:
xxxxxxxxxx11sudo mkdir -p /home/ubuntu/myweb && sudo vim /home/ubuntu/myweb/index.html写入以下内容:
xxxxxxxxxx1112<html>3<head>4 <meta charset="utf-8">5 <title>我的第三个Nginx网页</title>6</head>7<body>8 <h1>你好,Nginx 配置成功!</h1>9 <p>这是我自己的网页——使用docker创建</p>10</body>11</html>创建并运行 docker 容器:
xxxxxxxxxx61sudo docker run -d \2 --name myweb-nginx3 \3 -p 80:80 \4 -v /home/ubuntu/myweb:/usr/share/nginx/html \5 --restart unless-stopped \6 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地址

只需要在上一步容器的基础上新增一个挂载目录:挂载 nginx 的配置文件目录即可。为了规范性,现在调整网站存放路径,将 /home/ubuntu/myweb 修改为 /var/www/open.izhu.cc 并将网站文件放在这个文件夹。
请自行调整。
接着,创建存放配置文件的目录,并编辑 nginx 配置文件 /var/www/nginx-config/open.izhu.cc.conf:
xxxxxxxxxx11sudo mkdir -p /var/www/nginx-config && sudo vim /var/www/nginx-config/open.izhu.cc.conf将以下内容,写入配置文件:
xxxxxxxxxx121server {2 listen 80;3 server_name <your-domain.com>; # 修改为你自己的域名4
5 # 容器内部网站根目录6 root /usr/share/nginx/html;7 index index.html;8
9 location / {10 try_files $uri $uri/ =404;11 }12}创建一个新容器(容器名唯一,不可重名):
xxxxxxxxxx81# 因为上一个容器已经映射了宿主机的80端口,为避免冲突,本次使用81端口,或者你将上一个容器停止/删除,继续使用80端口2sudo docker run -d \3 --name docker-myweb-nginx \4 -p 81:80 \5 -v /var/www/open.izhu.cc:/usr/share/nginx/html \6 -v /var/www/nginx-config:/etc/nginx/conf.d/ \7 --restart unless-stopped \8 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 反向代理。

同样的,只需要在上一步容器的基础上新增一个挂载目录:挂载 SSL 证书路径,同时修改nginx 配置文件。
使用 Let’s Encrypt 获取免费 SSL 证书。由于 2.5 配置 SSL 证书(开启 HTTPS) 已经为域名 open.izhu.cc 申请过证书,这里不再重复申请。证书的存放路径为: /etc/letsencrypt/live/open.izhu.cc 。
xxxxxxxxxx51# 创建证书的存放路径2sudo mkdir -p /var/www/ssl-certs3# 拷贝证书4sudo cp /etc/letsencrypt/live/open.izhu.cc/fullchain.pem /var/www/ssl-certs/5sudo cp /etc/letsencrypt/live/open.izhu.cc/privkey.pem /var/www/ssl-certs/修改 nginx 配置文件 /var/www/nginx-config/open.izhu.cc.conf:
xxxxxxxxxx11sudo vim /var/www/nginx-config/open.izhu.cc.conf清空文件内容,并写入以下内容:
xxxxxxxxxx261server {2 listen 80;3 server_name open.izhu.cc;4 # 将所有 HTTP 请求重定向到 HTTPS5 return 301 https://$host$request_uri;6}7
8server {9 listen 443 ssl;10 http2 on;11 # ====== 修改为你自己的域名 =====12 server_name <your-domain.com>;13 # ============================14
15 # 容器内部网站根目录16 root /usr/share/nginx/html;17 index index.html;18
19 # 容器内部证书存放路径20 ssl_certificate /etc/nginx/ssl/fullchain.pem;21 ssl_certificate_key /etc/nginx/ssl/privkey.pem;22
23 location / {24 try_files $uri $uri/ =404;25 }26}将之前容器删除,然后创建一个新的容器:
xxxxxxxxxx91sudo docker run -d \2 --name docker-myweb-nginx-https \3 -p 80:80 \4 -p 443:443 \5 -v /var/www/open.izhu.cc:/usr/share/nginx/html \6 -v /var/www/nginx-config:/etc/nginx/conf.d \7 -v /var/www/ssl-certs:/etc/nginx/ssl:ro \8 --restart unless-stopped \9 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 表示只读。
访问页面:
xxxxxxxxxx11https://open.izhu.cc
正向代理:
正向代理是客户端的代理,用于帮助客户端访问目标服务器。客户端通过正向代理服务器发送请求,代理服务器再将请求转发给目标服务器,并将响应返回给客户端。
正向代理的主要特点:
隐藏客户端真实IP:目标服务器无法知道真正的客户端是谁。
突破访问限制:例如访问被限制的网站或国外资源。
提高访问速度:通过缓存常用数据,减少重复请求。
典型场景:翻墙访问国外网站。
反向代理:
反向代理是服务器的代理,用于接收客户端请求并将其转发给后端服务器。客户端只与反向代理服务器交互,而不知道后端服务器的存在。nginx 反向代理就是使用 nginx 软件,代理服务端。
反向代理的主要特点:
隐藏服务器真实IP:保护后端服务器的安全。
负载均衡:根据后端服务器的负载情况分配请求。
提高访问速度:缓存静态内容或高频访问的动态内容。
安全防护:提供防火墙功能,抵御DDoS攻击等。
典型场景:Web服务器的负载均衡和安全防护。
对比:
| 对比维度 | 正向代理 | 反向代理(Nginx) |
|---|---|---|
| 代理对象 | 客户端 | 服务端 |
| 隐藏谁 | 隐藏用户 IP | 隐藏后端服务器 |
| 配置方 | 客户端手动配置 | 服务端配置 Nginx |
| 访问方向 | 内网→外网 | 外网→内网服务 |
| 典型场景 | 翻墙、公司上网代理 | 网站部署、微服务、负载均衡 |
| 用户感知 | 知道自己用了代理 | 完全无感知 |
正向代理:我要上网,找人替我去 → 藏自己。
反向代理:别人找我,我找人干活 → 藏后台。
编写网站文件 /var/www/open.izhu.cc/index.html :
xxxxxxxxxx11sudo vim /var/www/open.izhu.cc/index.html写入以下内容:
xxxxxxxxxx1112<html>3<head>4 <meta charset="utf-8">5 <title>我的第六个Nginx网页</title>6</head>7<body>8 <h1>你好,Nginx 配置成功!</h1>9 <p>这是我自己的网页——docker+nginx 反向代理。</p>10</body>11</html>创建 docker 网络 network1 ,处于同一个 docker 网络的容器,他们之间可以通过容器名相互访问:
xxxxxxxxxx11sudo docker network create network1将上面这个网页使用 docker 部署在本地 8080 端口,并加入到 network1 网络:
xxxxxxxxxx71sudo docker run -d \2 --name localhost-8080 \3 -p 8080:80 \4 -v /var/www/open.izhu.cc:/usr/share/nginx/html \5 --network network1 \6 --restart unless-stopped \7 nginx

现在使用 nginx 反向代理,将本地8080端口的这个网页 localhost:8080 ,可以使用域名访问 https://open.izhu.cc 。
xxxxxxxxxx51# 创建证书的存放路径2sudo mkdir -p /var/www/ssl-certs3# 拷贝证书4sudo cp /etc/letsencrypt/live/open.izhu.cc/fullchain.pem /var/www/ssl-certs/5sudo cp /etc/letsencrypt/live/open.izhu.cc/privkey.pem /var/www/ssl-certs/编写 nginx 配置文件 /var/www/nginx-config/open.izhu.cc.conf :
xxxxxxxxxx11sudo vim /var/www/nginx-config/open.izhu.cc.conf写入以下内容:
xxxxxxxxxx451server {2 listen 80;3 # ==== 替换为你自己的域名 =======4 server_name <your-domain.com>;5 # ============================6 # HTTP 80 强制跳转 HTTPS7 return 301 https://$host$request_uri;8}9
10# HTTPS 443 反向代理核心11server {12 listen 443 ssl;13 # ====== 替换为你自己的域名 =======14 server_name <your-domain.com>;15 # ==============================16
17 # 容器内部证书存放路径18 ssl_certificate /etc/nginx/ssl/fullchain.pem;19 ssl_certificate_key /etc/nginx/ssl/privkey.pem;20 21 # 基础SSL优化22 ssl_protocols TLSv1.2 TLSv1.3;23 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;24 ssl_prefer_server_ciphers on;25 ssl_session_cache shared:SSL:10m;26
27 # 核心反向代理规则28 location / {29 # 转发到本地8080程序(反向代理),在docker 容器内部是80端口30 # 处于同一个docker网络的容器,容器之间可以使用容器名字访问,默认同属于bridge网络31 # localhost-8080 是上一个容器的名字,80是容器内部的端口号32 proxy_pass http://localhost-8080:80;33
34 # 固定必须加的请求头(否则后端拿不到真实IP、域名)35 proxy_set_header Host $host;36 proxy_set_header X-Real-IP $remote_addr;37 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;38 proxy_set_header X-Forwarded-Proto $scheme;39 40 # 超时配置(可选)41 proxy_connect_timeout 60s;42 proxy_read_timeout 60s;43 proxy_send_timeout 60s;44 }45}新建 docker 容器,绑定网页目录,绑定配置文件,加入到 network1 网络:
xxxxxxxxxx91docker run -d \2 --name nginx-proxy \3 -p 80:80 \4 -p 443:443 \5 -v /var/www/nginx-config:/etc/nginx/conf.d \6 -v /var/www/ssl-certs:/etc/nginx/ssl:ro \7 --network network1 \8 --restart unless-stopped \9 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:<宿主机端口号>; ,应该是我写复杂了。。。嗯,就这样,不懂得自己去查资料。
使用系统安装(apt install)的 nginx 部署网页,在本地8080端口运行。无需docker。
与 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:
xxxxxxxxxx11sudo vim /etc/nginx/sites-available/nginx-proxy写入以下内容:
xxxxxxxxxx381server {2 # 监听 443 端口3 listen 443 ssl;4 # ====== 替换为你自己的域名 =======5 server_name <your-domain.com>;6 # ==============================7
8 # ==================== 替换为你自己的域名 ==============================9 # 宿主机本地 SSL 证书存放路径10 ssl_certificate /etc/letsencrypt/live/<your-domain.com>/fullchain.pem;11 ssl_certificate_key /etc/letsencrypt/live/<your-domain.com>/privkey.pem;12 # ===================================================================13 14 # 基础SSL优化15 ssl_protocols TLSv1.2 TLSv1.3;16 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;17 ssl_prefer_server_ciphers on;18 ssl_session_cache shared:SSL:10m;19
20 # 核心反向代理规则21 location / {22 # 转发到本地8080程序(反向代理)23 proxy_pass http://127.0.0.1:8080;24 # 或者写 localhost 也是一样的25 # proxy_pass http://localhost:8080;26 27 # 固定必须加的请求头(否则后端拿不到真实IP、域名)28 proxy_set_header Host $host;29 proxy_set_header X-Real-IP $remote_addr;30 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;31 proxy_set_header X-Forwarded-Proto $scheme;32 33 # 超时配置(可选)34 proxy_connect_timeout 60s;35 proxy_read_timeout 60s;36 proxy_send_timeout 60s;37 }38}创建软连接:
xxxxxxxxxx81# 1. 创建软连接2sudo ln -s /etc/nginx/sites-available/nginx-proxy /etc/nginx/sites-enabled/3
4# 2. 检查配置文件语法是否正确5sudo nginx -t6
7# 3. 如果没有报错,重新加载 Nginx 使配置生效8sudo systemctl reload nginx访问域名 https://open.izhu.cc:

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