1.自定义访问日志
如果访问出错---404,可以去看error.log日志信息
访问日志是记录客户端即用户的具体请求内容信息,而在全局配置模块中的error_log是记录nginx服务器运行时的日志保存路径和记录日志的level,因此两者是不同的,而且Nginx的错误日志一般只有一个,但是访问日志可以在不同server中定义多个,定义一个日志需要使用access_log指定日志的保存路径,使用log_format指定日志的格式,格式中定义要保存的具体日志内容。
访问日志由 ngx_http_log_module 模块实现
官方帮助文档
http://nginx.org/en/docs/http/ngx_http_1og_module.html
日志只能 写在:http,server,loation,if in location,limit_except
1.1日志的格式可以自由指定
tail -f /apps/nginx/logs/access_log
查看日志
1.2主配置文件中加内容
log_format xzq '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$host" ';
对比刚刚的日志信息
1.2.1子配置使用include
注意:想在子配置中用include,要放到内容最后
1.3自定义json 格式日志
方便ELK收集日志
log_format access_json ' {"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"uri":"$uri",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"tcp_xff":"$proxy_protocol_addr",'
'"http_user_agent":"$http_user_agent",'
'"status":"$status"}';这些都是通过变量实现的
tail -f /apps/nginx/logs/access_log
###实时显示成功的日志信息
提取出它的状态码:200
2.Nginx压缩功能
支持对指定类型的文件进行压缩然后再传输给客户端,而且压缩还可以设置压缩比例,压缩后的文件大小将比源文件显著变小,这样有助于降低出口带宽的利用率,降低企业的IT支出,不过会占用相应的CPU资源。Nginx对文件的压缩功能是依赖于模块 ngx_http_gzip_module
官方文档: Module ngx_http_gzip_module
配置指令如下:
#开启或关闭,默认关闭
gzip on | off;#压缩级别,值越小级别越低
gzip_comp_level level;#禁用IE6 gzip功能
gzip_disable "MSIE [1-6]\.";#小于1k,不压缩
gzip_min_length 1k;#启用压缩功能时,协议的最小版本,默认HTTP/1.1
gzip_http_version 1.0 | 1.1;#压缩缓存空间;默认:32 4k或者16 8k;
gzip_buffers number size;#指明压缩的文件类型;默认为gzip_types text/html;
gzip_types mime-type ...;这样写:
gzip_types text/plain application/javascript application/x-javascript text/css
application/xml text/javascript application/x-httpd-php image/gif image/png;#加一个头部信息用 on;看到这个“Vary: Accept-Encoding” 代表压缩好了
gzip_vary on | off;#先压缩好,直接把这个压缩包给它,服务器可以识别,就不用消耗cpu
gzip_static on | off;
#重启nginx并进行访问测试压缩功能
[root@centos8 ~]# cp /apps/nginx/logs/access.log /data/nginx/html/pc/m.txt
[root@centos8 ~]# echo "test" > /data/nginx/html/pc/test.html #小于1k的文件测试是否会压缩
[root@centos8 ~]# vim /apps/nginx/conf/nginx.conf
gzip on;
gzip_comp_level 5;
gzip_min_length 1k;
gzip_types text/plain application/javascript application/x-javascript text/css
application/xml text/javascript application/x-httpd-php image/gif image/png;
gzip_vary on;
#重启Nginx并访问测试:
[root@centos8 ~]# curl --head --compressed 192.168.91.100/test.html
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 22 Feb 2019 01:52:23 GMT
Content-Type: text/html
Last-Modified: Thu, 21 Feb 2019 10:31:18 GMT
Connection: keep-alive
Keep-Alive: timeout=65
Vary: Accept-Encoding
ETag: W/"5c6e7df6-171109"
Content-Encoding: gzip #压缩传输
#验证不压缩访问的文件大小:
写文件压缩内容
去浏览器访问,看有没有压缩成功
3.https功能
Web网站的登录页面都是使用https加密传输的,加密数据以保障数据的安全,HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议,HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。
nginx 的https 功能基于模块ngx_http_ssl_module实现,因此如果是编译安装的nginx要使用参数ngx_http_ssl_module开启ssl功能,但是作为nginx的核心功能,yum安装的nginx默认就是开启的,编译安装的nginx需要指定编译参数--with-http_ssl_module开启
官方文档:
Module ngx_http_ssl_modulehttps://nginx.org/en/docs/http/ngx_http_ssl_module.htmlModule ngx_http_ssl_module
参数 https
ssl on | off;
#开启ssl功能,已经被淘汰了
listen 443 ssl;###用这个开启ssl_certificate /path/to/file;
#指明证书的路径,CA证书是两个文件,合并为一个crt文件ssl_certificate_key /path/to/file;
#指明证书路径,用私钥文件,一般是key文件ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
#支持ssl协议版本,早期为ssl现在是TLS,默认为后三个ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
#配置ssl缓存
off: #关闭缓存
none: #通知客户端支持ssl session cache,但实际不支持
builtin[:size]:#使用OpenSSL内建缓存,为每worker进程私有
[shared:name:size]:#在各worker之间使用一个共享的缓存,需要定义一个缓存名称和缓存空间大小,一兆可以存储4000个会话信息,多个虚拟主机可以使用相同的缓存名称ssl_session_timeout time;
#保留缓存的时长,默认5分钟
3.1ssl功能
3.2自签名证书
写配置文件
#所有的证书需要放在一起不能移开
mkdir ssl
cd ssl
把脚本拖进来
bash certificate.sh
cat kgc.com.crt(购买者) ca.crt(颁发者) > www.kgc.com.crt(合成一个,有ca和kgc的证书)
mv kgc.com.key www.kgc.com.key(密钥,用来加密解密)
ll www.kgc.com*(这是一个公私钥文件)
vim /apps/nginx/conf.d/m.conf
server{
listen 80;
listen 443 ssl;(监听443端口开启ssl)
root /data/;
ssl_certificate /data/ssl/www.kgc.com.crt;(证书的位置)
ssl_certificate_key /data/ssl/www.kgc.com.key;(密钥的位置)
ssl_session_cache shared:sslcache:20m;(缓存)
ssl_session_timeout 10m;(缓存超时时间)}
浏览器访问
4.重写功能 rewrite
作用:重新帮客户书写请求的地址
Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求,此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库,rewrite是nginx服务器的重要功能之
一,用于实现URL的重写,URL的重写是非常有用的功能,比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的链接,就可以设置为自动访问,另外还可以在一定程度上提高网站的安全性。
4.1ngx_http_rewrite_module模块指令
官方文档: https://nginx.org/en/docs/http/ngx_http_rewrite_module.html
4.1.1 if指令
https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#if官方文档: https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#if
用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进行配置,Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断,用法如下:
if (条件匹配) {
action
}
使用正则表达式对变量进行匹配,匹配成功时if指令认为条件为true,否则认为false,变量与表达式之间使用以下符号链接:
= #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!= #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~ #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假~* #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真
-f 和 !-f #判断请求的文件是否存在和是否不存在
-d 和 !-d #判断请求的目录是否存在和是否不存在
-x 和 !-x #判断文件是否可执行和是否不可执行
-e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)
#注意:
#如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true。
#nginx 1.0.1之前$变量的值如果以0开头的任意字符串会返回false
#示例:
http://www.baidu.com3字打头重定向
301 永久重定向 将缓存记录在浏览器中
302 临时重定向 没有缓存 每次都要重定向
304
4.2 return
return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配置都将不被执行,return可以在server、if 和 location块进行配置
语法格式:
www.kgc.com/test/
404
return code; #返回给客户端指定的HTTP状态码
return code [text]; #返回给客户端的状态码及响应报文的实体内容,可以调用变量,其中text如果有空格,需要用单或双引号
return code url; #返回给客户端的URL地址
状态码:301和302
301:永久重定向 (读取过一次,会将配置缓存在客户端;即使Nginx服务器宕机,在缓存时间内也可以跳转)
302:临时重定向 (不会存在客户端;每次跳转页面,都要问一遍服务器,然后解析;一旦服务器宕机,就无法跳转)
1.状态码为302时
1.2.把nginx停掉,再去访问
2.当状态码为301时
2.1访问一个不存在的页面
当我们访问一个不存在的页面时,状态码就不是301,会从别的地方跳转过来
2.2访问页面存在时
当我们访问页面存在时,状态码为301
2.1当把nginx停掉了以后
访问页面