文章目录
零、前置内容:
一堆资料发现还是需要钻研才回去细读,想了下还是懒狗式指引适合自己。
总体来说,以实际使用出发,主要针对http
与server
层进行配置
一、普通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方式:
懒狗必定不会自己生成:(记得保存密钥)
(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 | 做反向代理时传送给接收方的资源名称 | |
$status | HTTP请求状态 | 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_protocol | SSL协议版本 | TLSv1,TLSv1.2 |
$ssl_cipher | 交换数据中的算法 | SHA |
$ssl_protocol | SSL协议版本 | 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_status | upstream状态 | 200,404 |
$upstream_addr | upstream的地址 | 真正提供服务的主机地址 |
$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"'
' }';
③使用内置参数格式的日志
以基本转发为例子 ,比如你定義的為
main
或log_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;