需求:
- 全站HTTPS
- 同时也支持HTTP
- HTTPS和HTTP流量分布统计(查询条件精确到分且可以将接口名称作为参数)
初步解决方案:
由于公司用的Nginx服务器,所以HTTPS配置在Nginx里,于是初步方案如下:
实现方案
一、申请域名和证书
二、云服务器上安装NGINX
1.先安装gcc-c++编译器
yum install gcc-c++
yum install -y openssl openssl-devel
2.再安装pcre包
yum install -y pcre pcre-devel
3.再安装zlib包
yum install -y zlib zlib-devel
4.在/usr/local/下创建文件nginx文件
mkdir /usr/local/nginx
5.windows下载Nginx(下载地址)
6.用WINSCP上传到刚刚创建的文件夹并解压后修改名称
tar -zxvf nginx-1.19.9.tar.gz
mv nginx-1.19.9 nginx
7.启动nginx
#进入nginx的bin目录下
cd /usr/local/nginx/sbin
# 启动nginx
./nginx
访问公网IP看到下图即为成功
三、Nginx配置HTTPS
1.解压证书,并将其中Nginx目录下的.crt和.key结尾的文件拷贝到Nginx的conf目录下
2.移动conf目录下,编辑nginx的配置文件nginx.conf
vi /usr/local/nginx/conf/nginx.conf
文件内容修改为下列
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$scheme -$uri - $request_uri - $remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#由于是需要放在elk里进行分析,所以选择了json格式 对应字段含义放在文章末尾
log_format json '{"scheme":"$scheme","uri":"$uri","user_ip":"$http_x_real_ip","lan_ip":"$remote_addr","log_time":"$time_iso8601","user_req":"$request","http_code":"$status","body_bytes_sents":"$body_bytes_sent","req_time":"$request_time","user_ua":"$http_user_agent"}';
#可以选择在这里进行打印 但是初步计划是分不同文件打印
#access_log logs/access.log json;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name 你申请的域名;
#charset koi8-r;
access_log logs/httpJsonAccess.log json;
location / {
#由于只是测试版本 只有一个服务
proxy_pass http://locahost:8050/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;#web服务器端获得用户的真实ip
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 100m;
}
}
server {
listen 443 ssl;
server_name 域名;
#证书文件名称 因为是同一目录就没写路径
ssl_certificate 1_域名_bundle.crt;
#私钥文件名称
ssl_certificate_key 2_域名.key;
# 下面都是静态配置
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
#日志收集
access_log logs/httpsJsonAccess.log json;
location / {
#代理的端口
proxy_pass http://locahost:8050/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
}
}
}
3.移动目录到nginx/sbin,并重新加载nginx配置,并访问
./nginx -s reload
4.查看nginx/logs下目录文件
日志字段含义
$hostname 1.0.8 主机名
$http_cookie 1.0.8 cookie 信息
$http_referer 1.0.8 引用地址
$http_user_agent 1.0.8 客户端代理信息
$http_via 1.0.8 最后一个访问服务器的Ip地址。
$http_x_forwarded_for 1.0.8 相当于网络访问路径。
$limit_rate 1.0.8 对连接速率的限制;
q u e r y s t r i n g 1.0.8 与 query_string 1.0.8 与 querystring1.0.8与args相同;
$remote_addr 1.0.8 客户端地址;
$remote_port 1.0.8 客户端端口号;
$remote_user 1.0.8 客户端用户名,认证用;
$request 1.0.8 用户请求
$request_body_file 1.0.8 发往后端的本地文件名称
$request_filename 1.0.8 当前请求的文件路径名,
$request_method 1.0.8 请求的方法,比如"GET"、"POST"等;
$request_uri 1.0.8 请求的URI,带参数; 比如http://localhost:88/test1/test2
$scheme 1.0.8 所用的协议,比如http或者是https
$server_addr 1.0.8 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);
$server_name 1.0.8 请求到达的服务器名;
$server_port 1.0.8 请求到达的服务器端口号;
$server_protocol 1.0.8 请求的协议版本,“HTTP/1.0"或"HTTP/1.1”;
$uri 1.0.8 请求的URI,可能和最初的值有不同,比如经过重定向之类的。