同一个端口实现http跳转https
默认的,http和https需要使用不同的端口,做http到https的跳转,也需要从http的端口(默认为80)跳转到https的端口(443),那么,如何实现在一个端口的情况下,使用http访问转向到https呢?一个简单的方法是利用nginx的497错误码
原理:http和https是tcp的上层协议,当nginx服务器建立tcp连接后,根据收到的第一份数据来确定客户端是希望建立tls还是http。nginx会判断tcp请求的首写节内容以进行区分,如果是0x80或者0x16就可能是ssl或者tls,然后尝试https握手。如果端口开启了https,但请求过来的并不是,会抛出一个http级别的错误,这个错误的状态码是NGX_HTTP_TO_HTTPS,错误代码497,然后在返回response中会抛出一个400错误(因为497不是标准状态码,丢给浏览器也没有用),这时浏览器会显示"400 Bad Request,The plain HTTP request wes sent to HTTPS port"
这样,可以对497进行路由处理,做302重定向,核心代码如下:
error_page 497 https://$host:8080$request_uri;
配置示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | server { charset utf-8; client_max_body_size 128M; listen 8080 ssl; ssl_certificate cert/test.com.pem; ssl_certificate_key cert/test.com.pem; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; server_name test; root /var/www; index index.php; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { try_files $uri $uri/ /index.php$is_args$args; } location /check.html { return 200; access_log off; } location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass 127.0.0.1:9000; #fastcgi_pass unix:/var/run/php5-fpm.sock; try_files $uri =404; } location ~* /\. { deny all; } error_page 497 https://$host:8080$request_uri; } |
HttpAuthBasic基本认证
基本结构:
location / {
auth_basic "Login!";
auth_basic_user_file conf/passwd;
}
说明:
auth_basic "Login!"; 启用基本认证,密码框提示语句为Login!
auth_basic off; 关闭基本认证
auth_basic_user_file conf/passwd; 定义密码文件路径
密码文件格式为:
user:passwd:comment #用户名:crypt加密后的密码串:注释
获取密码串的方式可以使用htpasswd命令,或者使用这个网站:
https://tool.lu/htpasswd/注意:加密方式为crypt(3)
可以设置在http, server, location,
limit_except级别
在线配置文件生成
在线生成nginx配置文件
https://nginxconfig.io/
可在本生成配置文件,功能非常强大
图片防盗链
通过检测header字段里的referer字段判断,若referer来自规定的域名或空时,认为是正常的访问,否则为盗链
# https访问http的图片,因为安全性规定,所带referer为空
| location ~* .(gif|jpg|png|bmp)$ { valid_referers none blocked *.xxx.com server_names ~.google. ~.baidu.; if ($invalid_referer) { return 403; } } |
none,允许没有http_refer的请求访问资源
blocked,代表有referer但是被防火墙或者是代理给去除了
*.xxx.com,允许xxx.com站点的访问
允许referer为xxx.com 和谷歌、百度对本站图片的访问,其它访问返回403
Nginx模块
https://github.com/yzprofile/ngx_http_dyups_module ,通过Restful接口更新upstreams配置,不需要执行reload操作
https://github.com/weibocom/nginx-upsync-module ,动态修改后端upstreams配置,不需要执行reload操作,支持etcd/consul/upsysnc_lb
杂项
一个站点配置多个域名
server_name 后跟多个域名即可,多个域名间用空格分隔
添加基本帐号验证
| server { location / { auth_basic "pls input user&passwd"; auth_basic_user_file key/auth.key; } } |
开启列出目录文件
| server { location download { autoindex on; # on (默认) 显示确切大小 byte; off 显示大概大小 kb/mb/gb autoindex_exact_size off; # off (默认) 显示GMT时间; on 使用服务器时间 autoindex_localtime on; } } |
默认列出txt等文件时会在浏览器上显示内容,若要直接下载,可添加配置:
| if ($request_filename ~* ^.*?.(txt|pdf|jpg|png)$) { add_header Content-Disposition 'attachment'; } |
配置默认站点
多个主机时,默认从上到下查找,若匹配不到时,会返回第一个虚拟主机的内容
设置默认主机:添加default属性
listen 80 default;
直接返回验证文件
相当于在站点目录放一个txt文件
| location = /XDFylesdffe.txt { default_type text/plain; return 200 'd6296a84657eb275c05c31b10924f6ea'; } |
upstream反射代理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | http { ... upstream tomcats { server 192.168.106.176 weight=1; server 192.168.106.177 weight=1; } server { location /ops-coffee/ { proxy_pass http://tomcats; 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; } } } |
proxy_pass加不加杠的区别:
不加杠 proxy_pass http://tomcats
uri部分不做修改,直接传递,如
| location /ops-coffee/ { proxy_pass http://192.168.106.176; } http://domain/ops-coffee/ --> http://192.168.106.176/ops-coffee/ http://domain/ops-coffee/action/abc --> http://192.168.106.176/ops-coffee/action/abc |
加杠 proxy_pass http://tomcats/ /也是uri
uri部分会被修改为该参数中的uri
| location /ops-coffee/ { proxy_pass http://192.168.106.176; } http://domain/ops-coffee/ --> http://192.168.106.176 http://domain/ops-coffee/action/abc --> http://192.168.106.176/action/abc |
upstream开启keepalive
开启nginx和后端服务之间的keepalive能减少频繁创建tcp连接造成的资源消耗,开启keepalive要求http 1.1
proxy_set_header Connection ""; 为兼容老的协议以及防止http头中有Connection close 导致keepalive失效,清除掉头部的Connection
| upstream tomcat { server ops-coffee.cn:8080; keepalive 1024; #最大连接数为1024 } server { location / { proxy_http_version 1.1; proxy_set_header Connection ""; proxy_pass http://tomcat; } } |
因为 Linux 的 epoll-and-accept 负载均衡算法采取了类似 LIFO 的行为,结果导致请求在不同进程间的分配变得十分不均衡
nginx中激活了 reuseport 指令后,通过 top 命令可以看到 time 分配变得均衡
listen 80 reuseport;
来源:https://pdf.us/2018/05/09/1008.html
评论