week15-Nginx企业应用

Nginx网站服务应用

1. Nginx服务监控状态页部署

官方说明

在遇到模块不知道如何配置得时候都可以进进入 nginx官网 去查找相关帮助文档,里边有详细介绍,示例。

第一步:创建一个新的虚拟主机,在/etc/nginx/conf.d

创建虚拟主机

第二步:配置虚拟主机文件

配置虚拟主机

第三步:重启服务/重新载入

第四步:配置本地hosts解析

本地hosts解析
监控页面显示
参数含义:
Active connections: 2         激活的已连接数(总的并发连接数,有多少人在访问)
server accepts                已接受的客户端访问服务端总的链接数量  
handled                       '已经处理的'客户端访问服务端的总量
requests                      接收到的用户请求的报文的总数量
reading                       读取目前用户访问请求头数量
writting                      目前响应用户访问响应头数量
waitting                      目前在内存中/队列中未处理的请求报文数量

handle 参数不是绝对的

worker进程数x worker最大连接数= 总的并发连接数
worker_processses 2; worker_connections 1024;
2x1024= 2048 总的并发连接数
遇到并发超过系统设置的数量,系统会先接收过来,先等待,放到系统内存中,等待处理,因此官方解释handle 数值不是绝对的,因为并不是所有数据都能够立刻接收,立刻处理

2. Nginx服务日志信息

access 访问日志

日志位置 /var/log/nginx/access.log

日志格式定义:(nginx.conf配置文件中定义)
  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
以上信息都表示定义日志格式 
main  主题
$remote_addr
$xxx
这些带$符号的字符串,都是Nginx的内置变量

Nginx 官网内置变量介绍
http://nginx.org/en/docs/varindex.html

访问日志详解

访问日志示例

$remote_addr :10.0.0.1
$remote_user : 认证用户名 (这里没有认证,所以显示 --)
$time_local : [05/Aug/2019:17:47:01 +0800]] 用户访问网站时间信息
$request" :GET /favicon.ico HTTP/1.1 " HTTP请求行信息
$status :302 显示状态码信息
$status $body_bytes_sent :145 响应报文主体尺寸 (消耗网站流量的大小尺寸,尺寸过大需要考虑是否有盗链情况)

盗链情况:响应报文主体尺寸如果每天增加的越多,产生的流量就越多,增加费用就会越多,有时候需要付费,如果网站访问量不高,还出现这样的情况,可能就出现盗链情况,别人网站盗用了你的照片,但是查看照片的时候使用的是你存储中的图片,消耗你的资源,宣传他人的网站,就会造成费用的损失

$http_referer:HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。
$http_user_agent:记录客户端访问信息,例如系统版本,浏览器,什么操作系统,浏览器内核,移动端
$http_x_forwarded_for

error 错误日志(产生错误,有问题时需要查看)

日志位置/var/log/nginx/error.log
错误日志配置方法:error_log /var/log/nginx/error.log warn;

时间-级别

错误日志示例

2019/08/05 17:47:01 错误发生时间
/html/www/favicon.ico 在寻找HTML标题左侧图标
client: 10.0.0.1 客户端地址
server: \www.oldboy.com 访问域名
request: "GET /favicon.ico HTTP/1.1 返回请求头信息
错误日志内容官方说明

3. 网站location

location官方说明

通过指定模式来与客户端请求的URI相匹配

location 一般是配置server 模块中,location 里面的配置相当与局部配置,而server中的配置相当与全局配置

