一、Nginx反向代理的作用​

Nginx反向代理服务,可以代理接收请求,并把请求转发到设置好的其他服务器上。

例如,Nginx服务器为 100.101.102.103,A服务为 100.101.102.104 ,通过Nginx配置文件,可以是Nginx服务器代理接收A服务的请求,然后转发到A服务上。

通过SSL证书配置可以是Nginx具有接收Https的能力,然后通过http转发到A服务上;

或者接收Http请求,通过Nginx配置,强制转成Https请求转发到A服务上。

Nginx可以代理多个服务。

本文使用的是windows系统服务器操作,SSL证书为腾讯云的免费SSL(下文有详细步骤)。​

一、安装Nginx

Nginx下载官网地址:http://nginx.org/en/download.html

此次使用的是1.18.0版本。

windows系统配置Nginx使用SSL证书实现Https反向代理_https

下载后找位置解压

windows系统配置Nginx使用SSL证书实现Https反向代理_https_02

然后在该目录下运行命令窗口(可以在文件夹地址栏输入cmd进入)

windows系统配置Nginx使用SSL证书实现Https反向代理_nginx_03

输入nginx.exe回车提示报错

windows系统配置Nginx使用SSL证书实现Https反向代理_nginx_04

nginx: [emerg] CreateDirectory() "E:\tools\Nginx\nginx-1.18.0/temp/client_body_temp" failed (3: The system cannot find the path specified)

原因是没有在nginx目录里找到temp文件夹,手动新建一个。

windows系统配置Nginx使用SSL证书实现Https反向代理_nginx_05

重新启动,浏览器输入localhsot 进入nginx页面成功即为安装成功!

windows系统配置Nginx使用SSL证书实现Https反向代理_nginx_06

二、申请SSL证书

腾讯云可以申请域名型免费SSL ​腾讯云​

windows系统配置Nginx使用SSL证书实现Https反向代理_ssl_07

立即购买

windows系统配置Nginx使用SSL证书实现Https反向代理_ssl证书_08

windows系统配置Nginx使用SSL证书实现Https反向代理_ssl_09

上面需要注意的提示为:仅支持绑定一个二级域名或者子域名,例如 tencent.com、cloud.tencent.com、dnspod.cloud.tencent.com的其中之一 。

也就是说申请的一个SSL只能绑定一个域名,但是可以多次申请绑定域名的二级域名或者子域名。

可以根据需要绑定域名或者二级域名或者子域名。例如我们申请的SSL所绑定的域名为 test.com

windows系统配置Nginx使用SSL证书实现Https反向代理_ssl_10

下一步需要解析验证,就是在域名所在的网站上根据腾讯云给出的参数去解析一条记录,来证明这个域名的使用权。

windows系统配置Nginx使用SSL证书实现Https反向代理_nginx_11

windows系统配置Nginx使用SSL证书实现Https反向代理_腾讯云_12

例如我的域名是在美橙互联上,地址:​https://www.cndns.com​

windows系统配置Nginx使用SSL证书实现Https反向代理_ssl证书_13

则需要在域名解析这里添加一条记录,主机名填写腾讯云提供的主机记录字段,记录类型选择TXT,记录值填写腾讯云提供的记录值字段。

然后保存后等待生效,一般在一个半小时内,然后等待腾讯云签发即可。​

windows系统配置Nginx使用SSL证书实现Https反向代理_腾讯云_14

在证书详情里下载证书文件

windows系统配置Nginx使用SSL证书实现Https反向代理_腾讯云_15

windows系统配置Nginx使用SSL证书实现Https反向代理_腾讯云_16

三、Nginx配置SSL证书实现Https代理

实现代理接收https请求,把请求转发到其他服务的http接口上。

(例如服务A在100.101.102.104:8080上,只允许http访问,nginx 服务在 100.101.102.103:8080 上,通过nginx配置SSL证书来实现接口https的请求,然后把请求代理发送http请求到A服务上)。

把 test.com.key 和 test.com_bundle.crt 两个文件放到nginx安装目录下的conf目录里(和nginx.conf放一起)

修改 nginx.conf 配置文件:​

#user  nobody;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;

events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;

sendfile on;

keepalive_timeout 65;

#gzip on;

server {
listen 81;
server_name test.com;

return 301 https://$host$request_uri;

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

# HTTPS server
#
server {
listen 8080 ssl; # nginx所使用的端口
server_name test.com; # SSL 证书绑定的域名

ssl_certificate test.com_bundle.crt;
ssl_certificate_key test.com.key;

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

ssl_ciphers CDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;

location / {
proxy_pass http://100.101.102.104:8080; # 需要转发到的服务地址 A服务的地址
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
}
}
}

重启nginx或者刷新nginx配置文件即可。

四、测试

例如A服务有一个接口为:http://100.101.102.104:8080/login/index

则测试https://test.com/login/index

看是否和http://100.101.102.104:8080/login/index访问一致。​