nginx基础入门

nginx 基础篇

nginx基础入门

  • nginx 基础篇
  • 1.nginx的优势
    • 简介
      • Nginx的web优势
      • IO多路复用
      • 时分多路复用
      • 频分多路复用
  • 2.nginx协议详解
        • HTTP
        • URI
        • HTTP protocol 概述
  • 3.nginx部署YUM
      • Nginx版本类型
      • 配置YUM源
      • 安装
  • 4.Nginx 配置文件
  • 5.Nginx 编译参数
  • 6.Nginx 基本配置
  • 7.Nginx 日志Log
        • 日志配置
        • 日志轮转
        • 日志分析
  • 8.Nginx WEB模块
        • 连接状态
          • 关于链接的问题
        • 随机主页
        • 替换模块
        • 文件读取
        • 文件压缩
        • 页面缓存
        • 防盗链
  • 9.Nginx 访问限制
  • 10.Nginx 访问控制

1.nginx的优势

简介

Nginx (engine x) 是一个高性能的HTTP(解决C10k的问题)和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。

Nginx的web优势

  • 高并发
  • IO多路复用
  • epoll
  • 异步
  • 非阻塞

IO多路复用

理论方法
第一种方法:
最传统的多进程并发模型 (每进来一个新的I/O流会分配一个新的进程管理。)
第二种方法:
I/O多路复用 (单个线程,通过记录跟踪每个I/O流(sock)的状态,来同时管理多个I/O流 。)
发明它的原因,是尽量多的提高服务器的吞吐能力。
在同一个线程里面, 通过拨开关的方式,来同时传输多个I/O流
nginx基础入门_第1张图片
技术类型

  1. select
    select是第一个实现 (1983 左右在BSD里面实现的)。
    select 被实现以后,很快就暴露出了很多问题。
    • select 会修改传入的参数数组,这个对于一个需要调用很多次的函数,是非常不友好的。
    • select 如果任何一个sock(I/O stream)出现了数据,select 仅仅会返回,但是并不会告诉你是那个sock上有数
    据,于是你只能自己一个一个的找,10几个sock可能还好,要是几万的sock每次都找一遍…
    • select 只能监视1024个链接。
    • select 不是线程安全的,如果你把一个sock加入到select, 然后突然另外一个线程发现,这个sock不用,要收
    回,这个select 不支持的,如果你丧心病狂的竟然关掉这个sock, select的标准行为是不可预测的
  2. poll
    于是14年以后(1997年)一帮人又实现了poll, poll 修复了select的很多问题,比如
    • poll 去掉了1024个链接的限制,于是要多少链接呢, 主人你开心就好。
    • poll 从设计上来说,不再修改传入数组,不过这个要看你的平台了,所以行走江湖,还是小心为妙。
    其实拖14年那么久也不是效率问题, 而是那个时代的硬件实在太弱,一台服务器处理1千多个链接简直就是神
    一样的存在了,select很长段时间已经满足需求。
    但是poll仍然不是线程安全的, 这就意味着,不管服务器有多强悍,你也只能在一个线程里面处理一组I/O流。
    你当然可以那多进程来配合了,不过然后你就有了多进程的各种问题。
  3. epoll
    于是5年以后, 在2002, 大神 Davide Libenzi 实现了epoll.
    epoll 可以说是I/O 多路复用最新的一个实现,epoll 修复了poll 和select绝大部分问题, 比如:
    • epoll 现在是线程安全的。
    • epoll 现在不仅告诉你sock组里面数据,还会告诉你具体哪个sock有数据,你不用自己去找了。
    特点:异步,非阻塞

$ pstree |grep nginx
|-+= 81666 root nginx: master process nginx
| |— 82500 nobody nginx: worker process
| — 82501 nobody nginx: worker process
1个master进程,2个work进程

每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker不会这么一直等着,他会在发送完请求后,注册一个事件:“如果upstream返回了,告诉我一声,我再接着干”。于是他就休息去了。这就是异步。此时,如果再有request 进来,他就可以很快再按这种方式处理。这就是非阻塞和IO多路复用。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。这就是异步回调。

时分多路复用

CPU时钟/中断设计

频分多路复用

ADSL

2.nginx协议详解

HTTP

HTTP–Hyper Text Transfer Protocol,超文本传输协议,是一种建立在TCP上的无状态连接,整个基本的工作流程是客户端发送一个HTTP请求,说明客户端想要访问的资源和请求的动作,服务端收到请求之后,服务端开始处理请求,并根据请求做出相应的动作访问服务器资源,最后通过发送HTTP响应把结果返回给客户端。其中一个请求的开始到一个响应的结束称为事务,当一个事物结束后还会在服务端添加一条日志条目。

URI

官方链接: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web.

简介:
统一资源标识符(Uniform Resource Identifier,或URI)
HTTP 请求的内容通称为"资源"。”资源“这一概念非常宽泛,它可以是你能够想到的格式。每个资源都由一个 (URI) 来进行标识。URL即统一资源定位符,它是 URI 的一种。一份文档,一张图片,或所有其他。URI包含URL,URN

URL
URL 用于定位,全称叫做:统一资源定位符(URL,英语Uniform Resource Locator的缩写)也被称为网页地址

示例:

  • https://developer.mozilla.org
  • https://developer.mozilla.org/en-US/docs/Learn/
  • https://developer.mozilla.org/en-US/search?q=URL在浏览器的地址栏中输入上述任一地址,浏览器就会加载相应的网页(资源)。
  • URL 由多个必须或可选的组件构成。下面给出了一个复杂的 URL:
  • http://www.example.com:80/path/to/myfile.html?key1=value1&key2=value2#SomewhereInTheDocument

URN

用于区分,URN仅用于命名,而不指定地址。用于标识唯一书目的ISBN系统是一个典型的URN使用范例。例如,ISBN 0486275574(urn:isbn:0-486-27557-4)无二义性地标识出莎士比亚的戏剧《罗密欧与朱丽叶》的某一特定版本。

URN 是另一种形式的 URI,它通过特定命名空间中的唯一名称来标识资源。

urn:isbn:9780141036144
urn:ietf:rfc:7230

上面两个 URN 标识了下面的资源:
• 乔治·奥威尔所著的《1984》
• IETF规范7230,超文本传输​​协议 (HTTP/1.1):Message Syntax and Routing.

三者关系图
nginx基础入门_第2张图片
通过下面的例子(源自 Wikipedia),我们可以很好地理解URN 和 URL之间的区别。如果是一个人,我们会想到他的姓名和住址。

URL类似于住址,它告诉你一种寻找目标的方式(在这个例子中,是通过街道地址找到一个人)。要知道,上述定义同时也是一个URI。

相对地,我们可以把一个人的名字看作是URN;因此可以用URN来唯一标识一个实体。由于可能存在同名(姓氏也相同)的情况,所以更准确地说,人名这个例子并不是十分恰当。更为恰当的是书籍的ISBN码和产品在系统内的序列号,尽管没有告诉你用什么方式或者到什么地方去找到目标,但是你有足够的信息来检索到它。

关于URL:

URL是URI的一种,不仅标识了Web 资源,还指定了操作或者获取方式,同时指出了主要访问机制和网络位置。
关于URN:

URN是URI的一种,用特定命名空间的名字标识资源。使用URN可以在不知道其网络位置及访问方式的情况下讨论资源。
现在,如果到Web上去看一下,你会找出很多例子,这比其他东西更容易让人困惑。我只展示一个例子,非常简单清楚地告诉你在互联网中URI 、URL和URN之间的不同。
我们一起来看下面这个虚构的例子。
这是一个URI:“http://bitpoetry.io/posts/hello.html#intro”
“http://”是定义如何访问资源的方式。
“bitpoetry.io/posts/hello.html”是资源存放的位置。
“#intro”是资源。
URL是URI的一个子集,告诉我们访问网络位置的方式。在我们的例子中,URL应该如下所示:
“http://bitpoetry.io/posts/hello.html”
URN是URI的子集,包括名字(给定的命名空间内),但是不包括访问方式,如下所示:
“bitpoetry.io/posts/hello.html#intro”
就是这样。现在你应该能够辨别出URL和URN之间的不同。

如果你忘记了这篇文章的内容,至少要记住一件事:URI可以被分为URL、URN或两者的组合。如果你一直使用URI这个术语,就不会有错。

统一资源标识符的语法 (URL)

协议
nginx基础入门_第3张图片
“http://” 告诉浏览器使用何种协议。对于大部分 Web 资源,通常使用 HTTP 协议或其安全版本,HTTPS 协议。
另外,浏览器也知道如何处理其他协议。例如, “mailto:” 协议指示浏览器打开邮件客户端;“ftp:”协议指示浏览
器处理文件传输。

常见的方案有:
nginx基础入门_第4张图片
主机
nginx基础入门_第5张图片
www.example.com 既是一个域名,也代表管理该域名的机构。它指示了需要向网络上的哪一台主机发起请
求。当然,也可以直接向主机的 IP address 地址发起请求。但直接使用 IP 地址的场景并不常见。

端口
nginx基础入门_第6张图片
:80 是端口。它表示用于访问 Web 服务器上资源的技术“门”。如果访问的该 Web 服务器使用HTTP协议的标准
端口(HTTP为80,HTTPS为443)授予对其资源的访问权限,则通常省略此部分。否则端口就是 URI 必须的部分。

路径
nginx基础入门_第7张图片
/path/to/myfile.html 是 Web 服务器上资源的路径。在 Web 的早期,类似这样的路径表示 Web 服务器上的物理文件位置。现在,它主要是由没有任何物理实体的 Web 服务器抽象处理而成的。

查询
nginx基础入门_第8张图片
?key1=value1&key2=value2 是提供给 Web 服务器的额外参数。这些参数是用 & 符号分隔的键/值对列表。Web 服务器可以在将资源返回给用户之前使用这些参数来执行额外的操作。每个 Web 服务器都有自己的参数规则,想知道特定 Web 服务器如何处理参数的唯一可靠方法是询问该 Web 服务器所有者。

片段
nginx基础入门_第9张图片
#SomewhereInTheDocument 是资源本身的某一部分的一个锚点。锚点代表资源内的一种“书签”,它给予浏览器显示位于该“加书签”点的内容的指示。 例如,在HTML文档上,浏览器将滚动到定义锚点的那个点上;在视频或音频文档上,浏览器将转到锚点代表的那个时间。值得注意的是 # 号后面的部分,也称为片段标识符,永远不会与请求一起发送到服务器。

示例

  • https://developer.mozilla.org/en-US/docs/Learn
  • [email protected]:mdn/browser-compat-data.git
  • ftp://example.org/resource.txt

HTTP protocol 概述

官方链接: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Overview.

知识点

  1. 概述:
    图示
    nginx基础入门_第10张图片
    我们获得的图像,影音,广告都是由web服务器 get而来。

概览
HTTP是一种能够获取如 HTML 这样的网络资源的通讯协议。它是 Web 上数据交换的基础,是一种
client-server 协议,也就是说请求通常是由像浏览器这样的接受方发起的。一个完整的web文档是由不同的子文档重新组建而成的,像是文本、布局描述、图片、视频、脚本等等。

HTTP被设计于上20世纪90年代初期,是一种可扩展性的协议。它是应用层的协议,虽然理论上它
可以通过任何可靠的传输协议来发送,但是它还是通过TCP,或者是TLS-加密的TCP连接来发送。因为
它很好的扩展性,时至今日它不仅被用来传输超文本文档,还用来传输图片、视频或者向服务器发送如
HTML表单这样的信息。HTTP还可以根据网页需求,来获取部分web文档的内容来更新网页。

requests
客户端和服务端通过交换各自的消息来进行交互。通常由像浏览器这样的客户端发出的消息叫做
requests,那么被服务端回应的消息就叫做 responses。
nginx基础入门_第11张图片

  1. 组件系统

HTTP是一个client-server协议:请求通过一个实体被发出,实体也就是用户代理。大多数情况下,这
个用户代理都是指浏览器,当然它也可能是任何东西,比如一个爬取网页来生成和维护搜索引擎索引的机器。
每一个发送到服务器的请求,都会被服务器处理并且返回一个消息,也就是response。在client与server之
间,还有许许多多的被称为proxies的实体,他们的作用与表现各不相同,比如有些是网关,还有些是caches等。


1. 客户端:user-agent
严格意义来说,user-agent就是任何能够为用户发起行为的工具。但实际上,这个角色通常都是由浏览器
来扮演。对于发起请求来说,浏览器总是作为发起一个请求的实体。
要渲染出一个网页,浏览器首先要发送第一个请求来获取这个页面的HTML文档,再解析它并根据文档中的
资源信息发送其他的请求来获取脚本信息,或者CSS来进行页面布局渲染,还有一些其它的页面资源(如图片
和视频等)。然后,它把这些资源结合到一起,展现出来一个完整的文档,也就是网页。打开一个网页后,浏
览器还可以根据脚本内容来获取更多的资源来更新网页。
一个网页就是一个超文本文档,也就是说有一部分显示的文本可能是链接,启动它(通常是鼠标的点击)就
可以获取一个新的网页。网页使得用户可以控制它的user-agent来导航Web。浏览器来负责翻译HTTP请求的命
令,并翻译HTTP的返回消息让用户能明白返回消息的内容。