location [ = | ~ | ~* | ^~ ] uri { }

    location = / {
        return 301;
    }
    
    location / {
        return 302;
    }
    
    location /documents/ {
        return 401;
    }
    
    location ^~ /images/ {
        return 402;
    }
    
    location ~* \.(gif|jpg|jpeg)$ {
        return 501;
    }
    
    =:     精确匹配  = /oldboy                 www.oldboy.com/oldboy              最优先
    ^~:    优先匹配  ^~ /images                www.oldboy.com/images/oldboy.jpg   优先
    ~:     模糊匹配  ~ /oldboy                 www.oldboy.com/oldboy/oldboy.html  区分大小写
    ~*:    模糊匹配  ~* /oldboy                www.oldboy.com/oldboy/oldboy.html  不区分大小写
                     ~* \.(gif|jpg|jpeg)$     www.oldboy.com/images/oldboy.jpg
    ~* 与 ~的区别在于前者不区分大小写 后者区分
    /目录  路径匹配  /oldboy                   www.oldboy.com/oldboy/oldboy.html  区分大小写
    /      默认匹配  /                         www.oldboy.com/oldgirl

默认匹配 location /
精确匹配

`
location /doucments/
lcoation /images/
locaiton (jpg jpeg gif )
大写同样可以匹配到

4. 网站页面跳转功能 rewrite

  • 将url信息做改变
  • 将uri信息做改变
  • 完成伪静态配置 动态页面地址--看到的静态页面

如何实现跳转

方法一 : rewrite

Syntax: rewrite regex                replacement         [flag];
        匹配需要跳转的信息            跳转成什么地址     标记(四种标记)
跳转的标记信息:
last:
break:
redirect:临时跳转 302
permanent:永久跳转 301 

永久跳转301与临时跳转302

        301跳转:
        客户端(浏览器)        第一次访问 ---->                       京东网站服务器(.100)
        www.360buy.com      1.  HTTP请求:host-www.360buy.com
        10.0.0.100               <---- 
                            2.  HTTP响应:跳转告知 www.jx.com 301
                                          告知浏览器记录跳转
                                           ---->
                            3.  HTTP请求:host-www.jd.com
                                           <----
                            4.  HTTP响应:页面信息进行响应    200
                                
                                           --->                        京东网站服务器(.100)
        www.360buy.com      1.  HTTP请求:host-www.360buy.com
                                (根据浏览器记录,直接跳转,不需要服务器告知跳转)
                                HTTP请求:host-www.jd.com
                                           <---
                            2.  HTTP响应:页面信息进行响应    200
        
        302跳转
        客户端(浏览器)                   ---->                       京东网站服务器(.100)
        www.360buy.com      1.  HTTP请求:host-www.360buy.com
        10.0.0.100                         <----
                            2.  HTTP响应:跳转告知 www.jd.com 302
                                           ---->
                            3.  HTTP请求:host-www.jd.com
                                           <----
                            4.  HTTP响应:页面信息进行响应    200

                                           --->                        京东网站服务器(.100)
        www.360buy.com      1.  HTTP请求:host-www.360buy.com
                                           <----
                            2.  HTTP响应:跳转告知 www.jd.com 302            
                                           ---->
                            3.  HTTP请求:host-www.jd.com
                                (需要服务器再次告知跳转)
                                           <----
                            4.  HTTP响应:页面信息进行响应    200
        如何选择永久跳转与临时跳转(需要分析)
        永久跳转:
        如果有一个长的地址信息或者名称,需要跳转到其他地址,一旦跳转完尽量不要改变,使用301
        例如 mirror.aliyun.com  就是永久跳转
        临时跳转:
        活动页面,短时间内需要跳转,不需要记录信息时候,使用302,如果使用了301 活动结束之后就会报错

rewrite break last跳转

server {
   listen            80;
   server_name       rewrite.oldboy.com;
   root              /html;
   index             index.html;
   location  ~ ^/break/ {
       rewrite  ^/break/  /test/  break;
   }
   location  ~ ^/last/  {
       rewrite  ^/last/  /test/  last;  
   }
   location   /test/ {
       default_type   application/json; 
      # return 200 'ok';
    root /html/www;
    index oldboy.jpg index.html;
   }
}
        break:一旦跳转完毕,默认停止后续操作(没有相应信息)  不会再地址栏显示跳转页面地址
        last: 一旦跳转完毕,会继续访问页面配置信息

常见跳转示例情况测试说明

例1. 用户访问html/abc/index.html实际上真实访问是html/bbb/ccc/index.html

第一步:创建环境

# html 目录下操作
mkdir -p bbb/ccc/ 
# bbb/ccc/目录下操作
echo 'rewrite.successful' > index.html

第二步:Nginx跳转配置

        server {
            server_name rewrtie.oldboy.com;
            listen 80;
            location / {
                root /html;
                index index.html;
            }
            location /abc {
                rewrite (.*) /bbb/ccc/index.html redirect;
            }
        }
location 在匹配到访问 /abc/ 目录的时候,跳转访问 bbb/ccc/index.html

测试:访问地址 rewrite.oldboy.com/abc 显示的是 bbb/ccc/index.html 的内容 'rewrite.successful'

显示信息
> 第二种方法  return 跳转
        server {
            listen 80;
            
            location / {
                root /html;
                index index.html;
            }
            location /abc {
                return 302 /ccc/bbb/2.html;
            }
        }
return 会显示跳转后的地址,而rewrite不会

测试:访问地址 rewrite.oldboy.com/abc

显示结果

例2. 用户访问/2014/ccc/bbb/2.html实际上真实访问是/2018/ccc/bbb/2.html

第一步准备环境:

mkdir /html/2018/ccc/bbb -p  
echo "2018_ccc_bbb_2" > /html/2018/ccc/bbb/2.html

第二步:配置Nginx跳转

      server {
           listen 80;
           location / {
               root /html;
               index index.html;
           }
           location /2014 {  # 记得加 /
               rewrite ^/2014/(.*)$ /2018/$1 redirect;
               #return 302 /2018/ccc/bbb/2.html; 第二种跳转方法
           }
       }

方法2

      server {
           listen 80;
           location / {
               root /html;
               index index.html;
           }
           location /2014 {  # 记得加 /
                  return 302 /2018/ccc/bbb/2.html; 第二种跳转方法
           }
       }

例3:用户访问/test目录下任何内容, 实际上真实访问是rewrite.oldboy.com

server {
        server_name rewrite.oldboy.com;
        location / {
                root /html/;
                index oldboy.jpg index.html; # 特殊页面时
        }
        location /test {
           rewrite (.*) http://rewrite.oldboy.com redirect; # 设置跳转
           return 302 http://rewrite.oldboy.com; return方法 # 设置跳转
       }
}

例4:用户访问course-11-22-33.html实际上真实访问是/course/11/22/33/course_33.html
#http://www.oldboy.com/course-11-22-33.html ==> http://www.oldboy.com/course/11/22/33/course_33.html
跳转目的,不要让用户得知企业站点目录结构

以上都是实现uri的跳转


例5:Nginx 实现url 的跳转

将 rewrite.oldboy.com ---->blog.oldboy.com

第一步:配置好解析信息

解析

第二步:编写配置文件

# 第一种写法: 可以生效,但是次数过多,会提示重定向次数过多,无法打开网站,避免此问题,使用第二种写法
server {
listen 80;
server_name rewrite.oldboy.com www.jd.com;
root /html;
index index.html index.htm; 
rewrite ^/(.*) http://www.jd.com redirect ;
}

# 第二种写法:解决重定向次数过多的问题

server {
        listen 80;
        server_name rewrite.oldboy.com;
        index index.html index.htm;
        rewrite ^/(,*) http://jd.com redirect;


}
server {
        server_name www.jd.com;
        location / {
                root /html/;
                index  index.html;
        }
}
~     
# 第三种写法,使用if 判断
       location / {
           root   /html;
           index  index.html index.htm;
           if ($http_host ~* ^rewrite.oldboy.com) {  
            # 判断不区分大小写 ,如果匹配了以 rewrite.oldboy.com 开头的信息,就按照下方语句跳转
               rewrite  ^/(.*)    http://www.jd.com  redirect;
           }
       }  
       

例6:将http请求,跳转至https

如何部署HTTPS网站 ?
ssl模块官方介绍

第一步:开启 with-http_ssl_moudle 模块(yum安装自动开启,编译安装需要手动开启)
第二步:配置文件中加载ssl配置信息
server {
listen 443 ssl;
server_name www.oldboy.coml;
ssl_certificate     /etc/nginx/conf/server.crt;       公钥
ssl_certificate_key /etc/nginx/conf/server.key;  私钥


}
第三步:创建私钥和证书
先有私钥
openssl genrsa -idea -out server.key 2048
创建证书
openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt

 req               ---  设置证书
 -days 36500     --- 设置证书时效
 -x509           --- 设置证书文件信息格式,标准的证书格式
 -sha256         --- 证书数据加密方式
 -nodes -newkey  --- 去掉密码信息 (上边创建私钥时候的密码)
 rsa:2048        --- 识别私钥加密信息
 -keyout         --- 读取私钥文件
 -out            --- 输出一个证书

为什么HTTPS 访问要有公钥私钥

在访问网站时,网站会传输一个公钥给客户端,然后浏览器中就会保存这个公钥,这个公钥对应的就是在访问这个网站的时候会用到,如果网址正确,网站那边有私钥,配对之后就可以正常访问 ,这样就可以避免钓鱼网站;

1. 查看是否开启了 with-http_ssl_moudle

nginx -v
模块已开启

2. 编写配置文件

server {
   listen               443 ssl;
   server_name          www.oldboy.com;
   ssl_certificate      /etc/nginx/conf/server.crt;
   ssl_certificate_key  /etc/nginx/conf/server.key;

location / {
   root        /html/www;
   index       index.html index.htm;
}
}

3. 创建公钥 证书

创建私钥
openssl genrsa -idea -out server.key 2048    先有私钥
提示创建一个私钥密码

创建证书:
openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
## 注意,要与配置文件中指定的证书,私钥存放路径一直  /etc/nginx/conf/xxx

私钥,证书

4. 重启nginx,测试网站

systemctl restart nginx 
测试已经显示https 证书

目前只能手动输入https://www.oldboy.com 跳转,实现自动跳转如下

server {
   listen 80;
   root /html/www;
   index index.html index.htm;
   server_name www.oldboy.com;
  # rewrite ^(.*) https://$server_name$1 redirect; rewrite 跳转方法 $1 后向引用前方匹配uri
   return 302 https://$server_name$request_uri;   #return 跳转方法
}
server {
   listen               443 ssl;
   server_name          www.oldboy.com;
   ssl_certificate      /etc/nginx/conf/server.crt; 
   ssl_certificate_key  /etc/nginx/conf/server.key;

location / {
   root        /html/www;
   index       index.html index.htm;
   Rewrite常用内置变量,在匹配过程中可以引用一些Nginx的全局变量
   $server_name       当前用户请求的域名
   $request_filename  当前请求的文件路径名(带网站的主目录/html/images/test.jpg)
   $request_uri       当前请求的文件路径名(不带网站的主目录/images/test.jpg)
   $scheme            用的协议,比如http或者https

5. Nginx 内容总结

nginx网站服务阶段总结:
01. 软件部署安装过程
02. 软件配置文件编写
    http://nginx.org/en/docs/   
03. 软件企业应用配置
    a. 实现多个页面配置
    b. 实现不同访问方式
    c. 实现目录索引功能
    d. 实现网站安全访问 
    e. 实现状态信息监控
    f. 服务程序日志功能    日志切割处理(logrotate  切割日志脚本)
       #!/bin/bash
       log_path="/var/log/nginx/"
       access_info="access_log"
       error_info="error_log"
       access_info_date="access_$(date +%F).log"
       error_info_date="error_$(date +%F).log"
       
       mv $log_path$access_info  $log_path$access_info_date
       mv $log_path$error_info   $log_path$error_info_date
       systemctl restart nginx
       编写定时任务
    g. 服务程序location匹配uri信息功能
    h. 服务程序rewrite(return)实现网站页面跳转功能
 04. 网站服务实现HTTPs访问      
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,527评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,314评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,535评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,006评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,961评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,220评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,664评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,351评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,481评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,397评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,443评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,123评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,713评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,801评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,010评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,494评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,075评论 2 341