引言
公司只有一个公网IP,要实现将多个域名的https请求转发到内部。
例如:
https://www.example.com 转发至内网192.168.0.10服务器443端口
https://www.test.com 转发至内网192.168.0.20服务器443端口
配置dns解析
我是在阿里云上购买的域名,所以就直接在阿里云云解析DNS工作台下配置了对应域名解析,具体操作可以看阿里云相关文档。
配置将https://www.example.com 和 https://www.test.com转发到公司主路由器443端口,然后将443端口的请求转发到指定nginx服务器。
SSL证书
建议直接上阿里云,每个账号可以有20个免费的证书,申请之后下载nginx对应的压缩包即可。
自签的证书也可以 。
配置nginx
增加多个server配置即可,每个server监听不同的域名。配置不同的证书,转发到不同的内网地址即可。
http块具体配置如下:
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
#日志格式
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;
client_max_body_size 100m;
client_body_timeout 5m;
proxy_connect_timeout 60s;
proxy_read_timeout 5m;
proxy_send_timeout 5m;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
#将普通http请求rewrite为https请求
server {
listen 80;
server_name www.example.com;
rewrite ^(.*)$ https://${server_name}$1 permanent;
}
server {
listen 80;
server_name www.test.com;
rewrite ^(.*)$ https://${server_name}$1 permanent;
}
# https请求转发规则
server {
listen 443 ssl;
# 需要匹配转发规则的域名
server_name www.example.com;
# 前面申请到的免费ssl证书,要与监听的server_name一致
ssl_certificate /usr/local/src/cert/example.com.pem;
ssl_certificate_key /usr/local/src/cert//example.com.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
# www.example.com的https请求转发到192.168.0.10:443
proxy_pass https://192.168.0.10:443;
}
}
# 与上面配置逻辑一样,将配置的内容换成第二个域名的即可
server {
listen 443 ssl;
server_name www.test.com;
ssl_certificate /usr/local/src/cert/test.com.pem;
ssl_certificate_key /usr/local/src/cert/test.com.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass https://192.168.0.20:443;
}
}
}
配置完成,启动即可。
踩坑
配置完成后,nginx转发时一直报错:
.......connect() to 192.168.0.10:443 failed (13: Permission denied) while connecting to upstream........
多次尝试之后发现问题出在selinux上。
查看selinux
[root@dev-server ~]# getenforce
如果结果是enforcing,使用以下命令临时关闭
[root@dev-server ~]# setenforce 0
或者修改配置文件永久生效
[root@dev-server ~]# vi /etc/selinux/config
将SELINUX=enforcing改为SELINUX=disabled
设置后需要重启才能生效