nginx前端、后端、docker-compose部署,基本配置

静态文件部署

Nginx的配置文件位于/etc/nginx/nginx.conf,可以使用文本编辑器打开进行编辑。需要修改的配置项包括:

- server:定义一个虚拟主机,用来处理客户端请求。

- location:定义请求的URL路径和对应的处理方式。

- root:指定网站根目录,即前端项目的打包输出目录。

例如,以下是一个简单的Nginx配置文件:

http {
    server {
        listen 80;
        server_name Example Domain;

        location / {
            root /var/www/example/dist;
            index index.html;
        }
    }
}

上述配置中,监听80端口,当请求http://example.***时,会将请求转发到/var/www/example/dist目录下,并返回index.html文件。

前端项目部署

  1. 需要先进行打包操作。通常情况下,前端项目使用Webpack等工具进行打包,将源代码转换为静态文件。
  2. 打包后的文件一般存放在dist目录下
  3. 将打包后的前端项目文件复制到Nginx指定的网站根目录下(如配置文件中的/var/www/example/dist目录)。
  4. 在浏览器中访问example.***,即可看到前端项目的页面。
http {
    server {
        listen 80;
        server_name Example Domain;

        location / {
            root /var/www/example/dist;
            index index.html;
        }
    }
}

后端项目部署

主要是用于反向代理,如SpringBoot项目,可通过tomcat服务部署项目,再通过nginx作反向代理,前端项目通过nginx部署,Nginx 作为网关,负责监听统一端口,转发前端资源请求和后端接口请求。

