【Linux】Nginx 部署网页

【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。

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/sslro 表示只读。

访问地址: 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

你好,少年,未来可期~