2. Web服务端
在上述通信过程的另一端,就是一个Web Server来服务并提供客户端请求的文档。Server只是虚拟意义上:
它可以是许多共同分担负载(负载平衡)的一组服务器组成的计算机群,也可以是一种复杂的软件,通过向其他
计算机发起请求来获取部分或全部资源的软件。

3. Proxies
在浏览器和服务器之间,有许多计算机和其他设备转发了HTTP的消息。因为Web栈层次结构的原因,它们大多数都出现在传输层、网络层和物理层上,对于HTTP的应用层来说就是透明的(虽然它们可能会对应用层的性能有重要影响)。而还有一部分表现在应用层上的,就叫做proxies了。Proxies既可以表现得透明,又可以不透明(看请求是否通过它们),主要表现在这几个功能上:

  1. 报文
    请求
    nginx基础入门_第12张图片
    元素
    • 一个HTTP的method,经常是由一个动词像GET, POST 或者一个名词像OPTIONS,HEAD来定义客户端的动
    作行为的。通常客户端的操作都是获取资源(用GET方法)或者发送一个HTML form表单的值(用POST方法),
    虽然在一些情况下也会有其他的操作。
    • 要获取的资源的路径,通常是上下文中就很明显的元素资源的URL,它没有protocol (http://),domain(developer.mozilla.org),或是TCP的port(HTTP是80端口)。
    • HTTP协议的版本号。
    • 为服务端表达其他信息的可选择性的headers。

回应
nginx基础入门_第13张图片
元素
• HTTP的版本号。
• 一个状态码(status code),来告知对应的请求发送成功或失败,以及失败的原因。
• 一个状态信息,这个信息是非权威的状态码描述信息,也就是说可以由服务端自行设定的。
• HTTP headers,与请求的很像。
• 可选的,但是比在请求报文中更加常见地包含获取资源的body。

HTTP headers
实验分析http报头信息
目的:wget下载一个源码包,分析HTTP头部的信息,通过wget -d选项,学习HTTP头部字段信息。
了解http通信原理,为后期优化打下基础。

  1. 执行下载

wget -d http://nginx.org/download/nginx-1.12.1.tar.gz

  1. 分析Debug信息
 DEBUG output created by Wget 1.14 on linux-gnu.
 ---request begin---                        请求开始
 GET /download/nginx-1.12.1.tar.gz HTTP/1.1       动作下载 页面地址 HTTP版本
User-Agent: Wget/1.14 (linux-gnu)            代理程序:wget
Accept: */*                     接收的类型:任何类型
Host: nginx.org                      目标主机:nginxorg
Connection: Keep-Alive                   链接类型:启动长连接
---request end---                              请求结束
HTTP request sent, awaiting response...         发送请求中

---response begin---                  响应开始
HTTP/1.1 200 OK                       协议版本 状态码 结果
Server: nginx/1.13.3                        服务器版本
Date: Fri, 06 Oct 2017 09:05:15 GMT          相应时间
Content-Type: application/octet-stream           接收应用类型:字节流(软件类)
Content-Length: 981093                  文档大小
Last-Modified: Tue, 11 Jul 2017 15:45:09 GMT        资源最后修改的时间(stat文件即可查看)
Connection: keep-alive               长连接开启
Keep-Alive: timeout=15                   长连接有效期
ETag: "5964f285-ef865"                  校验值
Accept-Ranges: bytes                 接收范围:字节的范围
---response end---
200 OK
Registered socket 3 for persistent reuse.
Length: 981093 (958K) [application/octet-stream]
Saving to: ‘nginx-1.12.1.tar.gz’


  1. 相关资料

3.nginx部署YUM

官网链接: http://www.nginx.org.

Nginx版本类型

  • Mainline version: 主线版,即开发版

  • Stable version: 最新稳定版,生产环境上建议使用的版本,如下图:
    nginx基础入门_第14张图片

  • Legacy versions: 遗留的老版本的稳定版

配置YUM源

1.12
官方图示
nginx基础入门_第15张图片
操作示范
nginx基础入门_第16张图片

1.15
官方文档里的步骤如下:

RHEL/CentOS

Install the prerequisites:

sudo yum install yum-utils

vim /etc/yum.repos.d/nginx.repo 创建文件并把如下内容复制到文件里

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key

By default, the repository for stable nginx packages is used. If you would like to use mainline nginx packages, run the following command:
执行以下命令

sudo yum-config-manager --enable nginx-mainline

To install nginx, run the following command:
接下来就是安装了

sudo yum install nginx

When prompted to accept the GPG key, verify that the fingerprint matches 573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62, and if so, accept it.

安装

环境问题注意关闭防火墙和selinux
setenforce 0
systemctl stop firewalld

yum -y install nginx
systemctl start nginx
systemctl enable nginx
nginx -V 查看安装附带的功能模块

到这里nginx就算是安装完成了,浏览器输入IP地址开始测试
nginx基础入门_第17张图片

4.Nginx 配置文件

所有文件
rpm -ql nginx

/etc/logrotate.d/nginx     日志轮转
/etc/nginx/nginx.conf     总配置文件
/etc/nginx/conf.d     子配置文件夹
/etc/nginx/conf.d/default.conf 	   默认的网站配置文件
/etc/nginx/fastcgi_params 			动态网站模块文件-python,php所需的相关变量
/etc/nginx/scgi_params 
/etc/nginx/uwsgi_params
/etc/nginx/koi-utf 		字符集,文件编码
/etc/nginx/win-utf
/etc/nginx/koi-win
/etc/nginx/mime.types 		文件关联程序     网站文件类型 和 相关处理程序
/etc/nginx/modules      模块文件夹。第三方模块

/etc/sysconfig/nginx	
 			# Configuration file for the nginx service.
 			NGINX=/usr/sbin/nginx
 			CONFFILE=/etc/nginx/nginx.conf
 			
/etc/sysconfig/nginx-debug
		# Configuration file for the nginx-debug service.
		NGINX=/usr/sbin/nginx-debug
		CONFFILE=/etc/nginx/nginx.conf
		LOCKFILE=/var/lock/subsys/nginx-debug
		
/usr/lib/systemd/system/nginx-debug.service 	nginx调试程序启动脚本
/usr/lib/systemd/system/nginx.service systemctl		 服务脚本。
/usr/sbin/nginx 			主程序
/usr/sbin/nginx-debug			nginx调试程序
/usr/share/doc/nginx-1.12.1			 文档
/usr/share/doc/nginx-1.12.1/COPYRIGHT
/usr/share/man/man8/nginx.8.gz			 man 手册
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html			 默认主页

/var/cache/nginx
			 缓存各种
			 ls /var/cache/nginx/       client_temp fastcgi_temp proxy_temp scgi_temp uwsgi_temp
			
/var/log/nginx      日志文件夹
ls /var/log/nginx/ 			access.log error.log
/usr/lib64/nginx			Nginx模块目录


5.Nginx 编译参数

6.Nginx 基本配置

观察主配置文件
分类

  • CoreModule 核心模块 (进程数等)
  • EventsModule 事件驱动模块(工作模式等)
  • HttpCoreModule http内核模块(文档程序类型,配置文件等)
    模块功能:
  1.  全局/核心块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
    
  2. events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
    
  3. http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
    
  4. server块:配置虚拟主机的相关参数,一个http中可以有多个server。
    
  5. location块:配置请求的路由,以及各种页面的处理情况。

代码: vim /etc/nginx/nginx.conf

user nginx;     运行nginx程序的独立账号
worker_processes 1; 		启动的worker进程数量(CPU数量一致或auto)
error_log /var/log/nginx/error.log warn;		错误日志存放位置
pid /var/run/nginx.pid;
events {	事件
use epoll;      事件驱动模型epoll【默认】
                事件驱动模型分类,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 10240;      //每个worker进程允许处理的最大连接数,例如10240,65535
}
http {
include /etc/nginx/mime.types;		文档和程序的关联记录
default_type application/octet-stream;		字节流处理方式
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 /var/log/nginx/access.log main;  

sendfile on;          优化参数
			高效传输文件的模式   Nginx高级篇sendfile配置
sendfile: 设置为on表示启动高效传输文件的模式。sendfile可以让Nginx在传输文件时直接在磁盘和tcp socket之间传输数据。如果这个参数不开启,会先在用户空间(Nginx进程空间)申请一个buffer,用read函数把数据从磁盘读到cache,再从cache读取到用户空间的buffer,再用write函数把数据从用户空间的buffer写入到内核的buffer,最后到tcp socket。开启这个参数后可以让数据不用经过用户buffer。

#tcp_nopush on;	    优化参数    也就是说tcp_nopush = on 会设置调用tcp_cork方法,这个也是默认的,结果就是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。

keepalive_timeout 65; 		  优化参数
							  长连接
#gzip on;         压缩参数
include /etc/nginx/conf.d/*.conf;           包含子配置文件夹

观察默认虚拟主机配置文件
vim /etc/nginx/conf.d/default.conf

server {		默认网站配置文件
listen 80;		监听端口
server_name localhost;		FQDN
#charset koi8-r;		网页字符类型
#access_log /var/log/nginx/host.access.log main;		日志
location / {
root /usr/share/nginx/html;		主目录
index index.html index.htm;		默认主页名
}
#error_page 404 /404.html;		错误页面
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;		错误页面
location = /50x.html {		错误页面
root /usr/share/nginx/html;		错误页面主目录
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80		代理设置
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000		动态网站设置
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root     访问控制部分
# concurs with nginx's one
#location ~ /\.ht {
# deny all;
#}
}

启动一个新的虚拟主机

  1.  vim /etc/nginx/conf.d/xuleilinux.conf 
    
server     {
listen    80;
server_name    xuleilinux.com;
location / {
root    /xuleilinux;
index     index.html ;
}
}
server 虚拟主机
listen 监听端口
server_name 服务器名称
location 网站目录设置
root 网站主目录在本地的路径
index 主页文件名
http{} 是整个服务器,所有虚拟主机的设置。
server{}是某一个虚拟主机的设置
location{} 是某一个页面的设置。

mkdir /xuleilinux
echo 我爱你 > /xuleilinux/index.html

  1. 重启服务
  2. 域名解析和访问

7.Nginx 日志Log

日志配置

1.日志模块
官方文档: http://nginx.org/en/docs/http/ngx_http_log_module.html.
日志模块的名称:ngx_http_log_module

2.相关指令

 - log_format        日志格式
 - access_log       访问日志
 - error_log           错误日志
 - open_log_file_cache     日志缓存

3.日志的格式和命令
log_format
简介:
Nginx有非常灵活的日志记录模式。每个级别的配置可以有各自独立的访问日志。日志格式通过log_format命令定义。

定义位置设置
主配置文件里日志的部分配置
vim /etc/nginx/nginx.conf
nginx基础入门_第18张图片

 >    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

日志格式允许包含的变量

 -  $remote_addr,      远程地址: 记录客户端IP地址
 - $remote_user     远程用户:记录客户端用户名称
 - [$time_local]       本地时间:服务器自身时间
 - $request               请求:记录请求的URL和HTTP协议
 "GET /1.html HTTP/1.1""GET /index.html HTTP/1.1"
 - $status  状态:记录请求状态   
 如:200  404  503  100  301
 - $body_bytes_sent  发送给客户端的字节数,不包括响应头的大小
 - $http_referer  记录从哪个页面链接访问过来的  (超链接)
 - $http_user_agent     记录客户端浏览器相关信息,如火狐、IE
 - $http_x_forwarded_for   代理IP

4.访问日志和错误日志
access_log 和 error_log

access_log

某条日志记录

 > 192.168.100.254 - - [17/Dec/2017:14:45:59 +0800] "GET /nginx-logo.png HTTP/1.1" 200 368 "http://192.168.100.10/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:57.0) Gecko/20100101 Firefox/57.0" "-"

某条日志记录含义

- 192.远程主机IP   
-    — —      用户
- 【2017】时间
- get获得,下载,还有post提交。
-  /nginx-logo.png  下载图片
- http版本
- 状态码 什么结果。对,还是错
- 368 字节大小
- 引用自哪个连接,主页http://192.168.100.10/
- Mozilla 5.0浏览器的版本
- Windows NT 客户端系统类型
- -远程客户端主机地址  (请看注释)

日志轮转

Nginx安装,会默认启动日志轮转。

rpm -ql nginx| grep log

此命令查看本机日志轮转配置文件和日志存放文件

如下两个文件:

/etc/logrotate.d/nginx
/var/log/nginx

观察日志轮转配置文件

vim /etc/logrotate.d/nginx

- /var/log/nginx/*log {         待切割的日志
-     create 0644 nginx nginx   创建新的日志文件,属主
-     daily   天
-     rotate 10   10份
-     missingok   丢失不提示
-     notifempty    空文件的话,不转储
-     compress   压缩
-     sharedscripts   轮转后脚本
>     postrotate
>             /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
>     endscript
USR1亦通常被用来告知应用程序重载配置文件;例如,向Apache HTTP服务器发送一个USR1信号将导致以下步骤的发生:停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。
- }

轮转语句

指令 /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf

日志分析

常用字段

  >  $remote_addr       $1       远程客户端地址    
  >  $time_local        $4    本机时间
  >  $request           $7    请求URL
  >  $status            $9    状态码
  >  $body_bytes_sent   $10    请求体积

案例:
链接: https://pan.baidu.com/s/1RWxGI2N0ekfCG72Hbt7PIA.
提取码:zlzl
里面有一些统计的日志文件,用于学习使用。

  1. 统计2017年9月5日 PV量
grep '05/Sep/2017' cd.mobiletrain.org.log |wc -l             1260条

8点-9点间

grep '05/Sep/2017:08' sz.mobiletrain.org.log  |wc -l
或者
awk '$4>="[05/Sep/2017:08:00:00" && $4<="[05/Sep/2017:09:00:00" {print $0}'  sz.mobiletrain.org.log | wc -l
  1. 统计2017年9月5日 一天内访问最多的10个IP(ip top10)
grep '05/Sep/2017' cd.mobiletrain.org.log | awk '{ ips[$1]++ } END{for(i in ips){print i,ips[i]} } '| sort -k2 -rn | head -n10

  1. 统计2017年9月5日 访问大于100次的IP
 grep '05/Sep/2017' cd.mobiletrain.org.log | awk '{ ips[$1]++ } END{for(i in ips){ if(ips[i]>100)  {print i,ips[i]}} } '| sort -k2 -rn | head -n10
  1. 统计2017年9月5日 访问最多的10个页面($request top 10)
grep '05/Sep/2017' cd.mobiletrain.org.log |awk '{urls[$7]++} END{for(i in urls){print urls[i],i}}' |sort -k1 -rn |head -n10
  1. 统计2017年9月5日 每个URL访问内容总大小($body_bytes_sent)
grep '05/Sep/2017' sz.mobiletrain.org.log |
awk '{ urls[$7]++; size[$7]+=$10}
END{for(i in urls){print urls[i],size[i],i}}'|
sort -k1 -rn | head -n10
  1. 统计2017年9月5日 每个IP访问状态码数量($status)
grep '05/Sep/2017' cd.mobiletrain.org.log | 
awk '{ ip_code[$1" "$9]++}
END{ for(i in ip_code){print i,ip_code[i]} }' | 
sort -k1 -rn | head -n10
  1. 统计2017年9月5日 每个IP访问状态码为404及出现次数($status)
grep '05/Sep/2017' cd.mobiletrain.org.log |
 awk '$9=="404"{ccc[$1" "$9]++}
END{for(i in ccc){print i,ccc[i]}}'  | 
sort -k3 -rn

或者

grep '05/Sep/2017' sz.mobiletrain.org.log | 
awk '{if($9=="404"){ip_code[$1" "$9]++}}
END{for(i in ip_code){print i,ip_code[i]}}'
  1. 统计前一分钟的PV量
date=$(date -d '-1 minute' +%d/%b/%Y:%H:%M);awk  -v date=$date '$0 ~ date {i++}  END{print i}'    sz.mobiletrain.org.log
shell中的变量在awk程序中无法使用,因为在执行AWK时,
是一个新的进程去处理的,因此就需要-v 来向awk程序中传参数了,
你比如在shell程序中有一个变量a=15,你在awk程序中直接使用变
量a是不行的,而你用awk -v b=a, 这样在AWK程序中就可以
使用变量b了!也就相当于使用a了! 


# date=$(date -d '-1 minute' +%Y:%H:%M);  awk -v date=$date '$0 ~ date{i++}END{print i}' /var/log/nginx/xuleilinux.access.log 
  1. 统计2017年9月5日 8:30-9:00,每个IP,出现404状态码的数量
awk '$4>="[05/Sep/2017:08:30:00" && 
$4<="[05/Sep/2017:09:00:00" 
{if($9=="404"){ip_code[$1" "$9]++}}
END{for(i in ip_code){print i,ip_code[i]}}' 
sz.mobiletrain.org.log 
  1. 统计2017年9月5日 各种状态码数量
grep '05/Sep/2017' sz.mobiletrain.org.log  |  awk '{code[$9]++} END{for(i in code){print i,code[i]}}'

百分比
grep '05/Sep/2017' sz.mobiletrain.org.log | awk '{code[$9]++;total++} END{for(i in code){printf i" ";printf code[i]"\t";printf "%.2f",code[i]/total*100;print "%"}}'

8.Nginx WEB模块

连接状态

  1. stub_status_module 目的:展示用户和nginx链接数量信息。
  2. 查询模块是否安装
nginx -V 2>&1 | grep stub_status 
  1. 启动状态模块
    1 访问默认站点的状态模块(注意:错误验证)
    http://10.18.41.64/nginx_status
    nginx基础入门_第19张图片未启用

2 配置状态模块
进入虚拟主机配置文件

vim /etc/nginx/conf.d/default.conf

请写在server内
server {
location /nginx_status {	
stub_status;
allow all;
}
}

3 重启服务再次访问

systemctl restart nginx

观察连接数 和请求数。
示例:在这里插入图片描述
解释

 - Active connections: 22	当前活动的连接数
 - server accepts handled requests	 服务器接受处理请求 
  17 17 24
  17	总连接数connection(TCP)
  17	成功的连接数connection (TCP)    失败连接=(总连接数-成功连接数)
  24 	总共处理的请求数requests(HTTP)      
  connection  连接数,tcp连接          
  request  http请求GET/POST/DELETE/UPLOAD      
  
  Reading: 2	        读取客户端Header的信息数	     请求头
  Writing: 1		返回给客户端的header的信息数	 响应头
  Waiting: 19	        等待的请求数,开启了keepalive

关于链接的问题
  1. 什么是链接
    OSI封装回顾
    nginx基础入门_第20张图片
    TCP封装结构
    nginx基础入门_第21张图片
    TCP三次握手
    nginx基础入门_第22张图片
    TCP四次挥手/四次断开
    nginx基础入门_第23张图片

TCP机制
四大计时器:

重传计时器(Retransmession)

为了防止数据报丢失,当TCP发送一个报文时,就启动重传计时器,有2种情况:
1.若在计时器超时之前收到了特定报文的确认,则撤消这个计时器;
2.特定数据报在计时器超时前没有收到确认,则重传该数据报,并把计时器复位

持久计时器(Persistance)

前面在流量控制篇提到死锁现象
要解开死锁,TCP为每一个连接使用一个持久计时器
当发送端TCP接收到rwnd=0的确认时,就启动持久计时器,当计时器截止时间到时,发送端TCP需要发送一个特殊的报文,叫做探测报文
当发送端TCP接收到rwnd=0的确认时,就启动持久计时器,当计时器截止时间到时,发送端TCP需要发送一个特殊的报文,叫做探测报文
该报文只有1字节,有序号,但无需确认
探测报文提醒接收端TCP:确认已丢失,必须重传
持久计时器截止时间设置为重传时间的数值,但是,如果没有收到从接收端回来的响应,则需要发送另外一个探测报文,并将持久计时器的值加倍和复位
持久计时器截止时间设置为重传时间的数值,但是,如果没有收到从接收端回来的响应,则需要发送另外一个探测报文,并将持久计时器的值加倍和复位
如果结果和上面一样,发送端继续发送探测报文,直到其截止时间增大到阈值(通常为60s)为止
在这以后,发送端每60s发送一个探测报文,直到窗口重新打开

保活计时器(keep-alive)

在某些实现中要使用keeplive timer来防止两个TCP之间出现长时间的空闲
比如客户端打开了服务器端的连接,传送了一些数据,然后就保持静默了
也许该客户端除了故障,在这种情况下,这个连接就永远处于打开状态
保活计时器的解决方法为,当服务器端收到客户端的信息时,就把计时器复位,超时通常设置2小时
若服务器2小时还没有收到客户的信息,就发送探测报文
若发送10个同样的报文(每个相隔75s)还没有收到响应,就认为客户端出了故障,终止这个连接

时间等待(time-wait)

如果最后一个ACK报文丢失了,那么服务器TCP(它为最后的FIN设置了计时器)以为它的FIN丢失了,因而重传

TCP流控/拥塞管理
原理:

接收端处理数据的速度是有限的,如果发送方的速度太快,就会把缓冲区u打满。这个时候如果继续发送数据,就会导致丢包等一系列连锁反应。
所以TCP支持根据接收端能力来决定发送端的发送速度。这个机制叫做流控制。

窗口大小:

(接收端向发送端主机通知自己可以接受数据的大小,这个大小限制就叫做窗口大小)

  1. 什么是请求
    一次HTTP查询

  2. keepalived
    长连接设置
    Httpd守护进程,一般都提供了keep-alive timeout时间设置参数。比如nginx的keepalive_timeout,和Apache的KeepAliveTimeout。这个 keepalive_timout时间值意味着:一个http产生的tcp连接在传送完最后一个响应后,还需要hold住 keepalive_timeout秒后,才开始关闭这个连接。当httpd守护进程发送完一个响应后,理应马上主动关闭相应的tcp连接,设置 keepalive_timeout后,httpd守护进程会想说:”再等等吧,看看浏览器还有没有请求过来”,这一等,便是 keepalive_timeout时间。如果守护进程在这个等待的时间里,一直没有收到浏览发过来http请求,则关闭这个http连接。

  3. 关闭长连接会如何

systemctl restart nginx

  1. 再次刷新状态也观察

随机主页

random_index_module
目的:将主页设置成随机页面,是一种微调更新机制

启动随机主页
1 创建主页目录

mkdir /app

2 创建多个主页

touch /app/{blue.html,green.html,red.html,.yellow.html}

在不同的页面书写不同的内容,例如



green color<<span class="token operator">/</span>title>
<<span class="token operator">/</span>head>
<body style=<span class="token string">"background-color:green"</span>>
<h1>green color<span class="token operator">!</span><<span class="token operator">/</span>h1>
<<span class="token operator">/</span>body>
<<span class="token operator">/</span>html>
</code></pre> 
  <ol start="3"> 
   <li>启动随机主页</li> 
  </ol> 
  <pre><code class="prism language-powershell">vim <span class="token operator">/</span>etc<span class="token operator">/</span>nginx<span class="token operator">/</span>conf<span class="token punctuation">.</span>d<span class="token operator">/</span>default<span class="token punctuation">.</span>conf     进入虚拟主机配置文件

server<span class="token punctuation">{</span>

location <span class="token operator">/</span> <span class="token punctuation">{</span>
     <span class="token comment">#root   /usr/share/nginx/html;</span>
     <span class="token comment">#index  index.html index.htm;</span>
     root <span class="token operator">/</span>app<span class="token punctuation">;</span>
     random_index on<span class="token punctuation">;</span>              
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
完成该试验后,请注释掉该功能。
避免影响其他实验。

重启服务
systemctl restart nginx
刷新主页,观察变化
</code></pre> 
  <p>4 请注意隐藏文件并不会被随机选取</p> 
  <h4>替换模块</h4> 
  <p>sub_module</p> 
  <p>目的:网页内容替换。<br> 如果我们用模板生成网站的时候,因为疏漏或者别的原因造成代码不如意,但是此时因为文件数量巨大,不方便全部重新生成,那么这个时候我们就可以用此模块来暂时实现纠错。另一方面,我们也可以利用这个实现服务器端文字过滤的效果。</p> 
  <ol> 
   <li>启动替换</li> 
  </ol> 
  <pre><code class="prism language-powershell">vim <span class="token operator">/</span>etc<span class="token operator">/</span>nginx<span class="token operator">/</span>conf<span class="token punctuation">.</span>d<span class="token operator">/</span>default<span class="token punctuation">.</span>conf     启动nginx默认页面

server <span class="token punctuation">{</span>  在server<span class="token punctuation">{</span>下面插入
sub_filter nginx <span class="token string">'I love you'</span><span class="token punctuation">;</span>     
sub_filter_once on<span class="token punctuation">;</span>      
location <span class="token operator">/</span> <span class="token punctuation">{</span> 
root   <span class="token operator">/</span>usr<span class="token operator">/</span>share<span class="token operator">/</span>nginx<span class="token operator">/</span>html<span class="token punctuation">;</span>
index  index<span class="token punctuation">.</span>html index<span class="token punctuation">.</span>htm<span class="token punctuation">;</span>
替换模块  将nginx  替换成 I love you
单次替换 开启
<span class="token punctuation">}</span>

</code></pre> 
  <p>重启服务,测试页面<br> <a href="http://img.e-com-net.com/image/info8/560143be418b4df7b6a5011d6ac43bf4.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/560143be418b4df7b6a5011d6ac43bf4.jpg" alt="nginx基础入门_第24张图片" width="650" height="261" style="border:1px solid black;"></a><br> 只替换了一处。<br> 将单次替换关闭,再次刷新页面,即可看见<strong>全文替换</strong>。</p> 
  <blockquote> 
   <p>sub_filter_once off<br> <a href="http://img.e-com-net.com/image/info8/dfc47036c61849e8b2f7fc1092f116e2.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/dfc47036c61849e8b2f7fc1092f116e2.jpg" alt="nginx基础入门_第25张图片" width="650" height="279" style="border:1px solid black;"></a></p> 
  </blockquote> 
  <h4>文件读取</h4> 
  <p>模块 ngx_http_core_module</p> 
  <p>语法</p> 
  <pre><code class="prism language-powershell">Syntax: 	sendfile on <span class="token punctuation">|</span> off<span class="token punctuation">;</span>
Default: 	sendfile on<span class="token punctuation">;</span>
Context: http<span class="token punctuation">,</span> server<span class="token punctuation">,</span> location<span class="token punctuation">,</span> <span class="token keyword">if</span> in location

Syntax: 	tcp_nopush on <span class="token punctuation">|</span> off<span class="token punctuation">;</span>
Default: 	tcp_nopush off<span class="token punctuation">;</span>
Context: http<span class="token punctuation">,</span> server<span class="token punctuation">,</span> location

Syntax: 	tcp_nodelay on <span class="token punctuation">|</span> off<span class="token punctuation">;</span>
Default: 	tcp_nodelay on<span class="token punctuation">;</span>
Context: http<span class="token punctuation">,</span> server<span class="token punctuation">,</span> location
</code></pre> 
  <p>原理介绍</p> 
  <ol> 
   <li>sendfile<br> <em>未使用sendfile() 的传统网络传输过程:</em></li> 
  </ol> 
  <p>硬盘 >> kernel buffer >> user buffer>> kernel socket buffer >>协议栈</p> 
  <p>图示:<br> <a href="http://img.e-com-net.com/image/info8/bd231fe4922e43c4aef08bf037df34b2.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/bd231fe4922e43c4aef08bf037df34b2.jpg" alt="nginx基础入门_第26张图片" width="580" height="352" style="border:1px solid black;"></a><br> <em>使用 sendfile() 来进行网络传输的过程:</em></p> 
  <p>硬盘 >> kernel buffer (快速拷贝到kernelsocket buffer) >>协议栈<br> sendfile() 不但能减少切换次数而且还能减少拷贝次数。</p> 
  <ol start="2"> 
   <li>tcp_nopush</li> 
  </ol> 
  <p><em>未使用tcp_nopush()网络资源浪费</em></p> 
  <p>应用程序每产生一次操作就会发送一个包,而典型情况下一个包会拥有一个字节的数据以及40个字节长的包头,于是产生4000%的过载,很轻易地就能令网络发生拥塞。同时也浪费资源</p> 
  <p><em>使用tcp_nopush()网络传输效率提升</em></p> 
  <p>当包累计到一定大小后再发送。</p> 
  <ol start="3"> 
   <li>tcp_nodelay</li> 
  </ol> 
  <p>开启或关闭nginx使用TCP_NODELAY选项的功能。 这个选项仅在将连接转变为长连接的时候才被启用。<br> TCP_NODELAY是禁用Nagle算法,即数据包立即发送出去。<br> 由于Nagle和DelayedACK的原因,数据包的确认信息需要积攒到两个时才发送,长连接情况下,奇数包会造成延时40ms,所以tcp_nodelay会将ack立刻发出去。 如果不在长连接时,可以关闭此模块,因为ack会被立刻发出去。</p> 
  <p>启用模块</p> 
  <pre><code class="prism language-powershell">location <span class="token operator">/</span>video<span class="token operator">/</span> <span class="token punctuation">{</span>
    sendfile        on<span class="token punctuation">;</span>
    tcp_nopush  on<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre> 
  <p>默认启动,无需验证</p> 
  <h4>文件压缩</h4> 
  <p>原理介绍<br> 启动该模块,使文件传输前进行压缩,提升传输效率。<br> 模块: ngx_http_gzip_module</p> 
  <p>语法:</p> 
  <pre><code class="prism language-powershell">Syntax: 	gzip on <span class="token punctuation">|</span> off<span class="token punctuation">;</span>
Default: 	gzip off<span class="token punctuation">;</span>
Context: http<span class="token punctuation">,</span> server<span class="token punctuation">,</span> location<span class="token punctuation">,</span> <span class="token keyword">if</span> in location

Syntax: 	gzip_comp_level level<span class="token punctuation">;</span>
Default: 	gzip_comp_level 1<span class="token punctuation">;</span><span class="token punctuation">(</span>1~9<span class="token punctuation">)</span>
Context: http<span class="token punctuation">,</span> server<span class="token punctuation">,</span> location

Syntax: 	gzip_http_version 1<span class="token punctuation">.</span>0 <span class="token punctuation">|</span> 1<span class="token punctuation">.</span>1<span class="token punctuation">;</span>
Default: 	gzip_http_version 1<span class="token punctuation">.</span>1<span class="token punctuation">;</span>
Context: http<span class="token punctuation">,</span> server<span class="token punctuation">,</span> location
</code></pre> 
  <p>启用模块</p> 
  <ol> 
   <li> <p>观察未压缩传输<br> 拷贝图片至网站主目录<br> <a href="http://img.e-com-net.com/image/info8/ffc10bf8680140a2960d6a53cbcf005a.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/ffc10bf8680140a2960d6a53cbcf005a.jpg" alt=" " width="650" height="95"></a><br> 拷贝tar包至网站主目录<br> 压缩包的后缀使用.html<br> <a href="http://img.e-com-net.com/image/info8/2016f1e7b1d84160a80cf0d914084b63.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/2016f1e7b1d84160a80cf0d914084b63.jpg" alt="nginx基础入门_第27张图片" width="650" height="106" style="border:1px solid black;"></a><br> 拷贝文本至文件主目录<br> <a href="http://img.e-com-net.com/image/info8/7ad6ce353c984e4a97812d540b56bd29.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/7ad6ce353c984e4a97812d540b56bd29.jpg" alt=" " width="650" height="92"></a><br> 通过浏览器下载文件并观察下载后大小。</p> </li> 
   <li> <p>启用压缩功能</p> </li> 
  </ol> 
  <pre><code class="prism language-powershell">http <span class="token punctuation">{</span>
gzip on<span class="token punctuation">;</span>
gzip_http_version 1<span class="token punctuation">.</span>1<span class="token punctuation">;</span>
gzip_comp_level 2<span class="token punctuation">;</span>
gzip_types text<span class="token operator">/</span>plain application<span class="token operator">/</span>javascript application<span class="token operator">/</span>x<span class="token operator">-</span>javascript text<span class="token operator">/</span>css application<span class="token operator">/</span>xml text<span class="token operator">/</span>javascript application<span class="token operator">/</span>x<span class="token operator">-</span>httpd<span class="token operator">-</span>php image<span class="token operator">/</span>jpeg image<span class="token operator">/</span>gif image<span class="token operator">/</span>png<span class="token punctuation">;</span> 
gzip_static on<span class="token punctuation">;</span>

<span class="token comment">##  gzip_static on; # nginx对于静态文件的处理模块</span>

systemctl restart nginx    重启
</code></pre> 
  <ol start="3"> 
   <li>观察压缩传输</li> 
  </ol> 
  <ul> 
   <li>注意缓存</li> 
   <li>压缩包和图片类对象本身已经自带压缩功能。所以压缩比例较小低。</li> 
   <li>文本类对象在压缩试验中,压缩比例体现优越。</li> 
   <li>再通过浏览器下载文件并观察下载后大小。</li> 
  </ul> 
  <h4>页面缓存</h4> 
  <p>模块 : ngx_http_headers_module</p> 
  <p>expires起到控制页面缓存的作用,合理的配置expires可以减少很多服务器的请求要配置expires,可以在http段中或者server段中或者location段中加入。<br> Nginx(expires 缓存减轻服务端压力),</p> 
  <p>语法:</p> 
  <pre><code class="prism language-powereshell">Syntax: 	expires [modified] time;
                      expires  epoch | max | off;
Default: 	expires off;
Context: http, server, location, if in location
</code></pre> 
  <ul> 
   <li>epoch:指定“Expires”的值为 1 January,1970,00:00:01 GMT</li> 
   <li>max:指定“Expires”的值为10年。</li> 
   <li>-1:指定“Expires”的值为当前服务器时间-1s,即永远过期。</li> 
   <li>off:不修改“Expires”和"Cache-Control"的值</li> 
  </ul> 
  <p>原理介绍<br> 无缓存,每次访问服务器,均是全文传输。<br> 开启缓存可以加速浏览网站。</p> 
  <p>启用缓存</p> 
  <p>观察浏览器缓存<br> 1 开启浏览器缓存,浏览页面。(默认)<br> 第一次返回状态码200.页面对象全文传输<br> 第二次返回状态304.页面对象部分传输。</p> 
  <p>2 禁用缓存。浏览页面<br> 返回码200.全文传输<br> 理解浏览器缓存作用。</p> 
  <p>3 解析缓存原理<br> <a href="http://img.e-com-net.com/image/info8/fcb47f28e511424dbc55b84474eb224d.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/fcb47f28e511424dbc55b84474eb224d.jpg" alt="nginx基础入门_第28张图片" width="554" height="528" style="border:1px solid black;"></a></p> 
  <p>理解nginx服务器缓存<br> 4 开启服务器缓存模块<br> vim /etc/nginx/nginx.conf</p> 
  <pre><code class="prism language-powershell">    location <span class="token operator">/</span> <span class="token punctuation">{</span>
        root   <span class="token operator">/</span>usr<span class="token operator">/</span>share<span class="token operator">/</span>nginx<span class="token operator">/</span>html
        index  index<span class="token punctuation">.</span>html index<span class="token punctuation">.</span>htm<span class="token punctuation">;</span>
        expires 24h<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
</code></pre> 
  <p>5 再次浏览页面,观察响应头中出现服务器回复的缓存时间<br> <a href="http://img.e-com-net.com/image/info8/b95d684bb2ca474f8aed0b9878d926d8.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/b95d684bb2ca474f8aed0b9878d926d8.jpg" alt="nginx基础入门_第29张图片" width="456" height="409" style="border:1px solid black;"></a><br> 6 理解nginx服务器启动缓存时间,加速浏览。</p> 
  <ul> 
   <li>缺点是时效性降低。</li> 
  </ul> 
  <h4>防盗链</h4> 
  <p>模块: ngx_http_referer_module</p> 
  <p>语法:</p> 
  <pre><code class="prism language-powershell">Syntax: 	valid_referers none <span class="token punctuation">|</span> blocked <span class="token punctuation">|</span> server_names <span class="token punctuation">|</span> string <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">;</span>
Default: 	—
Context: server<span class="token punctuation">,</span> location

</code></pre> 
  <p>日志原理介绍</p> 
  <pre><code class="prism language-powershell">log_format  main  <span class="token string">'$remote_addr - $remote_user [$time_local] "$request" '</span>
                         <span class="token string">'$status $body_bytes_sent "$http_referer" '</span>
                         <span class="token string">'"$http_user_agent" "$http_x_forwarded_for"'</span><span class="token punctuation">;</span>

日志格式中的http_referer是记录,访问点引用的URL。也就是超链接的上一级地址。
通过这段地址,可以发现一种网络行为——盗链。非法盗链会影响站点的正常访问。
通过http_referer模块可以控制这一点。防止非法盗链现象。
</code></pre> 
  <p><mark>启动防盗链</mark><br> 展现盗链现象,启动防盗链<br> 1 搭建一个a.com网站,在主页中插入图片</p> 
  <pre><code class="prism language-powershell">vim index<span class="token punctuation">.</span>html
<img src=<span class="token string">'1.jpg'</span> <span class="token operator">/</span>>
</code></pre> 
  <p>注意要将1.jpg图片拷贝至网站主目录。</p> 
  <p>2 搭建一个b.com网站,在主页中盗链A网站的图片</p> 
  <pre><code class="prism language-powershell">vim index<span class="token punctuation">.</span>html
<img src=<span class="token string">'http://A网站的域名或者地址/1.jpg'</span> <span class="token operator">/</span>>    盗用链接

注意网站主目录中,根本没有图片。
</code></pre> 
  <p>3 访问两个网站页面。均能正常显示图片。<br> 4 注意b.com网站的日志<br> 日志正常。</p> 
  <pre><code class="prism language-powershell">192<span class="token punctuation">.</span>168<span class="token punctuation">.</span>100<span class="token punctuation">.</span>254 <span class="token operator">-</span> <span class="token operator">-</span> <span class="token punctuation">[</span>20<span class="token operator">/</span>Sep<span class="token operator">/</span>2017:15:10:27 <span class="token operator">+</span>0800<span class="token punctuation">]</span> <span class="token string">"GET / HTTP/1.1"</span> 200 42 <span class="token string">"-"</span> <span class="token string">"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:57.0) Gecko/20100101 Firefox/57.0"</span> <span class="token string">"-"</span>
</code></pre> 
  <p>5 注意a.com网站的日志<br> 日志不正常。日志莫名其妙的产生了。<br> 观察referer字段,发现被盗链了。</p> 
  <pre><code class="prism language-powershell">192<span class="token punctuation">.</span>168<span class="token punctuation">.</span>100<span class="token punctuation">.</span>254 <span class="token operator">-</span> <span class="token operator">-</span> <span class="token punctuation">[</span>20<span class="token operator">/</span>Sep<span class="token operator">/</span>2017:15:10:27 <span class="token operator">+</span>0800<span class="token punctuation">]</span> <span class="token string">"GET /1.jpg HTTP/1.1"</span> 200 1635350 <span class="token string">"http://192.168.100.20/"</span> <span class="token string">"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:57.0) Gecko/20100101 Firefox/57.0"</span>
</code></pre> 
  <p>6 启动a.com防盗链功能</p> 
  <pre><code class="prism language-powershell">location <span class="token operator">/</span> <span class="token punctuation">{</span>
        root   <span class="token operator">/</span>a<span class="token punctuation">.</span>com<span class="token punctuation">;</span>
        index  index<span class="token punctuation">.</span>html index<span class="token punctuation">.</span>htm<span class="token punctuation">;</span>
     
        valid_referers none blocked <span class="token operator">*</span><span class="token punctuation">.</span>a<span class="token punctuation">.</span>com<span class="token punctuation">;</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$invalid_referer</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            <span class="token keyword">return</span> 403<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
</code></pre> 
  <p>重启服务</p> 
  <p>7 再次访问b.com网站,盗链失败。</p> 
  <p>8 如果希望某些网站能够使用(盗链)资源:</p> 
  <pre><code class="prism language-powershell">location ~<span class="token operator">*</span> \<span class="token punctuation">.</span><span class="token punctuation">(</span>gif<span class="token punctuation">|</span>jpg<span class="token punctuation">|</span>png<span class="token punctuation">|</span>bmp<span class="token punctuation">)</span>$ <span class="token punctuation">{</span>
root <span class="token operator">/</span>a<span class="token punctuation">.</span>com
    valid_referers none blocked  <span class="token operator">*</span><span class="token punctuation">.</span>qfcloud<span class="token punctuation">.</span>top server_names ~tianyun ~\<span class="token punctuation">.</span>google\<span class="token punctuation">.</span> ~\<span class="token punctuation">.</span>baidu\<span class="token punctuation">.</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$invalid_referer</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">return</span> 403<span class="token punctuation">;</span>
        <span class="token comment">#rewrite .* http://qfcloud.top/403.jpg;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre> 
  <pre><code class="prism language-powershell">location <span class="token operator">/</span> <span class="token punctuation">{</span>
        root   <span class="token operator">/</span>a<span class="token punctuation">.</span>com<span class="token punctuation">;</span>
        index  index<span class="token punctuation">.</span>html index<span class="token punctuation">.</span>htm<span class="token punctuation">;</span>
     
        valid_referers none blocked <span class="token operator">*</span><span class="token punctuation">.</span>a<span class="token punctuation">.</span>com        server_name  192<span class="token punctuation">.</span>168<span class="token punctuation">.</span>100<span class="token punctuation">.</span><span class="token operator">*</span>  ~tianyun ~\<span class="token punctuation">.</span>google\<span class="token punctuation">.</span> ~\<span class="token punctuation">.</span>baidu\<span class="token punctuation">.</span>   b<span class="token punctuation">.</span>com<span class="token punctuation">;</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$invalid_referer</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            <span class="token keyword">return</span> 403<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
</code></pre> 
  <p>9 再次盗链,合法盗链成功。</p> 
  <h1>9.Nginx 访问限制</h1> 
  <p><mark>ngx_http_limit_req_module</mark><br> 启动请求频率限制</p> 
  <p>测试未限制情况下的访问 yum install -y httpd-tools<br> ab -n 100 -c 10 http://tianyun.me/</p> 
  <ol> 
   <li>启动限制</li> 
  </ol> 
  <blockquote> 
   <p>vim /etc/nginx/nginx.conf</p> 
  </blockquote> 
  <p>定义: limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;<br> 限制请求 二进制地址 限制策略的名称 占用10M空间 允许每秒1次请求<br> 引用: limit_req zone=req_zone;<br> 引用 限制策略的名称</p> 
  <p>配置</p> 
  <pre><code class="prism language-powershell">http <span class="token punctuation">{</span>
    limit_req_zone <span class="token variable">$binary_remote_addr</span> zone=req_zone:10m rate=1r<span class="token operator">/</span>s<span class="token punctuation">;</span>     定义

    server <span class="token punctuation">{</span>
        location <span class="token operator">/</span> <span class="token punctuation">{</span>
            root <span class="token operator">/</span>usr<span class="token operator">/</span>share<span class="token operator">/</span>nginx<span class="token operator">/</span>html<span class="token punctuation">;</span>
            index index<span class="token punctuation">.</span>html index<span class="token punctuation">.</span>htm<span class="token punctuation">;</span>
            limit_req zone=req_zone<span class="token punctuation">;</span>  		引用
            <span class="token comment">#limit_req zone=req_zone burst=5;</span>
            <span class="token comment">#limit_req zone=req_zone burst=5 nodelay; </span>
        <span class="token punctuation">}</span>
    }
}

引用限制
引用限制,但是令牌桶有5个。有延迟。速度慢
引用限制,但是令牌桶有5个。无延迟。速度快
burst=5 表示最大延迟请求数量不大于5。 如果太过多的请求被限制延迟是不需要的 ,这时需要使用nodelay参数,服务器会立刻返回503状态码。 
</code></pre> 
  <ol start="2"> 
   <li>重启服务,并测试<br> yum install -y httpd-tools<br> ab -n 100 -c 10 http://tianyun.me/</li> 
  </ol> 
  <pre><code class="prism language-powershell">This is ApacheBench<span class="token punctuation">,</span> Version 2<span class="token punctuation">.</span>3 <<span class="token variable">$Revision</span>: 1430300 $>
Benchmarking localhost <span class="token punctuation">(</span>be patient<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>done


Server Software:          nginx<span class="token operator">/</span>1<span class="token punctuation">.</span>12<span class="token punctuation">.</span>1
Server Hostname:        tianyun<span class="token punctuation">.</span>me
Server Port:                80

Document Path:          <span class="token operator">/</span>
Document Length:       671 bytes

Concurrency Level:      10
Time taken <span class="token keyword">for</span> tests:    0<span class="token punctuation">.</span>006 seconds
Complete requests:      100                 
Failed requests:            99                      失败的请求
   <span class="token punctuation">(</span>Connect: 0<span class="token punctuation">,</span> Receive: 0<span class="token punctuation">,</span> Length: 99<span class="token punctuation">,</span> Exceptions: 0<span class="token punctuation">)</span>
<span class="token function">Write</span> errors:                0
Non<span class="token operator">-</span>2xx responses:      99                      有问题的相应。
Total transferred:         73273 bytes
HTML transferred:       53834 bytes
Requests per second:  16131<span class="token punctuation">.</span>63 <span class="token punctuation">[</span><span class="token comment">#/sec] (mean)</span>
Time per request:       0<span class="token punctuation">.</span>620 <span class="token namespace">[ms]</span> <span class="token punctuation">(</span>mean<span class="token punctuation">)</span>
Time per request:       0<span class="token punctuation">.</span>062 <span class="token namespace">[ms]</span> <span class="token punctuation">(</span>mean<span class="token punctuation">,</span> across all concurrent requests<span class="token punctuation">)</span>
Transfer rate:             11543<span class="token punctuation">.</span>10 <span class="token namespace">[Kbytes/sec]</span> received
</code></pre> 
  <ol start="3"> 
   <li>观察错误日志</li> 
  </ol> 
  <blockquote> 
   <p>tail -f /var/log/nginx/error.log</p> 
  </blockquote> 
  <pre><code class="prism language-powershell">2017<span class="token operator">/</span>10<span class="token operator">/</span>08 01:05:08 <span class="token namespace">[error]</span> 23287<span class="token comment">#23287: *720 limiting requests, excess: 5.109 by zone "req_zone", </span>
client: 27<span class="token punctuation">.</span>216<span class="token punctuation">.</span>240<span class="token punctuation">.</span>201<span class="token punctuation">,</span> server: localhost<span class="token punctuation">,</span> request: <span class="token string">"GET / HTTP/1.0"</span><span class="token punctuation">,</span> host: <span class="token string">"tianyun.me"</span>

 limiting requests
 由于限制请求导致。
</code></pre> 
  <p>ngx_http_limit_conn_module<br> 目的:通过IP地址,限制链接(TCP)。但是实验环境无法测试<br> 启动连接频率限制</p> 
  <p><em>启动连接频率限制</em></p> 
  <ol> 
   <li>启动连接频率限制<br> vim /etc/nginx/nginx.conf</li> 
  </ol> 
  <pre><code class="prism language-powershell">http <span class="token punctuation">{</span>
	limit_conn_zone <span class="token variable">$binary_remote_addr</span> zone=conn_zone:10m<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
server <span class="token punctuation">{</span>
	location <span class="token operator">/</span> <span class="token punctuation">{</span>
	    <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
		limit_conn conn_zone 1<span class="token punctuation">;</span>
	<span class="token punctuation">}</span>
<span class="token punctuation">}</span>  

limit_conn_zone:全局定义限制对象(IP),存储区限制空间(10M)字节 

limit_conn:该指令指定每个给定键值的最大同时连接数,当超过这个数字时返回503(Service )错误。如(同一IP同一时间只允许有2个连接):

客户端的IP地址作为键。注意,这里使用的是 binary_remote_addr 变量,而不是 remote_addr 变量。
remote_addr变量的长度为7字节到15字节,而存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。
binary_remote_addr变量的长度是固定的4字节,存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。
1M共享空间可以保存3<span class="token punctuation">.</span>2万个32位的状态,1<span class="token punctuation">.</span>6万个64位的状态。
如果共享内存空间被耗尽,服务器将会对后续所有的请求返回 503 <span class="token punctuation">(</span>Service Temporarily Unavailable<span class="token punctuation">)</span> 错误。

 limit_conn_zone <span class="token variable">$binary_remote_addr</span> zone=conn_zone:10m模块开启对单个ip、单个会话同时存在的连接数的限制。这里定义一个记录区conn_zone,conn_zone的总容量是10m,该记录区针对于变量 <span class="token variable">$binary_remote_add</span>生效,这里是针对单个IP生效。该模块只是一个定义,配置在http配置段,需要配合limit_conn指令使用才生效, limit_conn conn_zone 1表示该location段使用conn_zone定义的 limit_conn_zone ,对单个IP限制同时存在一个连接。

单个IP,同时只允许有一个tcp连接

</code></pre> 
  <ol start="2"> 
   <li>测试<br> yum install -y httpd-tools</li> 
  </ol> 
  <pre><code class="prism language-powershell"> ab <span class="token operator">-</span>n 100 <span class="token operator">-</span>c 10 http:<span class="token operator">/</span><span class="token operator">/</span>服务器IP地址<span class="token operator">/</span>
 
 This is ApacheBench<span class="token punctuation">,</span> Version 2<span class="token punctuation">.</span>3 <<span class="token variable">$Revision</span>: 1430300 $>
Benchmarking localhost <span class="token punctuation">(</span>be patient<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>done

Server Software:         nginx<span class="token operator">/</span>1<span class="token punctuation">.</span>12<span class="token punctuation">.</span>1    
Server Hostname:        tianyun<span class="token punctuation">.</span>me
Server Port:                80

Document Path:           <span class="token operator">/</span>
Document Length:        671 bytes       文档长度

Concurrency Level:      10         当前并发数
Time taken <span class="token keyword">for</span> tests:    0<span class="token punctuation">.</span>006 seconds     消耗总时间
Complete requests:      100         完成请求数
Failed requests:           0         失败请求数
<span class="token function">Write</span> errors:               0
Total transferred:        90400 bytes   总的传输大小
HTML transferred:       67100 bytes         http传输大小
Requests per second:  15873<span class="token punctuation">.</span>02 <span class="token punctuation">[</span><span class="token comment">#/sec] (mean)   每秒钟处理多少个请求。</span>

</code></pre> 
  <ol start="3"> 
   <li>效果不明显</li> 
   <li>了解不同的网站压力测试工具</li> 
  </ol> 
  <h1>10.Nginx 访问控制</h1> 
  <p><mark>基于主机(ip)</mark><br> module<br> ngx_http_access_module</p> 
  <p>Directives</p> 
  <blockquote> 
   <p>allow 允许某些主机<br> deny 拒绝某些主机</p> 
  </blockquote> 
  <p>Syntax:</p> 
  <blockquote> 
   <p>Syntax: allow address | CIDR | unix: | all;<br> Context: http, server, location, limit_except</p> 
  </blockquote> 
  <p>启用控制<br> 1 限制主机访问</p> 
  <blockquote> 
   <p>vim /etc/nginx/conf.d/default.conf<br> server {<br> allow 10.18.45.65;<br> allow 10.18.45.181;<br> deny all;<br> }</p> 
  </blockquote> 
  <p>2 测试<br> 服务器无法访问</p> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1687332433575358464"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(nginx,linux)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1773602697044361216.htm"
                           title="浪潮 M5系列服务器IPMI无法监控存储RAID卡问题." target="_blank">浪潮 M5系列服务器IPMI无法监控存储RAID卡问题.</a>
                        <span class="text-muted">Songxwn</span>
<a class="tag" taget="_blank" href="/search/%E7%A1%AC%E4%BB%B6%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">硬件服务器</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>简介浪潮的M5代服务器,可能有WebBMC无法查看存储RAID/SAS卡状态的情况,可以通过以下方式修改。修改完成后重启BMC即可生效。ESXiIPMITools使用:https://songxwn.com/ESXi8_IPMI/(Linux也可以直接使用)Linux/ESXiIPMITool下载:https://songxwn.com/file/ipmitoolWindows下载:https:/</div>
                    </li>
                    <li><a href="/article/1773597535798099968.htm"
                           title="unblock with ‘mysqladmin flush-hosts‘ 解决方法" target="_blank">unblock with ‘mysqladmin flush-hosts‘ 解决方法</a>
                        <span class="text-muted">祈祷平安,加油</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/1.htm">数据库常见问题</a><a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a>
                        <div>MySqlHostisblockedbecauseofmanyconnectionerrors;unblockwith'mysqladminflush-hosts'解决方法环境:linux,mysql5.5.21错误:Hostisblockedbecauseofmanyconnectionerrors;unblockwith'mysqladminflush-hosts'原因:同一个ip在短时间内产</div>
                    </li>
                    <li><a href="/article/1773552600176721920.htm"
                           title="1.计算机处理器架构+嵌入式处理器架构及知识" target="_blank">1.计算机处理器架构+嵌入式处理器架构及知识</a>
                        <span class="text-muted">vv 啊</span>
<a class="tag" taget="_blank" href="/search/arm-linux%E5%AD%A6%E4%B9%A0/1.htm">arm-linux学习</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84/1.htm">系统架构</a>
                        <div>目录一:x86-64处理器架构二:Intel80386处理器(i386)1.i3862.i686三:嵌入式Linux知识:1.MinGW2.GNU计划2.1GNU工具链概述此次只分享英特尔和ADM处理器有关于x86的架构,至于嵌入式处理器架构请查看https://en.wikipedia.org/wiki/List_of_ARM_processors一:x86-64处理器架构x86-64,也称为x</div>
                    </li>
                    <li><a href="/article/1773505900905037824.htm"
                           title="linux基础命令(一)" target="_blank">linux基础命令(一)</a>
                        <span class="text-muted">运维搬运工</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a>
                        <div>Linux基础命令1、设置主机名1.1、hostname查看主机名[root@ansible~]#cat/etc/hostnameansible或[root@ansible~]#hostnameansible注意:主机名中不允许使用下划线“_”,可以用短横线“-”1.2、hostname临时修改主机名#临时修改直接修改的是内存中的,重启会失效[root@ansible~]#hostnameansi</div>
                    </li>
                    <li><a href="/article/1773495447948689408.htm"
                           title="docker怎么端口映射" target="_blank">docker怎么端口映射</a>
                        <span class="text-muted">Lance_mu</span>
<a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>1、默认固定的端口#Web服务器:WebApache或Nginx通常使用80端口HTTP:80HTTPS:443#数据库服务器MySQL:3306PostgreSQL:5432MongoDB:27017Redis:6379#邮件服务器SMTP:25POP3:110IMAP:143#其他服务SSH:22FTP:21DNS(域名解析):53代理服务器Squid:3128版本控制系统Git:9418(S</div>
                    </li>
                    <li><a href="/article/1773489909345091584.htm"
                           title="docker基础(一)" target="_blank">docker基础(一)</a>
                        <span class="text-muted">运维搬运工</span>
<a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8-docker/1.htm">容器-docker</a><a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>相关概念介绍Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖到一个可移植的容器中,然后发布到任何流行的linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,互相之间不会有任何接口。Docker有几个重要概念:dockerfile,配置文件,用来生成dockerimagedockerimage,交付部署的最小单元docker命令与API,定义命令与接口,支持第三方系统集</div>
                    </li>
                    <li><a href="/article/1773413750980804608.htm"
                           title="linux安装docker及docker-compose 部署spring boot项目" target="_blank">linux安装docker及docker-compose 部署spring boot项目</a>
                        <span class="text-muted">时而有事儿</span>
<a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a>
                        <div>linux系统环境:centos5.14本篇描述的是在centos系统版本下安装docker,如果是ubuntu版本,请看这篇文章:linuxubuntu20安装docker和docker-compose-CSDN博客正文:安装docker和docker-compose安装docker---------运行命名等待安装完成遇到选择直接输入yyuminstall-yyum-utilsdevice-m</div>
                    </li>
                    <li><a href="/article/1773406951456178176.htm"
                           title="检测usb口HotPlug-netlink" target="_blank">检测usb口HotPlug-netlink</a>
                        <span class="text-muted">cany1000</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>为了完成内核空间与用户空间通信,Linux提供了基于Socket的NetLink通信机制。SELinux,Linux系统的防火墙分为内核态的netfilter和用户态的iptables,netfilter与iptables的数据交换就是通过Netlink机制完成。下面看一个检测usb口的例子:s32InitUsbHotPlug(void){s32nSockFd=0;//套接字地址structsoc</div>
                    </li>
                    <li><a href="/article/1773377374927257600.htm"
                           title="Linux学习系列之vim编辑器(一)" target="_blank">Linux学习系列之vim编辑器(一)</a>
                        <span class="text-muted">llibertyll</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a>
                        <div>vi编辑器的操作模式输入模式—aio等—>命令模式<—:键—末行模式从输入/末行模式切换到命令模式都是需要按ESC键注:a光标后输入,i光标前输入,o直接向下加一行输入,O向上加一行输入在vi编辑器中光标的移动(命令行模式下)键组合(命令)光标的移动$光标移动到当前行的结尾0(零)光标移动到当前行的开始GG光标移动到最后一行gg光标移动到第一行在命令行模式下删除与复制的操作键组合(命令)含义dd删</div>
                    </li>
                    <li><a href="/article/1773337745800888320.htm"
                           title="Azkaban各种类型的Job编写" target="_blank">Azkaban各种类型的Job编写</a>
                        <span class="text-muted">__元昊__</span>

                        <div>一、概述原生的Azkaban支持的plugin类型有以下这些:command:Linuxshell命令行任务gobblin:通用数据采集工具hadoopJava:运行hadoopMR任务java:原生java任务hive:支持执行hiveSQLpig:pig脚本任务spark:spark任务hdfsToTeradata:把数据从hdfs导入TeradatateradataToHdfs:把数据从Te</div>
                    </li>
                    <li><a href="/article/1773302984202059776.htm"
                           title="Linux初学(十)shell脚本" target="_blank">Linux初学(十)shell脚本</a>
                        <span class="text-muted">王依硕</span>
<a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                        <div>一、for循环1.1循环的格式for变量in列表do代码代码....done循环的逻辑:将列表中的每个元素逐一赋值给变量每赋值一次,do和done之间的代码就会执行一次1.2列表的生成方式方法1:直接给出列表元素【用空格分隔多个元素】133129hahabaidu方法2:用通配符来生成元素/home/a*方法3:用命令来生成元素ls/etc/方法4:用{}展开的形式生成元素{3..7}{a..e}</div>
                    </li>
                    <li><a href="/article/1773279947515822080.htm"
                           title="Nginx服务" target="_blank">Nginx服务</a>
                        <span class="text-muted">老伙子53</span>
<a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>Nginx服务一、什么是Nginx1、概念Nginx是一个高性能的开源的HTTP和反向代理服务器,以及邮件(IMAP/POP3)代理服务器。它最初由IgorSysoev创建,并于2004年首次公开发布。Nginx的主要特点包括高性能、低内存占用、高并发处理能力以及高度的可靠性。2、特点高性能Nginx被设计成高性能的服务器软件,能够处理大量并发连接和高流量的请求。它采用了事件驱动的架构,使用异步I</div>
                    </li>
                    <li><a href="/article/1773259809336918016.htm"
                           title="Ubuntu下安装Chrome浏览器(简单,使用)" target="_blank">Ubuntu下安装Chrome浏览器(简单,使用)</a>
                        <span class="text-muted">Starry-sky(jing)</span>
<a class="tag" taget="_blank" href="/search/%5Blinux%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0%5D/1.htm">[linux操作系统笔记]</a><a class="tag" taget="_blank" href="/search/chrome/1.htm">chrome</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>下载安装GoogleChrome浏览器deb包极速下载:下载链接32位wgethttps://dl.google.com/linux/direct/google-chrome-stable_current_i386.deb64位wgethttps://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb安装sudodpk</div>
                    </li>
                    <li><a href="/article/1773237782928490496.htm"
                           title="【Linux】PyCharm无法启动报错及解决方法" target="_blank">【Linux】PyCharm无法启动报错及解决方法</a>
                        <span class="text-muted">不是AI</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E6%93%8D%E4%BD%9C/1.htm">软件操作</a><a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/pycharm/1.htm">pycharm</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>一、问题描述如图,笔者试图在Ubuntu18.04虚拟机上运行PyCharm开发工具(已安装,安装过程可以参考我的博客Ubuntu安装PyCharm),无法启动,报错:CannotconnecttoalreadyrunningIDEinstance.Exception:Process2574isstillrunning.报错截图如下:二、解决方法通过报错信息看出,出于某种原因,进程(PID为257</div>
                    </li>
                    <li><a href="/article/1773211849400057856.htm"
                           title="Linux(centos7)部署hive" target="_blank">Linux(centos7)部署hive</a>
                        <span class="text-muted">灯下夜无眠</span>
<a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/hive/1.htm">hive</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/dbeaver/1.htm">dbeaver</a><a class="tag" taget="_blank" href="/search/hive%E5%AE%A2%E6%88%B7%E7%AB%AF/1.htm">hive客户端</a>
                        <div>前提环境:已部署完hadoop(HDFS、MapReduce、YARN)1、安装元数据服务MySQL切换root用户#更新密钥rpm--importhttps://repo.mysql.com/RPM-GPG-KEY-mysqL-2022#安装Mysqlyum库rpm-Uvhhttp://repo.mysql.com//mysql57-community-release-el7-7.noarch.</div>
                    </li>
                    <li><a href="/article/1773208954436911104.htm"
                           title="Linux通过Tuned实现动态调优系统性能" target="_blank">Linux通过Tuned实现动态调优系统性能</a>
                        <span class="text-muted">星河_赵梓宇</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                        <div>Linux通过Tuned实现动态调优系统性能Tuned简介对于普通用户来说,优化Linux应用环境可能是相当具有挑战性的。它涵盖了各种领域,并且有许多参数需要考虑,比如CPU、存储、缓存策略和内存管理。尽管Linux有默认设置可以处理大多数情况和场景,但是对于高性能、高并发和高可用性系统等特殊场景,需要进行调整。本文讨论的特性是tuned,它是Linux系统中常用的一种调优服务。tuned由两个程</div>
                    </li>
                    <li><a href="/article/1772698992447127552.htm"
                           title="vscode配置go远程linux" target="_blank">vscode配置go远程linux</a>
                        <span class="text-muted">gdut17</span>
<a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a>
                        <div>Toolsenvironment:GOPATH=/root/goInstalling9toolsat/root/go/bininmodulemode.gopkgsgo-outlinegotestsgomodifytagsimplgoplaydlvgolintgoplsInstallinggithub.com/uudashr/gopkgs/v2/cmd/gopkgs(/root/go/bin/gop</div>
                    </li>
                    <li><a href="/article/1772649898592763904.htm"
                           title="部署es集群" target="_blank">部署es集群</a>
                        <span class="text-muted">liushaojiax</span>
<a class="tag" taget="_blank" href="/search/elasticsearch/1.htm">elasticsearch</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a>
                        <div>我们会在单机上利用docker容器运行多个es实例来模拟es集群。不过生产环境推荐大家每一台服务节点仅部署一个es的实例。部署es集群可以直接使用docker-compose来完成,但这要求你的Linux虚拟机至少有4G的内存空间创建es集群首先编写一个docker-compose文件,内容如下:version:'2.2'services:es01:image:elasticsearch:7.12</div>
                    </li>
                    <li><a href="/article/1772548316064710656.htm"
                           title="在 Linux/Ubuntu/Debian 上安装 SQL Server 2019" target="_blank">在 Linux/Ubuntu/Debian 上安装 SQL Server 2019</a>
                        <span class="text-muted">理工男老K</span>
<a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/debian/1.htm">debian</a><a class="tag" taget="_blank" href="/search/sqlserver/1.htm">sqlserver</a>
                        <div>Microsoft为Linux发行版(包括Ubuntu)提供SQLServer。以下是有关如何执行此操作的基本指南:注册MicrosoftUbuntu存储库并添加公共存储库GPG密钥:sudowget-qO-https://packages.microsoft.com/keys/microsoft.asc|sudoapt-keyadd-sudoadd-apt-repository"$(wget-q</div>
                    </li>
                    <li><a href="/article/1772509845434466304.htm"
                           title="生信星球学习小组第80期 Day3笔记--ZJUSKY" target="_blank">生信星球学习小组第80期 Day3笔记--ZJUSKY</a>
                        <span class="text-muted">ZJUSKY</span>

                        <div>Conda简介Conda是一个开源的软件包管理系统和环境管理系统,用于安装多个版本的软件包及其依赖关系,并在它们之间轻松切换。简单来说Conda就是Linux系统下的应用商店,你可以在通过Conda下载,安装很多软件。这里我们推荐miniconda,它只包含了最基本的内容,python和conda,以及相关的必须依赖项。精简的miniconda足够满足日常生信使用。下载miniconda推荐使用清</div>
                    </li>
                    <li><a href="/article/1772444468033683456.htm"
                           title="Linux系统及操作 (04)" target="_blank">Linux系统及操作 (04)</a>
                        <span class="text-muted">3s不会飞</span>
<a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/%E5%9F%BA%E7%A1%80%E5%B8%B8%E8%AF%86/1.htm">基础常识</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                        <div>Linux系统及操作(03)RPM软件包网络下载对应软件包光盘镜像文件,具备软件包Windows系统软件包的管理可以指定安装位置安装是集中安装到一个目录Linux系统与Windows系统相反。常见的软件包(生态)类型电脑入侵99%都是通过软件包的漏洞进行的。window生态Android生态ios生态rpm软件包:扩展名为.rpm,适用于RedHat系统。deb软件包:扩展名为.deb适用于Deb</div>
                    </li>
                    <li><a href="/article/1772435277218906112.htm"
                           title="RockyLinux8 & RockyLinux9安装postgresql16-devel开发包" target="_blank">RockyLinux8 & RockyLinux9安装postgresql16-devel开发包</a>
                        <span class="text-muted">ynzhangyao</span>
<a class="tag" taget="_blank" href="/search/postgresql/1.htm">postgresql</a>
                        <div>1、PG的插件扩展有些需要自行编译,需要安装PG开发包2、RockyLinux8安装#创建用户先useraddpostgressudodnfinstall-yhttps://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpmsudodnf-qymoduledisa</div>
                    </li>
                    <li><a href="/article/1772418663362658304.htm"
                           title="Linux系统定时备份mysql数据库" target="_blank">Linux系统定时备份mysql数据库</a>
                        <span class="text-muted">er_得一</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a>
                        <div>1、创建shell脚本mysql_db_backup并赋予执行权限#!/bin/bash#备份目录BACKUP=/data/backup/db#当前时间DATETIME=$(date+%Y-%m-%d_%H%M%S)echo$DATETIME#数据库地址HOST=localhost#数据库用户名DB_USER=root#数据库密码DB_PW=pwd@123#备份的数据库名DATABASE=Apol</div>
                    </li>
                    <li><a href="/article/1772389208908955648.htm"
                           title="Nagios安装部署全攻略" target="_blank">Nagios安装部署全攻略</a>
                        <span class="text-muted">weixin_34109408</span>
<a class="tag" taget="_blank" href="/search/memcached/1.htm">memcached</a><a class="tag" taget="_blank" href="/search/php/1.htm">php</a><a class="tag" taget="_blank" href="/search/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/1.htm">操作系统</a>
                        <div>概述:公司的生产机器一共有12台,2台LVS(主备)、2台nginx、2台tomcat、1台后台服务器(nginx_tomcat)、3台mysql(主+备+异地灾备)、1台图片服务器、2台memcached.可以看出网站的架构就是基于高可用的原理的,每个层面都做了主备、系统的PV不高,对于并发布,高性能没有那么苛求,对于系统安全、稳定有较高要求,前期已经对系统做了各种日志分析,WAF配置,漏洞扫面</div>
                    </li>
                    <li><a href="/article/1772379138313748480.htm"
                           title="nginx upstream server主动健康监测模块添加https检测功能【上】" target="_blank">nginx upstream server主动健康监测模块添加https检测功能【上】</a>
                        <span class="text-muted">码农心语</span>
<a class="tag" taget="_blank" href="/search/nginx%E5%AD%A6%E4%B9%A0/1.htm">nginx学习</a><a class="tag" taget="_blank" href="/search/c%2B%2B%E5%BC%80%E5%8F%91/1.htm">c++开发</a><a class="tag" taget="_blank" href="/search/LINUX/1.htm">LINUX</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/https/1.htm">https</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E5%81%A5%E5%BA%B7%E6%A3%80%E6%B5%8B/1.htm">健康检测</a><a class="tag" taget="_blank" href="/search/upstream/1.htm">upstream</a><a class="tag" taget="_blank" href="/search/proxy/1.htm">proxy</a>
                        <div>1缘起  前面的《nginxupstreamserver主动健康检测模块ngx_http_upstream_check_module使用和源码分析》系列已经分析了ngx_http_upstream_check_module的实现原理,并且在借助这个模块的框架实现了一个udp健康检测的新功能。  但是ngx_http_upstream_check_module还缺乏基于https监测上游服务器健康状</div>
                    </li>
                    <li><a href="/article/1772298957515456512.htm"
                           title="Linux中PATH、LIBRARY_PATH、LD_LIBRARY_PATH的作用" target="_blank">Linux中PATH、LIBRARY_PATH、LD_LIBRARY_PATH的作用</a>
                        <span class="text-muted">zhang-ge</span>
<a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/C/1.htm">C</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>1、PATHPATH是存储可执行文件搜索路径的系统环境变量,它包含了一组由冒号:分隔的目录列表。当运行一个命令时,操作系统会在这些目录中查找相应的可执行文件,并在找到后执行它。例如,在命令行中执行ls命令时,就会依次在PATH变量列出的目录中查找ls命令,如果找到则执行,否则会提示找不到该命令。可以通过以下方式修改PATH环境变量:exportPATH=$PATH:/exe_path/bin永久修</div>
                    </li>
                    <li><a href="/article/1772295559269384192.htm"
                           title="RabbitMQ的安装" target="_blank">RabbitMQ的安装</a>
                        <span class="text-muted">白泽27</span>
<a class="tag" taget="_blank" href="/search/rabbitmq/1.htm">rabbitmq</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a>
                        <div>典型应用场景:异步处理。把消息放入消息中间件中,等到需要的时候再去处理。流量削峰。例如秒杀活动,在短时间内访问量急剧增加,使用消息队列,当消息队列满了就拒绝响应,跳转到错误页面,这样就可以使得系统不会因为超负载而崩溃Linux下安装#拉取镜像dockerpullrabbitmq:3.8-management#创建容器启动dockerrun-d--restart=always-p5672:5672-</div>
                    </li>
                    <li><a href="/article/1772289516225232896.htm"
                           title="linux环境下 python import找不到自定义模块的解决方法" target="_blank">linux环境下 python import找不到自定义模块的解决方法</a>
                        <span class="text-muted">强哥的博客</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>问题现象:Linux环境中自定义的模块basic,importbasic出错。basic模块在/quoteEastmoney/目录下。两种方法:1.在导入模块之前(每个.py文件都需要加)importsyssys.path.append('/quoteEastmoney/')2.更改环境变量(一次修改永久生效)管理员权限修改:/etc/profile。在最后一行加上exportPYTHONPATH</div>
                    </li>
                    <li><a href="/article/1772279908358225920.htm"
                           title="03-10Linux的文件系统" target="_blank">03-10Linux的文件系统</a>
                        <span class="text-muted">圆缘1987</span>

                        <div>Linux的文件系统:根文件系统(rootfs):rootfilesystemLSB,FHS/boot:引导文件存放目录:内核文件(vmlinuz),引导加载器(bootloader,grub)都存放于此目录/bin:供所有用户使用的基本命令;不能关联至独立分区,OS启动会用到的程序/sbin:管理类的基本命令;不能关联至独立分区,OS启动会用到的程序/lib:基本共享库文件,以及内核模块文件(/</div>
                    </li>
                    <li><a href="/article/1772197632614137856.htm"
                           title="https在win7的环境下如何配置" target="_blank">https在win7的环境下如何配置</a>
                        <span class="text-muted">ddddwd--1</span>
<a class="tag" taget="_blank" href="/search/https/1.htm">https</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/1.htm">网络协议</a><a class="tag" taget="_blank" href="/search/http/1.htm">http</a>
                        <div>https在win7的环境下如何配置?在Windows7环境下配置https,需要完成以下步骤:1)安装Web服务器软件可以选择安装常用的Web服务器软件,如Apache、Nginx或IIS,这些服务器软件都支持https。2)获取SSL证书并安装要启用https,需要获取有效的SSL证书,找到合适的证书提交申请,待证书颁发之后就可以安装到服务器上。3)配置Web服务器软件对于Web服务器,需要编</div>
                    </li>
                                <li><a href="/article/104.htm"
                                       title="springmvc 下 freemarker页面枚举的遍历输出" target="_blank">springmvc 下 freemarker页面枚举的遍历输出</a>
                                    <span class="text-muted">杨白白</span>
<a class="tag" taget="_blank" href="/search/enum/1.htm">enum</a><a class="tag" taget="_blank" href="/search/freemarker/1.htm">freemarker</a>
                                    <div>spring mvc freemarker 中遍历枚举 
 
1枚举类型有一个本地方法叫values(),这个方法可以直接返回枚举数组。所以可以利用这个遍历。 
 

enum

public enum BooleanEnum {  
    TRUE(Boolean.TRUE, "是"), FALSE(Boolean.FALSE, "否");  
</div>
                                </li>
                                <li><a href="/article/231.htm"
                                       title="实习简要总结" target="_blank">实习简要总结</a>
                                    <span class="text-muted">byalias</span>
<a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a>
                                    <div>来白虹不知不觉中已经一个多月了,因为项目还在需求分析及项目架构阶段,自己在这段 
时间都是在学习相关技术知识,现在对这段时间的工作及学习情况做一个总结: 
 
(1)工作技能方面 
大体分为两个阶段,Java Web 基础阶段和Java EE阶段 
 
1)Java Web阶段 
在这个阶段,自己主要着重学习了 JSP, Servlet, JDBC, MySQL,这些知识的核心点都过 
了一遍,也</div>
                                </li>
                                <li><a href="/article/358.htm"
                                       title="Quartz——DateIntervalTrigger触发器" target="_blank">Quartz——DateIntervalTrigger触发器</a>
                                    <span class="text-muted">eksliang</span>
<a class="tag" taget="_blank" href="/search/quartz/1.htm">quartz</a>
                                    <div>转载请出自出处:http://eksliang.iteye.com/blog/2208559 一.概述 
simpleTrigger 内部实现机制是通过计算间隔时间来计算下次的执行时间,这就导致他有不适合调度的定时任务。例如我们想每天的 1:00AM 执行任务,如果使用 SimpleTrigger,间隔时间就是一天。注意这里就会有一个问题,即当有 misfired 的任务并且恢复执行时,该执行时间</div>
                                </li>
                                <li><a href="/article/485.htm"
                                       title="Unix快捷键" target="_blank">Unix快捷键</a>
                                    <span class="text-muted">18289753290</span>
<a class="tag" taget="_blank" href="/search/unix/1.htm">unix</a><a class="tag" taget="_blank" href="/search/Unix%EF%BC%9B%E5%BF%AB%E6%8D%B7%E9%94%AE%3B/1.htm">Unix;快捷键;</a>
                                    <div>复制,删除,粘贴: 
dd:删除光标所在的行                             &nbs</div>
                                </li>
                                <li><a href="/article/612.htm"
                                       title="获取Android设备屏幕的相关参数" target="_blank">获取Android设备屏幕的相关参数</a>
                                    <span class="text-muted">酷的飞上天空</span>
<a class="tag" taget="_blank" href="/search/android/1.htm">android</a>
                                    <div>包含屏幕的分辨率  以及 屏幕宽度的最大dp 高度最大dp   
  
        TextView text = (TextView)findViewById(R.id.text);
        DisplayMetrics dm = new DisplayMetrics();
        text.append("getResources().ge</div>
                                </li>
                                <li><a href="/article/739.htm"
                                       title="要做物联网?先保护好你的数据" target="_blank">要做物联网?先保护好你的数据</a>
                                    <span class="text-muted">蓝儿唯美</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE/1.htm">数据</a>
                                    <div>根据Beecham Research的说法,那些在行业中希望利用物联网的关键领域需要提供更好的安全性。 
在Beecham的物联网安全威胁图谱上,展示了那些可能产生内外部攻击并且需要通过快速发展的物联网行业加以解决的关键领域。 
Beecham Research的技术主管Jon Howes说:“之所以我们目前还没有看到与物联网相关的严重安全事件,是因为目前还没有在大型客户和企业应用中进行部署,也就</div>
                                </li>
                                <li><a href="/article/866.htm"
                                       title="Java取模(求余)运算" target="_blank">Java取模(求余)运算</a>
                                    <span class="text-muted">随便小屋</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>        整数之间的取模求余运算很好求,但几乎没有遇到过对负数进行取模求余,直接看下面代码: 
/**
 * 
 * @author Logic
 *
 */
public class Test {

	public static void main(String[] args) {
		// TODO A</div>
                                </li>
                                <li><a href="/article/993.htm"
                                       title="SQL注入介绍" target="_blank">SQL注入介绍</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/sql%E6%B3%A8%E5%85%A5/1.htm">sql注入</a>
                                    <div>二、SQL注入范例 
  
 这里我们根据用户登录页面 
  <form action="" > 用户名:<input type="text" name="username"><br/> 密 码:<input type="password" name="passwor</div>
                                </li>
                                <li><a href="/article/1120.htm"
                                       title="优雅代码风格" target="_blank">优雅代码风格</a>
                                    <span class="text-muted">aoyouzi</span>
<a class="tag" taget="_blank" href="/search/%E4%BB%A3%E7%A0%81/1.htm">代码</a>
                                    <div>总结了几点关于优雅代码风格的描述: 
 
 代码简单:不隐藏设计者的意图,抽象干净利落,控制语句直截了当。 
 接口清晰:类型接口表现力直白,字面表达含义,API 相互呼应以增强可测试性。 
 依赖项少:依赖关系越少越好,依赖少证明内聚程度高,低耦合利于自动测试,便于重构。 
 没有重复:重复代码意味着某些概念或想法没有在代码中良好的体现,及时重构消除重复。 
 战术分层:代码分层清晰,隔离明确,</div>
                                </li>
                                <li><a href="/article/1247.htm"
                                       title="布尔数组" target="_blank">布尔数组</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%B8%83%E5%B0%94%E6%95%B0%E7%BB%84/1.htm">布尔数组</a>
                                    <div>  
androi中提到了布尔数组; 
  
布尔数组默认的是false,  并且只会打印false或者是true 
  
布尔数组的例子;  根据字符数组创建布尔数组 
		char[] c = {'p','u','b','l','i','c'};
		//根据字符数组的长度创建布尔数组的个数
		boolean[] b = new bool</div>
                                </li>
                                <li><a href="/article/1374.htm"
                                       title="web.xml之welcome-file-list、error-page" target="_blank">web.xml之welcome-file-list、error-page</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/web.xml/1.htm">web.xml</a><a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a><a class="tag" taget="_blank" href="/search/error-page/1.htm">error-page</a>
                                    <div>welcome-file-list 
1.定义: 
<welcome-file-list>
    <welcome-file>login.jsp</welcome>
</welcome-file-list> 
 2.作用:用来指定WEB应用首页名称。 
  
error-page1.定义: 
<error-page&g</div>
                                </li>
                                <li><a href="/article/1501.htm"
                                       title="richfaces 4 fileUpload组件删除上传的文件" target="_blank">richfaces 4 fileUpload组件删除上传的文件</a>
                                    <span class="text-muted">sunjing</span>
<a class="tag" taget="_blank" href="/search/clear/1.htm">clear</a><a class="tag" taget="_blank" href="/search/Richfaces+4/1.htm">Richfaces 4</a><a class="tag" taget="_blank" href="/search/fileupload/1.htm">fileupload</a>
                                    <div> 页面代码       
        <h:form id="fileForm">            <rich:</div>
                                </li>
                                <li><a href="/article/1628.htm"
                                       title="技术文章备忘" target="_blank">技术文章备忘</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/%E6%8A%80%E6%9C%AF%E6%96%87%E7%AB%A0/1.htm">技术文章</a>
                                    <div>Zookeeper 
http://wenku.baidu.com/view/bab171ffaef8941ea76e05b8.html 
http://wenku.baidu.com/link?url=8thAIwFTnPh2KL2b0p1V7XSgmF9ZEFgw4V_MkIpA9j8BX2rDQMPgK5l3wcs9oBTxeekOnm5P3BK8c6K2DWynq9nfUCkRlTt9uV</div>
                                </li>
                                <li><a href="/article/1755.htm"
                                       title="org.hibernate.hql.ast.QuerySyntaxException: unexpected token: on near line 1解决方案" target="_blank">org.hibernate.hql.ast.QuerySyntaxException: unexpected token: on near line 1解决方案</a>
                                    <span class="text-muted">白糖_</span>
<a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a>
                                    <div>文章摘自:http://blog.csdn.net/yangwawa19870921/article/details/7553181 
  
在编写HQL时,可能会出现这种代码: 
  
select a.name,b.age from TableA a left join TableB b on a.id=b.id 
 如果这是HQL,那么这段代码就是错误的,因为HQL不支持</div>
                                </li>
                                <li><a href="/article/1882.htm"
                                       title="sqlserver按照字段内容进行排序" target="_blank">sqlserver按照字段内容进行排序</a>
                                    <span class="text-muted">bozch</span>
<a class="tag" taget="_blank" href="/search/%E6%8C%89%E7%85%A7%E5%86%85%E5%AE%B9%E6%8E%92%E5%BA%8F/1.htm">按照内容排序</a>
                                    <div>在做项目的时候,遇到了这样的一个需求: 
          从数据库中取出的数据集,首先要将某个数据或者多个数据按照地段内容放到前面显示,例如:从学生表中取出姓李的放到数据集的前面; 
         select * fro</div>
                                </li>
                                <li><a href="/article/2009.htm"
                                       title="编程珠玑-第一章-位图排序" target="_blank">编程珠玑-第一章-位图排序</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E7%8F%A0%E7%8E%91/1.htm">编程珠玑</a>
                                    <div>

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Random;

public class BitMapSearch {

  </div>
                                </li>
                                <li><a href="/article/2136.htm"
                                       title="Java关于==和equals" target="_blank">Java关于==和equals</a>
                                    <span class="text-muted">chenbowen00</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>关于==和equals概念其实很简单,一个是比较内存地址是否相同,一个比较的是值内容是否相同。虽然理解上不难,但是有时存在一些理解误区,如下情况: 
1、 
 
String a = "aaa"; 
a=="aaa"; 
==> true 
2、 
 
new String("aaa")==new String("aaa</div>
                                </li>
                                <li><a href="/article/2263.htm"
                                       title="[IT与资本]软件行业需对外界投资热情保持警惕" target="_blank">[IT与资本]软件行业需对外界投资热情保持警惕</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/it/1.htm">it</a>
                                    <div> 
      我还是那个看法,软件行业需要增强内生动力,尽量依靠自有资金和营业收入来进行经营,避免在资本市场上经受各种不同类型的风险,为企业自主研发核心技术和产品提供稳定,温和的外部环境... 
 
      如果我们在自己尚未掌握核心技术之前,企图依靠上市来筹集资金,然后使劲往某个领域砸钱,然</div>
                                </li>
                                <li><a href="/article/2390.htm"
                                       title="oracle 数据块结构" target="_blank">oracle 数据块结构</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E5%9D%97/1.htm">块</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%9D%97/1.htm">数据块</a><a class="tag" taget="_blank" href="/search/%E5%9D%97%E7%BB%93%E6%9E%84/1.htm">块结构</a><a class="tag" taget="_blank" href="/search/%E8%A1%8C%E7%9B%AE%E5%BD%95/1.htm">行目录</a>
                                    <div>oracle 数据块是数据库存储的最小单位,一般为操作系统块的N倍。其结构为: 
 
块头--〉空行--〉数据,其实际为纵行结构。 
 
块的标准大小由初始化参数DB_BLOCK_SIZE指定。具有标准大小的块称为标准块(Standard Block)。块的大小和标准块的大小不同的块叫非标准块(Nonstandard Block)。同一数据库中,Oracle9i及以上版本支持同一数据库中同时使用标</div>
                                </li>
                                <li><a href="/article/2517.htm"
                                       title="github上一些觉得对自己工作有用的项目收集" target="_blank">github上一些觉得对自己工作有用的项目收集</a>
                                    <span class="text-muted">dengkane</span>
<a class="tag" taget="_blank" href="/search/github/1.htm">github</a>
                                    <div>github上一些觉得对自己工作有用的项目收集  
   
技能类 
 
 markdown语法中文说明 
  
回到顶部 
   
全文检索 
 
  elasticsearch  
  bigdesk elasticsearch管理插件  
  
回到顶部 
   
nosql 
 
  mapdb 支持亿级别map, list, 支持事务. 可考虑做为缓存使用  
  C</div>
                                </li>
                                <li><a href="/article/2644.htm"
                                       title="初二上学期难记单词二" target="_blank">初二上学期难记单词二</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/english/1.htm">english</a><a class="tag" taget="_blank" href="/search/word/1.htm">word</a>
                                    <div>dangerous 危险的 
panda 熊猫 
lion 狮子 
elephant 象 
monkey 猴子 
tiger 老虎 
deer 鹿 
snake 蛇 
rabbit 兔子 
duck 鸭 
horse 马 
forest 森林 
fall 跌倒;落下 
climb 爬;攀登 
finish 完成;结束 
cinema 电影院;电影 
seafood 海鲜;海产食品 
bank 银行</div>
                                </li>
                                <li><a href="/article/2771.htm"
                                       title="8、mysql外键(FOREIGN KEY)的简单使用" target="_blank">8、mysql外键(FOREIGN KEY)的简单使用</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a>
                                    <div>一、基本概念 
1、MySQL中“键”和“索引”的定义相同,所以外键和主键一样也是索引的一种。不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用户进行明确的索引。用于外键关系的字段必须在所有的参照表中进行明确地索引,InnoDB不能自动地创建索引。 
2、外键可以是一对一的,一个表的记录只能与另一个表的一条记录连接,或者是一对多的,一个表的记录与另一个表的多条记录连接。 
3、如</div>
                                </li>
                                <li><a href="/article/2898.htm"
                                       title="java循环标签 Foreach" target="_blank">java循环标签 Foreach</a>
                                    <span class="text-muted">shuizhaosi888</span>
<a class="tag" taget="_blank" href="/search/%E6%A0%87%E7%AD%BE/1.htm">标签</a><a class="tag" taget="_blank" href="/search/java%E5%BE%AA%E7%8E%AF/1.htm">java循环</a><a class="tag" taget="_blank" href="/search/foreach/1.htm">foreach</a>
                                    <div>1. 简单的for循环 
	public static void main(String[] args) {
		for (int i = 1, y = i + 10; i < 5 && y < 12; i++, y = i * 2) {

			System.err.println("i=" + i + "    y=" </div>
                                </li>
                                <li><a href="/article/3025.htm"
                                       title="Spring Security(05)——异常信息本地化" target="_blank">Spring Security(05)——异常信息本地化</a>
                                    <span class="text-muted">234390216</span>
<a class="tag" taget="_blank" href="/search/exception/1.htm">exception</a><a class="tag" taget="_blank" href="/search/Spring+Security/1.htm">Spring Security</a><a class="tag" taget="_blank" href="/search/%E5%BC%82%E5%B8%B8%E4%BF%A1%E6%81%AF/1.htm">异常信息</a><a class="tag" taget="_blank" href="/search/%E6%9C%AC%E5%9C%B0%E5%8C%96/1.htm">本地化</a>
                                    <div>异常信息本地化 
  
       Spring Security支持将展现给终端用户看的异常信息本地化,这些信息包括认证失败、访问被拒绝等。而对于展现给开发者看的异常信息和日志信息(如配置错误)则是不能够进行本地化的,它们是以英文硬编码在Spring Security的代码中的。在Spring-Security-core-x</div>
                                </li>
                                <li><a href="/article/3152.htm"
                                       title="DUBBO架构服务端告警Failed to send message Response" target="_blank">DUBBO架构服务端告警Failed to send message Response</a>
                                    <span class="text-muted">javamingtingzhao</span>
<a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/DUBBO/1.htm">DUBBO</a>
                                    <div> 废话不多说,警告日志如下,不知道有哪位遇到过,此异常在服务端抛出(服务器启动第一次运行会有这个警告),后续运行没问题,找了好久真心不知道哪里错了。 
  
 WARN 2015-07-18 22:31:15,272 com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(84)</div>
                                </li>
                                <li><a href="/article/3279.htm"
                                       title="JS中Date对象中几个用法" target="_blank">JS中Date对象中几个用法</a>
                                    <span class="text-muted">leeqq</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/Date/1.htm">Date</a><a class="tag" taget="_blank" href="/search/%E6%9C%80%E5%90%8E%E4%B8%80%E5%A4%A9/1.htm">最后一天</a>
                                    <div>近来工作中遇到这样的两个需求 
1. 给个Date对象,找出该时间所在月的第一天和最后一天 
2. 给个Date对象,找出该时间所在周的第一天和最后一天 
  
需求1中的找月第一天很简单,我记得api中有setDate方法可以使用 
使用setDate方法前,先看看getDate 
var date = new Date();
console.log(date);
// Sat J</div>
                                </li>
                                <li><a href="/article/3406.htm"
                                       title="MFC中使用ado技术操作数据库" target="_blank">MFC中使用ado技术操作数据库</a>
                                    <span class="text-muted">你不认识的休道人</span>
<a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/mfc/1.htm">mfc</a>
                                    <div>1.在stdafx.h中导入ado动态链接库 
 
#import"C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","end")2.在CTestApp文件的InitInstance()函数中domodal之前写::CoIniti</div>
                                </li>
                                <li><a href="/article/3533.htm"
                                       title="Android Studio加速" target="_blank">Android Studio加速</a>
                                    <span class="text-muted">rensanning</span>
<a class="tag" taget="_blank" href="/search/android+studio/1.htm">android studio</a>
                                    <div>Android Studio慢、吃内存!启动时后会立即通过Gradle来sync & build工程。 
 
 
(1)设置Android Studio 
a) 禁用插件 
File -> Settings...  Plugins 去掉一些没有用的插件。 
比如:Git Integration、GitHub、Google Cloud Testing、Google Cloud</div>
                                </li>
                                <li><a href="/article/3660.htm"
                                       title="各数据库的批量Update操作" target="_blank">各数据库的批量Update操作</a>
                                    <span class="text-muted">tomcat_oracle</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/sqlite/1.htm">sqlite</a>
                                    <div>MyBatis的update元素的用法与insert元素基本相同,因此本篇不打算重复了。本篇仅记录批量update操作的 
sql语句,懂得SQL语句,那么MyBatis部分的操作就简单了。     注意:下列批量更新语句都是作为一个事务整体执行,要不全部成功,要不全部回滚。   
MSSQL的SQL语句   
 WITH R AS(
  SELECT 'John' as name, 18 as</div>
                                </li>
                                <li><a href="/article/3787.htm"
                                       title="html禁止清除input文本输入缓存" target="_blank">html禁止清除input文本输入缓存</a>
                                    <span class="text-muted">xp9802</span>
<a class="tag" taget="_blank" href="/search/input/1.htm">input</a>
                                    <div>多数浏览器默认会缓存input的值,只有使用ctl+F5强制刷新的才可以清除缓存记录。如果不想让浏览器缓存input的值,有2种方法: 
方法一: 在不想使用缓存的input中添加 autocomplete="off"; eg: <input type="text" autocomplete="off" name</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html><script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>