静态文件部署
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文件。
前端项目部署
- 需要先进行打包操作。通常情况下,前端项目使用Webpack等工具进行打包,将源代码转换为静态文件。
- 打包后的文件一般存放在dist目录下。
- 将打包后的前端项目文件复制到Nginx指定的网站根目录下(如配置文件中的/var/www/example/dist目录)。
- 在浏览器中访问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;
}
}
}
- 首先监听80端口,将HTTP请求重定向到HTTPS协议。
- 然后监听443端口,使用SSL证书提供HTTPS服务。
- 需要注意的是,SSL证书需要从CA机构购买或自己生成,
- 可以使用Certbot等工具自动获取免费证书。
- 还需要开启防火墙的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;
}
}
}
上述配置中
- 使用upstream定义了一个名为backend的负载均衡服务器组,包含了三个Nginx实例。
- 然后在server中使用proxy_pass将请求转发到backend组中的任意一台Nginx实例上。
需要注意的是,负载均衡的配置需要考虑到多个Nginx实例之间的会话保持和请求转发策略,以确保请求能够正确地分发到各个实例,并且在实例之间能够正确地共享会话信息。
缓存
Nginx还可以作为缓存服务器,提高应用程序的性能。
- 当应用程序处理静态资源或者动态页面时,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;
}
}
}
上述配置中,
- 使用proxy_cache_path定义了一个名为my_cache的缓存路径,
- 并设置缓存的过期时间为60分钟。
- 然后在server中的location中使用proxy_cache指定使用my_cache缓存组,
- 并使用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配置:
- 镜像设置
image: nginx:alpine # 使用 nginx:alpine 镜像
- 配置映射的端口,8012:80,冒号右边的端口号要与nginx.conf的监听端口保持一致
ports: # 端口映射
- "8012:80" # 将主机的 8012 端口映射到容器的 80 端口
- nginx.conf要复制到nginx容器内,
volumes: #将当前目录下的nginx.conf,复制到nginx在linux的默认路径下覆盖初始的nginx.conf
- ./nginx.conf:/etc/nginx/nginx.conf
- 依赖服务,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;
- 网络设置,主要是针对服务之间的网络设置,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网络名称