跳转至

01.Docker部署-Nignx

Nginx 是一个开源的高性能 Web 服务器和反向代理服务器,也可以作为负载均衡器、HTTP 缓存以及邮件代理服务器使用。它最初由俄罗斯程序员 Igor Sysoev 开发,目的是解决 C10k 问题(即如何让服务器同时处理成千上万个并发连接)。如今,Nginx 被广泛应用于全球各类网站,尤其适用于高并发、高负载的场景。

Nginx 的常见用途

  1. Web 服务器:

Nginx 可以作为独立的 Web 服务器提供静态内容服务,并支持 PHP、Python、Java 等动态内容的处理(通常通过 FastCGI 或代理到后端应用服务器)。

  1. 反向代理服务器:

在多层架构中,Nginx 作为反向代理服务器,用于将客户端请求转发到多个应用服务器,并在其中承担负载均衡和缓存等功能。

  1. 负载均衡器:

Nginx 是流行的负载均衡解决方案,支持多种负载均衡策略,确保 Web 应用的高可用性和可扩展性。 4. API 网关:

在微服务架构中,Nginx 可以作为 API 网关,集中管理 API 请求并提供负载均衡、认证、安全控制等功能。

  1. SSL 终端:

Nginx 支持 SSL 证书的处理,可以作为 SSL 终端,解密 HTTPS 流量,然后将解密后的流量转发给后端服务器。

  1. 缓存加速:

利用 Nginx 的缓存功能,可以减轻后端服务器负担并加速用户的请求响应时间。

Docker-Compose 部署

version: "3.8"
services:
  web:
    container_name: nginx
    image: nginx
    ports:
      - 80:80
      - 443:443
    deploy:
      resources:
        limits:
          memory: 100M # 设置最大内存
          cpus: "0.5" # 限制容器使用 1 个 CPU 核心
        reservations:
          memory: 50M # 设置预留内存
          cpus: "0.5" # 设置 CPU 预留(预留 0.5 个 CPU 核心
    volumes:
      - ./html:/usr/share/nginx/html
      - ./conf/nginx.conf:/etc/nginx/nginx.conf
      - ./conf.d:/etc/nginx/conf.d
      - ./logs:/var/log/nginx
    restart: always
    networks:
      - web_net

networks:
  web_net:
    external: true

先手动新建onf/nginx.conf文件,如果这个内容启动不了, 可以不映射Volumes,先运行容器,然后进入Nginx容器内取出这个文件内容,手动新建之后再打开Volumes映射。

nginx.conf文件内容如下:

worker_processes 1;
events {
    worker_connections 1024;
}

