Nginx 部分 (六)快速摸鱼配置

零、前置内容:

一堆资料发现还是需要钻研才回去细读,想了下还是懒狗式指引适合自己。

总体来说,以实际使用出发,主要针对httpserver层进行配置

一、普通linux环境

0、本文的环境预设

(1)域名预设:www.coffeeandice.cn

(2)内网ip预设:192.168.1.111

(3)应用预设:

​—①端口:8080

—②内网访问应用端点前缀:192.168.1.111:8080/demoApplication

(4)http 部分内容采用默认属性

(5)SSL证书:

​ —①key: /var/ssl/demo.key

​— ②crt:/var/ssl/demo.crt

1、通用的基础反向代理

最基本的反向代理方式

(1)基本转发

    server {
        listen       80;
        server_name  192.168.1.111;
    	#定义编码,转换编码格式。大多数现代浏览器支持(意味着别玩古老的)
        charset utf-8;
        #通常是有需要将不同server分层设置日志,设置为全局日志
    	#access_log  logs/host.access.log;
		#error_log   logs/host.error.log;
    
		location /api/{
        	#也有设置分层日志,便于仔细查看内容(以最靠近配置的为生效配置)
        	#access_log  logs/api/host.access.log;
        	#error_log   logs/api/host.error.log;
            proxy_pass http://localhost:8080/api/;
        }
		
  }

(2)基础SSL证书

使用预设环境中的域名:www.coffeeandice.cn

使用预设环境中的证书/密钥:demo.crt/demo.key

server {
    listen       80;
    #1.15version above
    listen      443 ssl; 
    # 1.15version before
    # ssl on;
    server_name  www.coffeeandice.cn;
    ssl_certificate /var/ssl/demo.crt;
    ssl_certificate_key /var/ssl/demo.key;
	#定义编码,转换编码格式。大多数现代浏览器支持(意味着别玩古老的)
    charset utf-8;
	location /api/{
        proxy_pass http://localhost:8080/api/;
    }
}

(3)基本即用(懒中懒)

通常满足的配置

server {
    listen       80;
    #1.15version above
    listen      443 ssl; 
    # 1.15version before
    # ssl on;
    server_name  www.coffeeandice.cn;
    ssl_certificate /var/ssl/demo.crt;
    ssl_certificate_key /var/ssl/demo.key;
	#定义编码,转换编码格式。大多数现代浏览器支持(意味着别玩古老的)
    charset utf-8;
    #后端服务器数据回传时间,默认为秒
    #proxy_send_timeout  100
    #服务器处理请求的时间,默认为秒
   	#proxy_read_timeout  100
    #服务器响应超时的时间,默认为秒
    proxy_connect_timeout 100;
    
    #压缩部分
    #设置仅有http1.1以上使用,因为之前本来就不支持
    gzip_http_version 1.1;
    #压缩等级,通常1~9,采用6即可
    gzip_comp_level 6;
    #达到甚么值才开始压缩,建议大点避免全压缩
    gzip_min_length 400k;
    #压缩类型:json,text,js,css,xml
    gzip_types application/json application/text application/javascript text/css text/xml;
    
    #缓存部分
    #在 HTTP/1.1 中用 Cache-Control 管理缓存
	#Pragma 对于 HTTP/1.0 客户端的向后兼容性
    add_header Cache-Control public;
	add_header Pragma public;
    #基于更新频率,让客户读取内存中的缓存以减少请求数据
    expires 1d;
    
	location /api/{
        #日志若非实时:可以如下,满24k 或每5秒刷新一次,减少刷盘速度
        #access_log  logs/api/host.access.log buffer = 24k flush =5s
        access_log  logs/api/host.access.log;
        error_log   logs/api/host.error.log;
        proxy_pass http://localhost:8080/api/;
    }
}

二、Docker 环境

三、其他拓展

1、关于SSL证书

整体来说,我们用到的都是X509证书。在https请求中总能有是否设置验证校验证书的问题,主要都是针对X509证书

