前言
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