http {
    server {
        listen 80;
        # 服务器名称,_表示匹配所有域名
        server_name _;

     # 后端接口代理配置,需要与前端配置的后端接口根路径保持一致
     
    location /admin-api {
        # 代理设置:
        # 传递原始Host头信息,将Host的值赋值给变量$host,可用于给nginx日志使用,以下同理
        proxy_set_header Host $host;
        # 传递客户端真实IP地址
        proxy_set_header X-Real-IP $remote_addr;
        # 传递客户端IP地址链
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 传递原始请求协议
        proxy_set_header X-Forwarded-Proto $scheme;
        # 代理到后端服务
        proxy_pass http://127.0.0.1:8000;
    }
}

则,访问:http://127.0.0.1/admin-api ,就是访问:http://127.0.0.1:8000/admin-api

HTTPS配置

http {

    server {
        listen 443 ssl;
        server_name Example Domain;

        ssl_certificate /path/to/cert.pem;
        ssl_certificate_key /path/to/key.pem;

        location / {
            root /var/www/example/dist;
            index index.html;
        }
    }
}
  1. 首先监听80端口,将HTTP请求重定向到HTTPS协议。
  2. 然后监听443端口,使用SSL证书提供HTTPS服务。
  1. 需要注意的是,SSL证书需要从CA机构购买或自己生成,
  2. 可以使用Certbot等工具自动获取免费证书。
  3. 还需要开启防火墙的443端口,以允许外部访问HTTPS服务。

负载均衡

http {
    upstream backend {
        server 127.0.0.1:8080;
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
    }

    server {
        listen 80;
        server_name Example Domain;

        location / {
            proxy_pass http://backend;
        }
    }
}

上述配置中

  1. 使用upstream定义了一个名为backend的负载均衡服务器组,包含了三个Nginx实例
  2. 然后在server中使用proxy_pass将请求转发到backend组中的任意一台Nginx实例上

需要注意的是,负载均衡的配置需要考虑到多个Nginx实例之间的会话保持和请求转发策略,以确保请求能够正确地分发到各个实例,并且在实例之间能够正确地共享会话信息

缓存

Nginx还可以作为缓存服务器,提高应用程序的性能

  1. 当应用程序处理静态资源或者动态页面时,Nginx可以将这些资源缓存起来,避免重复的计算和网络传输。
http {
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;
    
    server {
        listen 80;
        server_name Example Domain;

        location / {
            proxy_pass http://backend;
            proxy_cache my_cache;
            proxy_cache_valid 200 60m;
        }
    }
}

上述配置中,

  1. 使用proxy_cache_path定义了一个名为my_cache的缓存路径,
  2. 并设置缓存的过期时间为60分钟
  3. 然后在server中的location中使用proxy_cache指定使用my_cache缓存组,
  4. 并使用proxy_cache_valid设置缓存的有效期。

高可用配置

Nginx配置高可用(Nginx+keepalived) - wenxuehai - 博客园

docker部署

1. 准备好nginx配置文件,以下为python项目部署的配置文件示例:

# 定义运行Nginx的用户和用户组,默认为nobody
#user  nobody;

# 指定Nginx工作进程数,通常设置为CPU核心数
worker_processes  1;

# 定义全局错误日志文件路径和级别
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

# 指定进程ID文件的位置
#pid        logs/nginx.pid;


# events块用于配置影响Nginx服务器或与用户的网络连接
events {
    # 设置单个工作进程最大并发连接数
    worker_connections  1024;
}


# http块用于配置HTTP服务器相关设置
http {
    # 包含MIME类型定义文件
    include       mime.types;
    
    # 默认文件类型
    default_type  application/octet-stream;

    # 定义请求速率限制规则:
    # $binary_remote_addr: 以二进制格式存储客户端IP地址
    # zone=api_rate:10m: 定义一个名为api_rate的共享内存区域,大小为10MB
    # rate=15r/s: 限制每个IP每秒最多15个请求
    limit_req_zone $binary_remote_addr  zone=api_rate:10m  rate=15r/s;
    
    # 定义连接数限制规则:
    # $binary_remote_addr: 以二进制格式存储客户端IP地址
    # zone=api_conn:10m: 定义一个名为api_conn的共享内存区域,大小为10MB
    limit_conn_zone $binary_remote_addr zone=api_conn:10m;

    # 定义日志格式,用于记录限流事件
    log_format  blocked  '$remote_addr - $http_user_agent [LIMIT]';

    # 定义主要的访问日志格式(已注释)
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    # 设置访问日志文件路径和格式(已注释)
    #a***ess_log  logs/a***ess.log  main;

    # 开启高效文件传输模式
    sendfile        on;
    
    # 配合sendfile使用,防止网络阻塞(已注释)
    #tcp_nopush     on;

    # 设置客户端连接保持活动的超时时间(已注释)
    #keepalive_timeout  0;
    
    # 设置客户端连接保持活动的超时时间为65秒
    keepalive_timeout  65;

    # 开启gzip压缩(已注释)
    #gzip  on;

    # server块定义虚拟主机配置
    server {
        # 监听80端口
        listen 80;
        
        # 服务器名称,_表示匹配所有域名
        server_name _;
        
        # 配置/weather/路径的处理规则
        location /weather/ {
            # 连接数限制(单IP≤20并发)
            limit_conn api_conn 20;
            
            # 请求速率限制(15r/s + 允许突发30请求)
            limit_req zone=api_rate burst=30 nodelay;
            
            # 触发限流时记录特殊日志
            a***ess_log /var/log/nginx/blocked.log blocked;
            
            # 返回429时携带重试时间
            limit_req_status 429;
            add_header Retry-After 10 always;
            
            # 代理设置:
            # 传递原始Host头信息
            proxy_set_header Host $host;
            
            # 传递客户端真实IP地址
            proxy_set_header X-Real-IP $remote_addr;
            `` `
            # 传递客户端IP地址链
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            
            # 传递原始请求协议
            proxy_set_header X-Forwarded-Proto $scheme;
            
            # 代理到后端服务
            proxy_pass http://hefeng-api:8000;

        }

        # 配置/sweetTalk路径的处理规则
        location /sweetTalk {
            # 连接数限制(单IP≤20并发)
            limit_conn api_conn 20;
            
            # 请求速率限制(15r/s + 允许突发30请求)
            limit_req zone=api_rate burst=30 nodelay;
            
            # 触发限流时记录特殊日志
            a***ess_log /var/log/nginx/blocked.log blocked;
            
            # 返回429时携带重试时间
            limit_req_status 429;
            add_header Retry-After 10 always;
            
            # 代理设置:
            # 传递原始Host头信息
            proxy_set_header Host $host;
            
            # 传递客户端真实IP地址
            proxy_set_header X-Real-IP $remote_addr;
            
            # 传递客户端IP地址链
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            
            # 传递原始请求协议
            proxy_set_header X-Forwarded-Proto $scheme;
            
            # 代理到后端服务
            proxy_pass http://hefeng-api:8000;

        }
    

        # 定义404错误页面(已注释)
        #error_page  404              /404.html;

        # 将服务器错误页面重定向到静态页面/50x.html
        #
        error_page   500 502 503 504  /50x.html;
        
        # 配置50x错误页面的具体路径
        location = /50x.html {
            root   html;
        }

        # 代理PHP脚本到监听127.0.0.1:80的Apache服务器(示例,已注释)
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # 将PHP脚本传递给监听127.0.0.1:9000的FastCGI服务器(示例,已注释)
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # 拒绝访问.hta***ess文件(示例,已注释)
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # 另一个使用IP、名称和端口混合配置的虚拟主机示例(已注释)
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS服务器配置示例(已注释)
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

2. docker-***pose.yml配置

version: '3.8'  # 指定 Docker ***pose 文件格式版本为 3.8

services:  # 定义服务
  hefeng-api:  # 定义名为 hefeng-api 的服务
    build:  # 构建镜像的配置
      context: .  # 构建上下文为当前目录
      dockerfile: Dockerfile  # 使用当前目录下的 Dockerfile 文件
    env_file:  # 指定环境变量文件
      - .env  # 使用当前目录下的 .env 文件
    environment:  # 设置环境变量
      - PORT=8000  # 设置 PORT 环境变量为 8000
    volumes:  # 挂载卷
      - .:/app  # 将当前目录挂载到容器的 /app 目录
    restart: unless-stopped  # 重启策略:除非手动停止,否则自动重启
    expose:  # 暴露端口(仅对链接的服务可见)
      - 8000 
    ***works:  # 指定网络
      - app-***work  # 使用名为 app-***work 的网络

  nginx:  # 定义名为 nginx 的服务
    image: nginx:alpine  # 使用 nginx:alpine 镜像
    ports:  # 端口映射
      - "8012:80"  # 将主机的 8012 端口映射到容器的 80 端口
    volumes:  # 挂载卷
      - ./nginx.conf:/etc/nginx/nginx.conf  # 将当前目录下的 nginx.conf 文件挂载到容器的 /etc/nginx/nginx.conf

    depends_on:  # 依赖关系
      - hefeng-api  # 依赖 hefeng-api 服务
    ***works:  # 指定网络
      - app-***work  # 使用名为 app-***work 的网络

***works:  # 定义网络
  app-***work:  # 定义名为 app-***work 的网络
    driver: bridge  # 使用 bridge 驱动

nginx配置:

  1. 镜像设置
image: nginx:alpine  # 使用 nginx:alpine 镜像
  1. 配置映射的端口,8012:80,冒号右边的端口号要与nginx.conf的监听端口保持一致
ports:  # 端口映射
      - "8012:80"  # 将主机的 8012 端口映射到容器的 80 端口
  1. nginx.conf要复制到nginx容器内,
volumes:  #将当前目录下的nginx.conf,复制到nginx在linux的默认路径下覆盖初始的nginx.conf
      - ./nginx.conf:/etc/nginx/nginx.conf
  1. 依赖服务,nginx可通过服务名(hefeng-api)访问docker-***pose.yml里的这个服务的ip,比如ping hefeng-api 就是 ping hefeng-api服务的ip地址
depends_on:  # 依赖关系
      - hefeng-api  # 依赖 hefeng-api 服务
# 对应nginx.conf的这个部分内容,通过http://hefeng-api加上hefeng-api服务对外暴露的端口号
# 就可以访问到这个服务了
proxy_pass http://hefeng-api:8000;
  1. 网络设置,主要是针对服务之间的网络设置,app-***work是网络配置的网络名称
***works:  # 指定网络
      - app-***work  # 使用名为 app-***work 的网络
#网络设置对应如下,brige就是同一网段的意思,只要是用了这个app-***work网络的,docker在创建容器
#时会自动分配同网段IP
***works:  # 定义网络
  app-***work:  # 定义名为 app-***work 的网络
    driver: bridge  # 使用 bridge 驱动

3. 部署

1. 复制含docker-***pose.yml的整个项目目录到服务器
2. 在服务器中,进到该目录下
3. 输入命令
docker-***pose up -d

4. 等待服务安装,安装完毕后,输入命令,可查看服务运行状态
docker ps

5. 如果nginx或者项目有问题,重新配置以后,需关闭容器,输入命令
docker-***pose down

6. 涉及修改的内容的镜像最好删除
docker rm 镜像名称

7. 然后重新构建服务,输入命令:
 docker-***pose build --no-cache
 docker-***pose up -d
 

4. 常用命令

4.1. 查看容器日志:
docker logs 容器名称/容器id前3位
4.2. 操作容器:
docker-***pose exec 容器名称/容器id前3位 执行命令

# 示例1:在nginx容器执行命令:curl http://hefeng-api:8000/weather/
docker-***pose exec nginx curl http://hefeng-api:8000/weather/

# 示例2:在nginx容器执行命令:cd /etc/
docker-***pose exec nginx cd /etc/
4.3. 查看配置的docker网络:
docker ***work ls
4.4. 查看某个docker网络的详细配置信息
docker ***work inspect docker网络名称
转载请说明出处内容投诉
CSS教程网 » nginx前端、后端、docker-compose部署,基本配置

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买