http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;

    #gzip  on;
    server {
        listen 80;
        server_name 你的域名.cn;
        location / {
            root /usr/share/nginx/html/;
            index index.html index.htm;
        }
    }

    # HTTPS server
    server {
        listen 443 ssl;
        server_name selfteachingroad.cn;

        ssl_certificate /etc/nginx/conf.d/cert/你的域名证书.pem;
        ssl_certificate_key /etc/nginx/conf.d/cert/你的域名证书.key;

        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;

        ssl_session_cache shared:SSL:1m;

        fastcgi_param HTTPS on;
        fastcgi_param HTTP_SCHEME https;

        location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            root /usr/share/nginx/html;
            try_files $uri $uri/ /index.html;
        }
    }
    # 引入扩展配置(可以细分服务nginx)
    include /etc/nginx/conf.d/*.conf;
}

Nginx 配置多个静态网页站(子目录方式实现)

建立一个网站都要申请域名,如果在国内服务器,都要进行备案,备案的流程有点麻烦,所以一般拿到一个域名之后,就用这个域名进行多个网站项目的部署。

比如我申请了 yanggenjie.cn 这个域名,访问这个域名是我的主站,但是有时候有些文档我也想部署在线访问,一般都不会再去申请一个域名了,直接在这个域名之后加上子目录,比如https://yanggenjie.cn/wiki/HintCAD/,这种访问,或者子域名,比如: https://wiki.yanggenjie.cn。这样,但子域名的操作也是需要自己添加解析,还要申请SSL证书,比如申请泛域名的SSL证书,才能用https访问,操作起来也比较麻烦。(当然,有NginxProxyManager之后,这些麻烦都将不复存在)

二级目录的这种方式,只要主域名能正常访问,那只需要修改 Nginx 的配置,就能直接访问了。一般都不需要做过多的配置。

接下来,就说一下我的 Nginx 如何配置的二级目录(Nginx 是跑在 Docker 容器内的)。

html 是网站根目录,html 目录结构如下

|-- wiki
|   |-- HintCAD
|   `-- rstSyntax
`-- yanggenjie.cn
    |-- 404.html
    |-- about
    |-- assets
    |-- BIM\345\274\200\345\217\221
    |-- blog
    |-- index.html
    |-- python
    |-- search
    |-- sitemap.xml
    |-- sitemap.xml.gz
    |-- \345\215\232\345\256\242\346\212\200\346\234\257
    `-- \345\267\245\345\205\267

主站资源文件是放在 yanggenjie.cn 这个文件夹的,然后笔记文件单独放在 wiki 下的每个单独文件夹。

然后,Nginx 配置内容如下:

server {
    listen 80;
    server_name localhost;
    #  强制https跳转
    # return 301 https://$server_name$request_uri;
    location / {
        root /usr/share/nginx/html/yanggenjie.cn;
        index index.html index.htm;
    }
    location /wiki/HintCAD {
        alias /usr/share/nginx/html/wiki/HintCAD/;
        index index.html;
    }
    location /wiki/rstSyntax {
        alias /usr/share/nginx/html/wiki/rstSyntax/
        index index.html;
    }
}

第一个 location 是指,当我访问:yanggenjie.cn,后面什么都不带的时候,就去访问 html/yanggenjie.cn 这个文件夹下的所有内容

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

第二个 location 就是二级目录的设置了,指的是,当我访问 yanggenjie.cn/wiki/HintCAD/时,就会去访问/usr/share/nginx/html/wiki/HintCAD/下的资源。

    location /wiki/HintCAD/ {
        alias /usr/share/nginx/html/wiki/HintCAD/;
        index index.html;
    }

这样配置的话,就可以用二级目录来访问不同的资源了,

注意

注意,配置 location 时,链接代/和不带/,意义完全不一样。这里都要带上/才能正确访问。

这里有两个地方带斜杠和不带斜杠,一个是 location 外的路径,一个是 location 块内的 alias 路径

# 1.location后面的链接不带斜杠
# 访问的链接就可以写成:https://yanggenjie.cn/wiki/HintCAD
location /wiki/HintCAD {

}

# 2.location后面的链接带斜杠
# 访问链接的后面就必须带斜杠:https://yanggenjie.cn/wiki/HintCAD/,不带斜杠就访问不到
location /wiki/HintCAD/ {

}

# 3. location块内的内容中,alias路径不带斜杠
# 就说明当访问xx.cn/wiki/HintCAD这个路径时,实际会跳转到:alias+xx路径去找资源
# 即到服务器的/usr/share/nginx/html/wiki/HintCAD/wiki/HintCAD目录下寻找
# 这个路径一般都不是我们想要的
location /wiki/HintCAD {
    alias /usr/share/nginx/html/wiki/HintCAD;
    index index.html;
}

# 4.location块内,alisa带斜杠
# 就说明当访问xx.cn/wiki/HintCAD这个路径时,
# 会去服务器的/usr/share/nginx/html/wiki/HintCAD/目录下寻找资源
# 这个路径一般就是我们想要的
location /wiki/HintCAD {
    alias /usr/share/nginx/html/wiki/HintCAD/;
    index index.html;
}

# 这里应该是有个小坑,就是location的匹配链接是/wiki/HintCAD,
# 那么你alisa创建的目录最好也是要有wiki/HintCAD的目录结构
# 这个目录结构否则可能也会出现访问失效的情况

# 这个和1、2情进行组
# 这个表示,当访问https://yanggenjie.cn/wiki/HintCAD时,
# 会去服务器的/usr/share/nginx/html/wiki/HintCAD/wiki/HintCAD目录下寻找资源
# 注意我这里没有打错,就是有两个/wiki/HintCAD这个路径,第一个是alias路径,第二个是location块匹配的路径
location /wiki/HintCAD {
    alias /usr/share/nginx/html/wiki/HintCAD;
    index index.html;
}

# 这个访问https://yanggenjie.cn/wiki/HintCAD/时
# 资源同样是去服务器/usr/share/nginx/html/wiki/HintCAD/wiki/HintCAD目录下找资源
location /wiki/HintCAD/ {
    alias /usr/share/nginx/html/wiki/HintCAD;
    index index.html;
}

# 4. location块内的内容中,alias路径带斜杠
location /wiki/HintCAD {
    alias /usr/share/nginx/html/wiki/HintCAD/;
    index index.html;
}
# 这个表示访问https://yanggenjie.cn/wiki/HintCAD时,
# 会去服务器的/usr/share/nginx/html/wiki/HintCAD/目录下找资源。这个一般才是我们想要的效果

location /wiki/HintCAD/ {
    alias /usr/share/nginx/html/wiki/HintCAD/;
    index index.html;
}
# 这个表示访问https://yanggenjie.cn/wiki/HintCAD/时,(这个链接带有/)
# 会去服务器的/usr/share/nginx/html/wiki/HintCAD/目录下找资源。这个一般才是我们想要的效果

至此,按这种写法进行配置,一般就能正常访问了。

评论