①检查OpenSSL(自生成CA证书问题)

**非懒狗注意:**OpenSSL,如果版本低于1.0.1f,存在Heartbleed问题

检查版本讯息:openssl version
yum版本更新: yum update openssl

②csr、crt、key的问题

通常流程: 提供csr交予客户生成crt

自己申请csr -> 保存密钥

​ |

提供给客户 csr

​ |

客户CA签名 -> crt

(1)生成csr方式:

懒狗必定不会自己生成:(记得保存密钥)

CSR在线生成工具 (myssl.com)

(2)签名csr

对客户csr签名,然后生成crt证书

腾讯云: https://cloud.tencent.com/document/product/400/47283

阿里云:aliyun.com

2、nginx中常用内置参数

参数说明示例
$remote_addr客户端地址
$remote_user客户端用户名称
$remote_port客户端的端口
$request请求的URI和HTTP协议“GET /article-10000.html HTTP/1.1”
$request_uri存放了当前请求的URI,并且带请求指令,即带查询字符串,不包含主机名/demo/index.html?param=hi
$request_time整个请求的总时间0.205
$request_method请求资源的方式GET/PUT/DELETE等
$request_filename当前请求的资源文件的路径名称
$request_body_file做反向代理时传送给接收方的资源名称
$statusHTTP请求状态200,404
$scheme请求的协议http,https,ftp,udp
$server_protocol请求资源使用的协议的版本HTTP/1.0,HTTP/1.1,HTTP/2.0
$server_addr服务器IP地址
$server_name服务器的主机名
$server_port服务器端口号
$ssl_protocolSSL协议版本TLSv1,TLSv1.2
$ssl_cipher交换数据中的算法SHA
$ssl_protocolSSL协议版本TLSv1,TLSv1.2
$http_referer客户端请求时的referer通过哪个链接跳过来的
$http_user_agent用户终端浏览器等信息Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.34
$http_cookie客户端的cookie信息
$http_host请求地址,即浏览器中你输入的地址www.baidu.com
$upstream_statusupstream状态200,404
$upstream_addrupstream的地址真正提供服务的主机地址
$upstream_response_time请求过程中,upstream响应时间0.02

3、自定义access/error日志格式

①日志格式:main(default)

我们轻松进入nginx目录conf找nginx.conf.defalut强势围观

 #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
 #                  '$status $body_bytes_sent "$http_referer" '
 #                  '"$http_user_agent" "$http_x_forwarded_for"';

②自定义格式

nginx.conf 任意位置(建议http),预设自己的json格式

下列参数可以到 内置参数 中找寻

    log_format log_json '{ "@timestamp": "$time_local", '
'"remote_addr": "$remote_addr", '
'"referer": "$http_referer", '
'"request": "$request", '
'"status": $status, '
'"bytes": $body_bytes_sent, '
'"agent": "$http_user_agent", '
'"x_forwarded": "$http_x_forwarded_for", '
'"up_addr": "$upstream_addr",'
'"up_host": "$upstream_http_host",'
'"up_resp_time": "$upstream_response_time",'
'"request_time": "$request_time"'
' }';

③使用内置参数格式的日志

以基本转发为例子 ,比如你定義的為mainlog_json 則在對應 access_log | error_log 后增加標識以代表使用格式

    server {
        listen       80;
        server_name  192.168.1.111;
    	#定义编码,转换编码格式。大多数现代浏览器支持(意味着别玩古老的)
        charset utf-8;
		location /api/{
        	#在error_log中设置。输出的结果就是json格式了
        	access_log  logs/api/host.access.log log_json;
        	error_log   logs/api/host.error.log;
            proxy_pass http://localhost:8080/api/;
        }
  }

4、开启压缩(压缩大文件内容)

