前后端都用得上的 Nginx 日常使用经验 nginx前后端分离部署

前后端都用得上的 Nginx 日常使用经验前言 nginx 是一个高性能的开源反向代理服务器和 web 服务器,一般用来搭建静态资源服务器、负载均衡器、反向代理,本文将分享其在 Windows/docker 中的

前言

Nginx 是一款高性能开源反向代理服务器和Web 服务器,通常用于构建静态资源服务器、负载均衡器和反向代理。本文介绍了它在Windows/docker 上的用法以及使用nssm 部署为服务。一个脚本,用于修复不安全的https 提示、局域网自定义域名以及一路上遇到的陷阱的问题。

特点

高性能:事件驱动的异步架构,可以处理大量同时连接。 静态资源服务器:部署前端静态页面和静态资源。 反向代理服务器:接收客户端请求并将其转发给后端服务。负载均衡和请求均衡和缓存等功能支持HTTPS

使用情况

配置到Project Services 的域名转发

外部网络入侵请求转发至局域网服务器

测试环境项目的https配置

需要了解nginx默认启动后会发生什么?

监听指定端口(默认80),拦截访问80端口的本地请求,并发送给nginx处理。 您可以添加配置以侦听另一个端口,甚至侦听80,但您也可以使用server_name指定不同的域名。可以通过更换主机来进行本地测试。要将域名请求转发到本地服务器,必须将域名解析为服务器IP。云提供商还应该关注安全组,例如Windows中是否打开防火墙以及是否需要设置规则。路径必须使用/或\\(例如,路径D:\\Software\\nginx-1.24.0\\ssl nginx)。conf 必须配置为D:/Software/nginx-1.24.0/ssl/或D:\\Software\\nginx-1.24.0\\ssl \\。

实践

准备

本文版本:v1.24.0

使用的端口:80 443

最基本的配置:1个服务器节点、1个域名配置。如果要添加其他配置,只需添加服务器节点即可。

工作进程1;

事件{

工人连接1024;

}

http{

服务器{

听80。

服务器名称本地主机;

错误页面500 502 503 504 /50x.html;

位置=/50x.html {

根html;

}

}

}

””

Windows 安装使用 nginx

安装运行

v1.24.0可以直接从官网下载。

下载后解压到D:\\Software\\nginx-1.24.0。

在目录输入框中打开cmd并运行“start nginx”。如果端口未被占用,访问localhost时会看到欢迎页面。

尝试更改配置:D:\\Software\\nginx-1.24.0\\confi\\nginx.conf 并添加文本返回。

添加文本和JSON 返回

