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
通过指定模式来与客户端请求的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访问