#压缩部分
#设置仅有http1.1以上使用,因为之前本来就不支持
gzip_http_version 1.1;
#压缩等级,通常1~9,采用6即可
gzip_comp_level 6;
#达到甚么值才开始压缩,建议大点避免全压缩
gzip_min_length 400k;
#压缩类型:json,text,js,css,xml
gzip_types application/json application/text application/javascript text/css text/xml;

5、开启缓存策略

通用配置:

缓存本身可以分为两类: 公共缓存和私有缓存。

public :公共缓存是被多个用户共同使用的。

private :专用缓存专用于单个用户。

#过期时间为一个月 
expires 1d;
add_header Cache-Control public;
add_header Pragma public;

缓存时间参数:

expires 30s; //表示把数据缓存30秒

expires 30m;//表示把数据缓存30分

expires 10h;//表示把数据缓存10小时

expires 1d;//表示把数据缓存1天

expires 1M;//表示把数据缓存一个月

6、 location匹配规则

继续使用普通linux环境中的环境预设

注意:这个是组合,但凡含有~都可以接受正则匹配

啥都不加[大小写敏感] [前缀匹配]

# https://www.coffeeandice.cn

location = /api/ {
    ···
}

匹配:https://www.coffeeandice.cn/api
匹配:https://www.coffeeandice.cn/api/demo
不匹配:https://www.coffeeandice.cn/Api
不匹配:https://www.coffeeandice.cn/Api/demo

①精确匹配(=)

完全匹配才会生效,差一点都不给你玩

# https://www.coffeeandice.cn

location = /api/ {
    ···
}

匹配:https://www.coffeeandice.cn/api
不匹配:https://www.coffeeandice.cn/api/demo

②正则匹配 (~)[大小写敏感]

这里可以加入正则表达式

#经典匹配图片后缀名
location ~ .*\.(gif|jpg|jpeg|png)${
	...
 }

# https://www.coffeeandice.cn
location = /api/ {
    ···
}

匹配:https://www.coffeeandice.cn/api
不匹配:https://www.coffeeandice.cn/Api

③忽略大小写的正则(~*)

# https://www.coffeeandice.cn
location = /api/ {
    ···
}

匹配:https://www.coffeeandice.cn/api
也匹配:https://www.coffeeandice.cn/Api

④前缀匹配(^~) [中了不会继续往后匹配]

# https://www.coffeeandice.cn
location = /api/ {
    ···
}

匹配:https://www.coffeeandice.cn/api
也匹配:https://www.coffeeandice.cn/Api

⑤内部跳转(@)[当错误页面处理就好]

内部消化跳转

# 处理错误页面专用就好
location = /api/ {
    ···
   error_page 404 @error_page
}

location @error_page  {
    ···
}

匹配:https://www.coffeeandice.cn/api
也匹配:https://www.coffeeandice.cn/Api

7、负载均衡相关

可参考之前的笔记 负载均衡配置

8、传递真实ip问题

主要是多重代理后,ip逐渐变成代理的ip,丢失了真实ip的问题
确保安装模块 --with-http_realip_module

参数名内容描述
X-Real-IP客户端ip
X-Forwarded-For各级代理ip的完整ip链路
set_real_ip_from定义已知发送正确消息的受信任地址,说白了是信任的一个接触到真实ip的地址
real_ip_recursive说白了会将X-Forwarded-For 中传递的ip链路最后一个当成真实IP

8.1、单层代理

默认直接nginx直接对外网了 ,所以可以使用回环地址作为定义已知发送正确消息的受信任地址

set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
real_ip_recursive  on;

8.2、多层代理问题

一般而言,如果可以相信上层传递的讯息,可以照常使用第一种模式。

尝试获取real ip

若根据第一种方法如下,获取的不是真实的ip,例如日志种中打印出来的ip为 172.192.168.1 ,我们可以将它替换至 set_real_ip_from 中,然后继续循环,最终基本都可以获取真实ip。
Tips: 我这边经历过最高4层代理~

set_real_ip_from 172.192.168.1;
real_ip_header X-Forwarded-For
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
real_ip_recursive  on;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值