服务器{.

#返回文本

位置/文本{

add_header 内容类型文本/纯文本;

return 200 \’这是一个纯文本响应。 \’;

}

#返回json

位置/json {

add_header 内容类型application/json;

return 200 \'{\’message\’: \’这是一个JSON 响应。 233\’}\’;

}

#默认分配

位置/{

根html;

索引index.htmlindex.htm;

}

#.}

””

域名配置

由于要在本地进行测试,因此需要访问nginx并使用域名配置主机(服务器的外网域名配置会将域名解析到服务器上)。

添加记录: 127.0.0.1 \”nginx.devops.test.com\” 当访问nginx.devops.test.com 时,默认情况下会询问nginx 默认设置,nginx 监听localhost:80 并返回content 。指定的。

如果添加服务器配置节点并在重新加载配置后访问它,您将看到配置的内容可见。

服务器{

听80。

服务器名称nginx.devops.test.com;

位置/{

add_header 内容类型文本/纯文本;

返回200 \’nginx.devops.test.com\’。

}

}

””

![](https://img-blog.csdnimg.cn/img_convert/fe4652e27f8e261cf5369c33ce9bb115.png)

![](https://img-blog.csdnimg.cn/img_convert/d2c35ad0a8c672eeee9d698cdd92edec.png)

根据您的浏览器的工作方式,它可能会默认跳转到https 并且可能不会显示协议,因此您需要手动更改它。

SSL 证书申请

个人项目一般可以使用免费证书给自己的网站加锁(数据传输隐私),但有通配符、有效期、安全性等限制。企业通常使用可以购买的付费证书。通常还会提供来自云提供商的免费证书。迄今为止使用的另外两个免费证书是:

在线网站申请:freessl允许您根据需要申请免费/付费证书。这还包括证书管理和到期通知等服务。 win-acme 是一个免费的开源工具,用于在Windows 上自动获取和续订Let\’s Encrypt 证书。命令

如果您需要在本地使用https,您还可以通过nginx配置证书来锁定您的应用程序。使用上述两种方法生成服务器证书配置。请参阅下面的配置。

nginx 本地配置 https

使用openssl 生成自签名证书(您将收到一条消息,表明它不安全,请在下一步中解决)

#按顺序运行并输入信息。这里我输入“ym”。

openssl genrsa -out server.key 1024

openssl req -new -keyserver.key -outserver.csr

openssl genrsa -out ca.key 1024

openssl req -new -key ca.key -out ca.csr

openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt

openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -inserver.csr -outserver.crt

从照片中可以看到,已经添加了https。为什么第一次就被拦截了,这是浏览器机制的问题。经过一夜的寻找,我找到了解决方案的来源。 stackoverflow 详细步骤解释如下。

生成CA证书(目录:D:/Software/nginx-1.24.0/ssl)

winpty openssl genrsa -des3 -out myCA.key 2048

winpty openssl req -x509 -new -nodes -key myCA.key -sha256 -days 1825 -out myCA.pem

””

将myCA.pem 证书导入受信任的根证书颁发机构(使用Win+R 打开:certlm.msc)

创建CA签名证书(为每个域名创建单独的证书)

winpty openssl genrsa -out nginx.devops.test.com.key 2048

winpty openssl req -new -key nginx.devops.test.com.key -out nginx.devops.test.com.csr

创建X509 V3证书扩展配置文件nginx.devops.test.com。扩大

AuthorityKeyIdentifier=密钥ID,颁发者

基本约束=CA:FALSE

keyUsage=数字签名、不可否认性、密钥加密、数据加密

subjectAltName=@alt_names

[备用名称]

DNS.1=nginx.devops.test.com

””

生成证书

winpty openssl x509 -req -in nginx.devops.test.com.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial -out nginx.devops.test.com.crt -days 825 -sha256 -extfile nginx.devops。 test.com.ext

””

设置nginx

服务器{

听80。

443 监听SSL。

服务器名称nginx.devops.test.com;

ssl_certificate D:/software/nginx-1.24.0/ssl/nginx.devops.test.com.crt;

ssl_certificate_key D:/software/nginx-1.24.0/ssl/nginx.devops.test.com.key;

ssl_session_cache 共享:SSL:1m;

ssl_session_timeout 5 分钟;

ssl_ciphers HIGH:aNULL:MD5;

ssl_prefer_server_ciphers 已打开。

位置/{

add_header 内容类型文本/纯文本;

返回200 \’nginx.devops.test.com666\’。

}

}

””

成功了。不再有危险的话语

如果您想从局域网内的其他机器访问,还需要执行步骤2导入myCA.pem证书并配置相应的主机。

使用 nssm 创建 nginx 服务

更改设置后,每次都必须输入命令并重新启动计算机,这显然很不方便,因此需要部署nginx服务。

我没有将Windows 计划任务设置为在启动时启动,而是使用nssm(一种服务封装程序,可以轻松地将程序封装到Windows 服务中并运行它们)来管理我习惯于创建.

下面是两个脚本以及如何使用它们快速创建服务。这两个脚本允许您为应用程序创建服务,并通过简单地更改相应的路径在启动时自动启动它们。

添加启动nginx的脚本start.bat

进入nginx目录(D:\\Software\\nginx-1.24.0\\start.bat),删除nginx进程,然后重启。 在测试环境中使用。不建议在生产中直接使用@echo off。

cd /d %~dp0

echo 杀死nginx

taskkill /fi \’镜像名称eq nginx.EXE\’ /f

回显启动nginx

启动nginx

echo 启动nginx成功

暂停

下载nssm v2.24 并将start.bat 脚本配置为服务。

下载后解压:D:\\Software\\nssm\\nssm-2.24\\win64

将Nginx-service.bat 添加到您的目录中以轻松创建并启动您的nginx 服务,根据需要更改服务名称和nginx 启动脚本路径。

@回声关闭

cd /d %~dp0

NSSM 停止Nginx 服务

nssm 删除Nginx 服务检查

nssm 安装Nginx-service D:\\Software\\nginx-1.24.0\\start.bat

sc 启动Nginx 服务

暂停

以管理员身份运行以创建并启动服务。

此时,“重新启动计算机”服务也会自动启动,您也可以通过重新启动该服务来重新启动应用程序。

常用命令

启动:启动nginx

重新加载配置:如果遇到nginx -s reload错误,请按Ctrl+F5刷新浏览器以确保正常运行。

停止nginx(删除nginx 进程):taskkill /fi \’imagename eq nginx.EXE\’ /f

在Windows上使用nginx时,可能会启动多个nginx进程,无论有没有问题。最终,唯一的选择是删除该进程。请重新开始。

使用 Docker Compose 安装 nginx

本文基于Docker V24 和Docker Compose V2。有关安装信息,请参阅上一篇文章。

配置说明

镜像版本:nginx:1.24.0

指定端口:80443

指定时区:TZ : \’亚洲/上海\’,在日志文件中显示北京时间

指定挂载目录

./config/nginx.conf:/etc/nginx/nginx.conf:默认配置文件conf.d。/config/conf.d:/etc/nginx/conf.d:自定义配置文件加载配置。 /usr/share/nginx/html:默认静态文件目录。 /logs:/var/log/nginx:默认日志目录。 /ssl:/ssl:证书目录。要指定配置重新加载,请在配置中使用/ssl/xxx。 docker exec nginx_1_24 nginx -s 重新加载

指定网络:devopsnetwork(docker network create devopsnetwork)

目录结构

配置文件 compose.yml

将准备好的compose.yml 配置ssl html 复制到服务器并运行docker compose up -d。

版本:“3.1”

服务:

nginx:

图像: nginx:1.24.0

容器名称: nginx_1_24

总是重新启动:

环境:

TZ :“亚洲/上海”

端口:

– “80:80”

– “443:443”

第:卷

– ./config/nginx.conf:/etc/nginx/nginx.conf

– ./config/conf.d:/etc/nginx/conf.d

– ./html:/usr/share/nginx/html

– ./logs:/var/log/nginx

– ./ssl:/ssl

网络:

-devops网络

网络:

devopsnetwork:

外部: 真实

默认的 nginx.conf v1.24

用户nginx。

工人流程自动化;

error_log /var/log/nginx/error.log 通知;

pid /var/run/nginx.pid;

事件{

工人连接1024;

}

http{

包括/etc/nginx/mime.types。

默认类型应用程序/八位字节流;

log_format main \’$remote_addr – $remote_user [$time_local] \’$request\’ \’

\’$status $body_bytes_sent \’$http_referer\’ \’

\’\’$http_user_agent\’ \’$http_x_forwarded_for\’;

access_log /var/log/nginx/access.log main;

发送文件。

#tcp_no 继续推送;

保活超时65;

#打开gzip。

包括/etc/nginx/conf.d/*.conf。

}

自定义配置 conf.d/default.conf

将之前的Windows配置部分更改为default.conf,如下所示。

服务器{

听80。

443 监听SSL。

服务器名称nginx.devops.test.com;

ssl_certificate /ssl/nginx.devops.test.com.crt;

ssl_certificate_key /ssl/nginx.devops.test.com.key;

ssl_session_cache 共享:SSL:1m;

ssl_session_timeout 5 分钟;

ssl_ciphers HIGH:aNULL:MD5;

ssl_prefer_server_ciphers 已打开。

位置/{

add_header 内容类型文本/纯文本;

返回200 \’nginx.devops.test.com 001\’。

}

}

创建证书 ssl 目录

上传生成的ssl证书或者在Linux上使用上面的openssl方法重新生成域名证书并在本地添加pem证书即可使用https。

Nginx 的应用

在上一篇文章中,我们安装了Apollo、RabbitMQ以及各种常用的数据库。接下来,使用nginx为您的应用程序配置域名转发,以便每个应用程序都可以通过其域名访问,而无需使用IP +端口。这样,如果您的应用程序稍后部署并且/IP、发送端口发生变化,您只需要更改nginx转发设置即可。

本地使用域名前的配置

如果您想使用自定义域名访问局域网内的应用程序,则必须先配置hosts文件。这里,host用于向目标服务器192.168.123.214发送域名请求。

192.168.123.214 apollo.devops.test.com

192.168.123.214 Rabbitmq.devops.test.com

您还可以搭建DNS服务,配置本机的DNS,指定DNS将域名请求解析到对应的服务,实现泛解析。

Apollo 的转发配置

Apollo面板地址:http://192.168.123.214:8070/

设置域名:apollo.devops.test.com

根据您的服务器配置,两者都属于同一网络,并且可以使用容器名称和端口进行访问。

服务器{

听80。

服务器名称apollo.devops.test.com;

位置/{

proxy_pass http://apollo_portal_2_1:8070/;

#上游主机名

proxy_set_header 主机$host;

#客户端发送的原始主机名

#proxy_set_header 主机$http_host;

proxy_set_header X-真实IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-Proto $scheme;

}

}

””

Apollo配置https并将http重定向到https。

服务器{

听80。

服务器名称apollo.devops.test.com;

返回值301 https://$host$request_uri;

}

服务器{

443 监听SSL。

服务器名称apollo.devops.test.com;

ssl_certificate /certs/apollo.devops.test.com/server.crt;

ssl_certificate_key /certs/apollo.devops.test.com/server.key;

ssl_session_cache 共享:SSL:1m;

ssl_session_timeout 5 分钟;

ssl_ciphers HIGH:aNULL:MD5;

ssl_prefer_server_ciphers 已打开。

位置/{

proxy_pass http://apollo_portal_2_1:8070/;

代理人

_set_header host $http_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;
}
}
“`

RabbitMQ 的转发配置

RabbitMQ 面板地址:http://192.168.123.214:15672/#/
设定域名:rabbitmq.devops.test.com
对应 server 配置,因为同属一个网络,所以使用容器名加端口访问即可
server {
listen 80;
server_name rabbitmq.devops.test.com;
location / {
proxy_pass http://rabbitmq_3_12:15672/;
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;
}
}
“`
RabbitMQ 配置 https,并重定向 http 到 https
server {
listen 80;
server_name rabbitmq.devops.test.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name apollo.devops.test.com;
ssl_certificate /certs/apollo.devops.test.com/server.crt;
ssl_certificate_key /certs/apollo.devops.test.com/server.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://apollo_portal_2_1:8070/;
proxy_set_header host $http_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;
}
}
“`

相关脚本汇总

脚本本地目录预览,添加了系统判断 linux,执行需要给要执行的脚本添加执行权限:chmod +x ./01.build-pem.sh

nginx-start.bat :删除 nginx 进程并启动 nginx 服务
@echo off
cd /d %~dp0
echo kill nginx
taskkill /fi \”imagename eq nginx.EXE\” /f
echo start nginx
start nginx
echo start nginx success
pause
“`
nginx-nssm-service.bat 创建 nginx 服务脚本
@echo off
cd /d %~dp0
nssm stop Nginx-service
nssm remove Nginx-service confirm
nssm install Nginx-service D:\\Software\\nginx-1.24.0\\start.bat
sc start Nginx-service
pause
“`
01.build-pem.sh 创建自签证书
#!/bin/sh
# 生成根证书,访问客户端需要安装导入 myCA.pem,根据myCA.key,myCA.pem再生成nginx需要的证书
if uname | grep -q \”MINGW\”; then
winpty openssl genrsa -out myCA.key 2048
winpty openssl req -x509 -new -nodes -key myCA.key -days 1825 -out myCA.pem
else
openssl genrsa -out myCA.key 2048
openssl req -x509 -new -nodes -key myCA.key -days 1825 -out myCA.pem
fi
“`
02.build-ssl.sh 创建域名证书
#!/bin/bash
if [ \”$#\” -ne 1 ]; then
echo \”Usage: Must supply a domain\”
exit 1
fi
DOMAIN=$1
mkdir $DOMAIN
#!/bin/sh
if uname | grep -q \”MINGW\”; then
winpty openssl genrsa -out $DOMAIN/server.key 2048
winpty openssl req -new -key $DOMAIN/server.key -out $DOMAIN/server.csr
else
openssl genrsa -out $DOMAIN/server.key 2048
openssl req -new -key $DOMAIN/server.key -out $DOMAIN/server.csr
fi
cat >$DOMAIN/server.ext <<EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = $DOMAIN
EOF
if uname | grep -q \”MINGW\”; then
winpty openssl x509 -req -in $DOMAIN/server.csr -CA ./myCA.pem -CAkey ./myCA.key -CAcreateserial -out $DOMAIN/server.crt -days 36500 -extfile $DOMAIN/server.ext
else
openssl x509 -req -in $DOMAIN/server.csr -CA ./myCA.pem -CAkey ./myCA.key -CAcreateserial -out $DOMAIN/server.crt -days 36500 -extfile $DOMAIN/server.ext
fi
“`
03.gen.sh 先创建自签证书,再执行 gen.sh 生成需要的域名证书,配置到 nginx 即可

#!/bin/bash
# 获取当前脚本所在目录
script_dir=$(dirname \”$0\”)
sh $script_dir/02.build-ssl.sh nginx.devops.test.com
sh $script_dir/02.build-ssl.sh apollo.devops.test.com
sh $script_dir/02.build-ssl.sh rabbitmq.devops.test.com
“`

踩过的坑

Windows 环境 nginx -s reload 后多个 nginx 进程

目前只能通过taskkill /fi \”imagename eq nginx.EXE\” /f删除进程再启动

Windows 中使用 openssl 需要添加前缀 winpty openssl

一开始是执行 openssl genrsa -out server.key 2048命令卡死

后面找到一篇文章说是 git bash 密码的问题,加了密码参数确实可以了:openssl genrsa -des3 -out myCA.key -passout pass:mima 2048但是后续使用 openssl req还是卡死,

最后解决自签证书授信的时候才发现是需要加上 winpty 使用才是正解

本地自签证书配置 https 浏览器依旧提示不安全

生产对应域名的证书,并在客户端安装证书,找到的 解决方案 ,以及思路来源 stackoverflow

容器中 nginx.conf 默认配置问题

不同的版本可能默认配置不一样,可以先不挂载配置把容器的默认配置文件复制出来,在默认配置基础上进行修改,可少走弯路。尤其如果是将 Windows 上面 的配置修改到容器中,需要注意路径问题。

比如 windows 中配置静态站点根目录:root html;,在容器中则需要配置为root /usr/share/nginx/html;才生效

容器中重载配置

docker exec nginx_1_24 nginx -s reload

相关文档

Nginx 下载页nssm 下载页局域网配置 https 参考

后语

一直都是用到了就搜索,此番整理,加深使用,以备后用
最深刻的是本篇对局域网自定义域名不安全https提示问题的解决,简直赏心悦目。

#以上关于前后端都用得上的 Nginx 日常使用经验的相关内容来源网络仅供参考,相关信息请以官方公告为准!

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/93741.html

Like (0)
CSDN的头像CSDN
Previous 2024年7月26日
Next 2024年7月26日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注