1 nginx日志切割
1.1 日志配置
在./configure --prefix=path
指定的path
中切换进去,找到log
文件夹,进去后找到都是对应的日志文件
其中的nginx.pid
是当前nginx
的进程号,当使用ps -ef | grep nginx
获得就是这个nginx.pid
的值
在nginx.conf
中定义的日志格式如下:
#定义日志main 的格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#定义日志access.log的地址
access_log logs/access.log main;
局部日志:在每个server
中都配置单独的日志文件
全局日志:在http
那里配置的是全局日志
1.2 日志切分
第一:如何实现日志切分,编写shell
脚本
第二:定时任务对脚本进行调度:crontab -e
1.2.1 切分日志的shell脚本
#!/bin/sh
BASE_DIR=/usr/local/nginx
BASE_FILE_NAME=access.log
CURRENT_PATH=$BASE_DIR/logs
BAK_PATH=$BASE_DIR/datalogs
CURRENT_FILE=$CURRENT_PATH/$BASE_FILE_NAME
#假设是每分钟都要备份一次的
BAK_TIME=`/bin/date -d yesterday +%Y%m%d%H%M`
BAK_FILE=$BAK_PATH/$BAK_TIME-$BASE_FILE_NAME
echo $BAK_FILE
$BASE_DIR/sbin/nginx -s stop
mv $CURRENT_FILE $BAK_FILE
$BASE_DIR/sbin/nginx
1.2.2 定时任务调度
执行crontab -e
后:
*/1 * * * * sh /usr/local/nginx/sbin/log.sh
crontab
语法 :
crontab [-e [UserName]|-l [UserName]|-r [UserName]|-v [UserName]|File ]
说明 :
crontab
是用来让使用者在固定时间或固定间隔执行程式之用,换句话说,也就是类似使用者的时程表。-u user
是指设定指定 user
的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用-u user
的话,就是表示设定自己的时程表。
crontab
参数 :
-e [UserName]:
执行文字编辑器来设定时程表,内定的文字编辑器是VI
-r [UserName]:
删除目前的时程表-l [UserName]:
列出目前的时程表-v [UserName]:
列出用户cron
作业的状态
crontab
时程表的格式如下 :
f1 f2 f3 f4 f5 program
- 其中
f1
是表示分钟,f2
表示小时,f3
表示一个月份中的第几日,f4
表示月份,f5
表示一个星期中的第几天,program
表示要执行的程式 - 当
f1
为*
时表示每分钟都要执行program
,f2 为*
时表示每小时都要执行程式,其余类推 - 当
f1
为a-b
时表示从第a
分钟到第b
分钟这段时间内要执行,f2
为a-b
时表示从第a
到第b
小时都要执行,其余类推 - 当
f1
为*/n
时表示每n
分钟个时间间隔执行一次,f2
为*/n
表示每n
小时个时间间隔执行一次,其余类推 - 当
f1
为a, b, c,...
时表示第a, b, c,...
分钟要执行,f2 为 a, b, c,...
时表示第a, b, c...
个小时要执行,其余类推
注意
:新创建的 cron
任务,不会马上执行,至少要过2
分钟后才可以,当然你可以重启 cron
来马上执行
2 正向与反向代理
2.1 定义
2.1.1 正向代理(Forward Proxy)
一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术。
关于正向代理的概念如下:
正向代理(forward
)是一个位于客户端【用户A】和原始服务器(origin server
)【服务器B】之间的服务器【代理服务器Z】,为了从原始服务器取得内容,用户A向代理服务器Z发送一个请求并指定目标(服务器B),然后代理服务器Z向服务器B转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。如下图
从上面的概念中,我们看出,文中所谓的正向代理就是代理服务器替代访问方【用户A】去访问目标服务器【服务器B】
这就是正向代理的意义所在。而为什么要用代理服务器去代替访问方【用户A】去访问服务器B呢?这就要从代理服务器使用的意义说起。
使用正向代理服务器作用主要有以下几点:
- 访问本无法访问的服务器B
我们抛除复杂的网络路由情节来看上图,假设图中路由器从左到右命名为R1,R2
假设最初用户A要访问服务器B需要经过R1和R2路由器这样一个路由节点,如果路由器R1或者路由器R2发生故障,那么就无法访问服务器B了。但是如果用户A让代理服务器Z去代替自己访问服务器B,由于代理服务器Z没有在路由器R1或R2节点中,而是通过其它的路由节点访问服务器B,那么用户A就可以得到服务器B的数据了。
现实中的例子就是"Over the wall"。不过自从VPN技术被广泛应用外,"Over the wall"不但使用了传统的正向代理技术,有的还使用了VPN技术。 - 加速访问服务器B
这种说法目前不像以前那么流行了,主要是带宽流量的飞速发展。早期的正向代理中,很多人使用正向代理就是提速。还是如上图
假设用户A到服务器B,经过R1路由器和R2路由器,而R1到R2路由器的链路是一个低带宽链路。而用户A到代理服务器Z,从代理服务器Z到服务器B都是高带宽链路。那么很显然就可以加速访问服务器B了 - Cache作用
Cache
(缓存)技术和代理服务技术是紧密联系的(不光是正向代理,反向代理也使用了Cache
(缓存)技术。还如上图所示,如果在用户A访问服务器B某数据J之前,已经有人通过代理服务器Z访问过服务器B上得数据J,那么代理服务器Z会把数据J保存一段时间,如果有人正好取该数据J,那么代理服务器Z不再访问服务器B,而把缓存的数据J直接发给用户A。这一技术在Cache
中术语就叫Cache命中
。如果有更多的像用户A的用户来访问代理服务器Z,那么这些用户都可以直接从代理服务器Z中取得数据J,而不用千里迢迢的去服务器B下载数据了。 - 客户端访问授权
这方面的内容现今使用的还是比较多的,例如一些公司采用ISA SERVER做为正向代理服务器来授权用户是否有权限访问互联网
上图防火墙作为网关,用来过滤外网对其的访问。假设用户A和用户B都设置了代理服务器,用户A允许访问互联网,而用户B不允许访问互联网(这个在代理服务器Z上做限制)这样用户A因为授权,可以通过代理服务器访问到服务器B,而用户B因为没有被代理服务器Z授权,所以访问服务器B时,数据包会被直接丢弃。 - 隐藏访问者的行踪
如下图所示,我们可以看出服务器B并不知道访问自己的实际是用户A,因为代理服务器Z代替用户A去直接与服务器B进行交互。如果代理服务器Z被用户A完全控制(或不完全控制),会惯以“肉鸡”术语称呼。
我们总结一下:
正向代理是一个位于客户端
和原始服务器(origin server)
之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端口。
2.1.2 反向代理(reverse proxy)
反向代理正好与正向代理相反,对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space
)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。
使用反向代理服务器的作用如下:
- 保护和隐藏原始资源服务器
用户A始终认为它访问的是原始服务器B而不是代理服务器Z,但实用际上反向代理服务器接受用户A的应答,从原始资源服务器B中取得用户A的需求资源,然后发送给用户A。由于防火墙的作用,只允许代理服务器Z访问原始资源服务器B。尽管在这个虚拟的环境下,防火墙和反向代理的共同作用保护了原始资源服务器B,但用户A并不知情。 - 负载均衡
如下所示:
当反向代理服务器不止一个的时候,我们甚至可以把它们做成集群,当更多的用户访问资源服务器B的时候,让不同的代理服务器Z(x)去应答不同的用户,然后发送不同用户需要的资源。
当然反向代理服务器像正向代理服务器一样拥有CACHE
的作用,它可以缓存原始资源服务器B的资源,而不是每次都要向原始资源服务器B请求数据,特别是一些静态的数据,比如图片和文件,如果这些反向代理服务器能够做到和用户X来自同一个网络,那么用户X访问反向代理服务器X,就会得到很高质量的速度。这正是CDN
技术的核心
反向代理结论与正向代理正好相反,对于客户端而言它就像是原始服务器
,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space
)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。
基本上,网上做正反向代理的程序很多,能做正向代理的软件大部分也可以做反向代理。开源软件中最流行的就是squid,既可以做正向代理,也有很多人用来做反向代理的前端服务器
2.1.3 透明代理
如果把正向代理
、反向代理
和透明代理
按照人类血缘关系来划分的话。那么正向代理
和透明代理
是很明显堂亲关系,而正向代理和反向代理就是表亲关系了
透明代理
的意思是客户端根本不需要知道有代理服务器的存在,它改编你的request fields
(报文),并会传送真实IP
。注意,加密的透明代理则是属于匿名代理
,意思是不用设置使用代理了
透明代理实践的例子就是时下很多公司使用的行为管理软件
用户A和用户B并不知道行为管理设备充当透明代理行为,当用户A或用户B向服务器A或服务器B提交请求的时候,透明代理设备根据自身策略拦截并修改用户A或B的报文,并作为实际的请求方,向服务器A或B发送请求,当接收信息回传,透明代理再根据自身的设置把允许的报文发回至用户A或B,如上图,如果透明代理设置不允许访问服务器B,那么用户A或者用户B就不会得到服务器B的数据
2.2 正反代理区别
- 位置不同
正向代理
:架设在客户端与目标主机之间
反向代理
:架设在服务器端 - 代理对象不同
正向代理
:代理客户端,服务器不知道实际发起请求的客户端
反向代理
:代理服务器端,客户端不知道实际提供服务的服务端
类似于在前端和后端服务之间的中介,中间倒了一把手
2.3 配置反向代理
2.3.1 只获得代理ip
找到conf/nginx.conf
文件,在相应的server
中添加关键字proxy_pass
,这样可以隐藏web
端访问地址,而后端服务获得的是代理后的nginx
的ip
地址
# 把任何后缀为jsp的都用https://192.168.1.2:8080地址为代理
location ~ \.jsp$ { # \.中的\是转义点符号
proxy_pass https://192.168.1.2:8080;
}
2.3.2 获得客户端真实ip
如果想让后端得到真正的web
端地址添加如下:
# nginx的配置如下
location ~ \.jsp$ {
#proxy_set_header 是把正确ip放到请求头中 X-real-ip是自定义的变量名
proxy_set_header X-real-ip $remote_addr;
proxy_pass http://192.168.1.2:8080;
}
# 后端配置如下,就可以得到真正的ip
request.getHeader("X-real-ip");
3 HTTPS配置
3.1 检查环境
查看 nginx
是否安装 http_ssl_module
模块
在nginx
的sbin
目录下执行.nginx -V
来查看
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
configure arguments: --prefix=/home/software/nginx-1.18.0
如果出现 configure arguments:--with-http_ssl_module
, 则已安装,否则需要安装
3.2 安装SSL模块
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module
再次验证,执行.nginx -V
3.3 配置HTTPS
把ssl
证书 *.crt
和 私钥 *.key
拷贝到/home/software/nginx-1.18.0/conf
目录中
新增 server
监听 443
端口:
# ----------HTTPS配置-----------
server {
# 监听HTTPS默认的443端口
listen 443;
# 监听 配置的项目的域名 访问部署了nginx那台服务器的域名、ip、localhost
server_name www.imoocdsp.com;
# 开启ssl
ssl on;
# 输入域名后,首页文件所在的目录
root html;
# 配置首页的文件名
index index.html index.htm index.jsp index.ftl;
# 配置ssl证书
ssl_certificate 1_www.imoocdsp.com_bundle.crt;
# 配置证书秘钥
ssl_certificate_key 2_www.imoocdsp.com.key;
# ssl会话cache
ssl_session_cache shared:SSL:1m;
# 停止通信时,加密会话的有效期,在该时间段内不需要重新交换密钥
ssl_session_timeout 5m;
# 配置加密套件,写法遵循 openssl 标准,服务器支持的TLS版本
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# TLS握手时,服务器采用的密码套件
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
# 开启由服务器决定采用的密码套件
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://tomcats/;
index index.html index.htm;
}
}
# ---------HTTP请求转HTTPS-------------
server {
# 监听HTTP默认的80端口
listen 80;
# 如果80端口出现访问该域名的请求
server_name www.xxx.com;
# 将请求改写为HTTPS(这里写你配置了HTTPS的域名)
rewrite ^(.*)$ https://www.xxx.com;
}