nginx实现https访问
HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS 在HTTP 的基础下加入SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。 HTTPS 存在不同于 HTTP 的默认端口及一个加密/身份验证层(在 HTTP与 TCP 之间)。这个系统提供了身份验证与加密通讯方法。它被广泛用于万维网上安全敏感的通讯,例如交易支付等方面 。
下面先简要概述三种可以实现https访问方式,后面详细说本人实战经验。
有问题可以联系本人:1016401546,备注来意,否则不加
方式1:使用rewrite指令
server {
listen 80;
server_name domain.com;
rewrite ^(.*) https://$server_name$1 permanent;
}
server {
listen 443 ssl;
server_name domain.com;
ssl on;
ssl_certificate /etc/nginx/ssl/domain.com.crt;
ssl_certificate_key /etc/nginx/ssl/domain.com.crt;
# other
}
如果此时nginx作为Tomcat的前端反向代理的话,需要将相应配置放在配置ssl的server块中。
方式2:使用return指令
server {
listen 80;
server_name domain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name domain.com;
ssl on;
ssl_certificate /etc/nginx/ssl/domain.com.crt;
ssl_certificate_key /etc/nginx/ssl/domain.com.crt;
# other
}
如果此时nginx作为Tomcat的前端反向代理的话,需要将相应配置放在配置ssl的server块中。
方式三:使用error_page指令
只允许HTTP来访问时,用HTTP访问会让Nginx报497错误,然后利用error_page将链接重定向至HTTPS上。
server {
listen 80;
listen 443 ssl;
server_name domain.com;
ssl on;
ssl_certificate /etc/nginx/ssl/domain.com.crt;
ssl_certificate_key /etc/nginx/ssl/domain.com.crt;
# other
error_page 497 https://$server_name$request_uri;
}
使用error_page指令时,将http和https的监听配置写在同一个server块中,对应的其他配置也需要在该server配置块中完成。
需要注意的是,此时需要将error_page指令语句写在最后,否则不能生效。
实战经验
以上方法可以实现将某个端口的所有链接跳到443端口上面,但是需要注意的是字体加粗的地方。
拿方式1来说,需要将相应配置放在配置ssl的server块中的意思是说:包括反向代理,动静分离那些相关的配置都要写在443端口的sever里面。否则不能生效。
如果存在多个端口:如8080,8088这些,那么上述方法只能应用到其中1个端口。也就是说只能80跳到443或者8080跳到443。
而我们的客户要求是,可以通过以下形式访问:
对于8080端口: 可以通过下面方式访问
https://域名:8080
http://域名:8080
对于80端口:
https://域名
http://域名
也就是说一个端口需要同时支持http和https两种协议。
公司的架构访问方式是:
用户===》防火墙====》F5负载均衡====》nginx动静分离方向代理===》内网Tomcat
需求分析:
用户和nginx之间使用https,nginx和Tomcat之间的通信是用http。那么这样配置的话则不需要修改Tomcat的配置文件。比较方便,这样只需要修改nginx的配置文件即可。上面客户的要求即是我们需求,使8080端口和80端口同时支持http和https访问。
步骤1: server模块添加证书
listen 8080 ssl;
server_name aop.gd10010.cn;
#注释下面配置,同时支持https和http访问
#ssl on;
ssl_certificate /data/nginx/sbin/aop_gd10010_cn_combin.cer;
ssl_certificate_key /data/nginx/sbin/aop.gd10010.cn.key.unsecure;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
步骤2: server 模块最后添加下面代码(注意后面的端口号)
#使用497状态重写到http上面
error_page 497 = @497;
location @497 {
rewrite / $uri last;
}
#如果想只允许使用https访问,则打开server的ssl on;注释掉上面4行,打开下面一行。8080为对应的端口
#error_page 497 https://$server_name:8080$request_uri;#注意变量后面的端口号
}
步骤3: 其他配置参照普通配置即可(如反向代理,日志配置等)
我的大部分配置
有些配置可能对你们是多余的,正常配置不用变,就添加证书和几条配置信息就可以了。
user nobody nobody;
worker_processes auto;
error_log logs/error.log notice;
pid logs/nginx.pid;
worker_rlimit_nofile 655350;
events {
use epoll;
worker_connections 65535;
}
http {
include mime.types;
add_header X-Frame-Options "SAMEORIGIN";
default_type application/octet-stream;
server_tokens off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
client_max_body_size 8m;
keepalive_timeout 60;
gzip on;
include proxy.conf;
include ban_ip.conf;
upstream backend {
#ip_hash;
server 10.111.100.77:8080 max_fails=3 fail_timeout=10s;
server 10.111.100.78:8080 max_fails=3 fail_timeout=10s;
keepalive 60;
}
server {
listen 80;#把80端口的链接跳转到443
listen 443 ssl;
server_name xxx.xxx.cn;#证书的域名
#注释下面一行,使同时支持https和http访问
#ssl on
ssl_certificate /data/nginx/sbin/xxxxx.cer;#证书的路径
ssl_certificate_key /data/nginx/sbin/xxxxx.unsecure;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
access_log off;
location ~ /gd.*\.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(.*) {
proxy_pass http://backend;
#此处省略部分配置(具体配置看按照公司原本http配置即可)。。。。
}
location ~ gd {
proxy_pass http://backend;
#此处省略部分配置(具体配置看按照公司原本http配置即可)。。。。
}
error_page 500 502 503 504 /busy.html;
location = /busy.html {
root html;
}
#使用497状态重写到http上面
error_page 497 = @497;
location @497 {
rewrite / $uri last;
}
}
upstream backend_daily {
#ip_hash;
server 10.111.100.73:8080 max_fails=6 fail_timeout=20s;
server 10.111.100.74:8080 max_fails=7 fail_timeout=20s;
keepalive 60;
}
server {
listen 8080 ssl;
server_name xxx.xxx.cn;
#注释下面配置,同时支持https和http访问
#ssl on;
ssl_certificate /data/nginx/sbin/xxx.cer;
ssl_certificate_key /data/nginx/sbin/xxx.unsecure;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
access_log off;
#此处省略部分配置(具体配置看按照公司原本http配置即可)。。。。
location ~ /gd.*\.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(.*) {
proxy_pass http://backend_daily;
#此处省略部分配置。。。。
}
location ~ gd {
proxy_pass http://backend_daily;
#此处省略部分配置。。。。
}
location = /robots.txt {
return 400;
}
error_page 404 500 502 503 504 403 405 = /busy.html;
location = /busy.html {
root html;
}
#使用497状态重写到http上面
error_page 497 = @497;
location @497 {
rewrite / $uri last;
}
#如果想只允许使用https访问,则打开server的ssl on;注释掉上面4行,打开下面一行。8080为对应的端口
#error_page 497 https://$server_name:8080$request_uri;#注意变量后面的端口号
}
}
配置完成后先用
./nginx -t 检查配置文件是否通过,若果通过则可以直接重载。
重载后验证业务即可。切记,修改配置文件前记得先备份!
然后发现可以用下面两种方式访问:
80端口:
http://域名
https://域名
8080端口:
http://域名:8080
https://域名:8080
这样就可以实现http和https协议同时并存了。
还没有评论,来说两句吧...