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/1835513699826233344.htm"
                           title="android系统selinux中添加新属性property" target="_blank">android系统selinux中添加新属性property</a>
                        <span class="text-muted">辉色投像</span>

                        <div>1.定位/android/system/sepolicy/private/property_contexts声明属性开头:persist.charge声明属性类型:u:object_r:system_prop:s0图12.定位到android/system/sepolicy/public/domain.te删除neverallow{domain-init}default_prop:property</div>
                    </li>
                    <li><a href="/article/1835509391361667072.htm"
                           title="Linux下QT开发的动态库界面弹出操作(SDL2)" target="_blank">Linux下QT开发的动态库界面弹出操作(SDL2)</a>
                        <span class="text-muted">13jjyao</span>
<a class="tag" taget="_blank" href="/search/QT%E7%B1%BB/1.htm">QT类</a><a class="tag" taget="_blank" href="/search/qt/1.htm">qt</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/sdl2/1.htm">sdl2</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>需求:操作系统为linux,开发框架为qt,做成需带界面的qt动态库,调用方为java等非qt程序难点:调用方为java等非qt程序,也就是说调用方肯定不带QApplication::exec(),缺少了这个,QTimer等事件和QT创建的窗口将不能弹出(包括opencv也是不能弹出);这与qt调用本身qt库是有本质的区别的思路:1.调用方缺QApplication::exec(),那么我们在接口</div>
                    </li>
                    <li><a href="/article/1835504596898902016.htm"
                           title="linux sdl windows.h,Windows下的SDL安装" target="_blank">linux sdl windows.h,Windows下的SDL安装</a>
                        <span class="text-muted">奔跑吧linux内核</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/sdl/1.htm">sdl</a><a class="tag" taget="_blank" href="/search/windows.h/1.htm">windows.h</a>
                        <div>首先你要下载并安装SDL开发包。如果装在C盘下,路径为C:\SDL1.2.5如果在WINDOWS下。你可以按以下步骤:1.打开VC++,点击"Tools",Options2,点击directories选项3.选择"Includefiles"增加一个新的路径。"C:\SDL1.2.5\include"4,现在选择"Libaryfiles“增加"C:\SDL1.2.5\lib"现在你可以开始编写你的第</div>
                    </li>
                    <li><a href="/article/1835503712899002368.htm"
                           title="linux中sdl的使用教程,sdl使用入门" target="_blank">linux中sdl的使用教程,sdl使用入门</a>
                        <span class="text-muted">Melissa Corvinus</span>
<a class="tag" taget="_blank" href="/search/linux%E4%B8%ADsdl%E7%9A%84%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/1.htm">linux中sdl的使用教程</a>
                        <div>本文通过一个简单示例讲解SDL的基本使用流程。示例中展示一个窗口,窗口里面有个随机颜色快随机移动。当我们鼠标点击关闭按钮时间窗口关闭。基本步骤如下:1.初始化SDL并创建一个窗口。SDL_Init()初始化SDL_CreateWindow()创建窗口2.纹理渲染存储RGB和存储纹理的区别:比如一个从左到右由红色渐变到蓝色的矩形,用存储RGB的话就需要把矩形中每个点的具体颜色值存储下来;而纹理只是一</div>
                    </li>
                    <li><a href="/article/1835502578050363392.htm"
                           title="PHP环境搭建详细教程" target="_blank">PHP环境搭建详细教程</a>
                        <span class="text-muted">好看资源平台</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/php/1.htm">php</a>
                        <div>PHP是一个流行的服务器端脚本语言,广泛用于Web开发。为了使PHP能够在本地或服务器上运行,我们需要搭建一个合适的PHP环境。本教程将结合最新资料,介绍在不同操作系统上搭建PHP开发环境的多种方法,包括Windows、macOS和Linux系统的安装步骤,以及本地和Docker环境的配置。1.PHP环境搭建概述PHP环境的搭建主要分为以下几类:集成开发环境:例如XAMPP、WAMP、MAMP,这</div>
                    </li>
                    <li><a href="/article/1835501948011376640.htm"
                           title="使用 FinalShell 进行远程连接(ssh 远程连接 Linux 服务器)" target="_blank">使用 FinalShell 进行远程连接(ssh 远程连接 Linux 服务器)</a>
                        <span class="text-muted">编程经验分享</span>
<a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/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/ssh/1.htm">ssh</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>目录前言基本使用教程新建远程连接连接主机自定义命令路由追踪前言后端开发,必然需要和服务器打交道,部署应用,排查问题,查看运行日志等等。一般服务器都是集中部署在机房中,也有一些直接是云服务器,总而言之,程序员不可能直接和服务器直接操作,一般都是通过ssh连接来登录服务器。刚接触远程连接时,使用的是XSHELL来远程连接服务器,连接上就能够操作远程服务器了,但是仅用XSHELL并没有上传下载文件的功能</div>
                    </li>
                    <li><a href="/article/1835493373906087936.htm"
                           title="libyuv之linux编译" target="_blank">libyuv之linux编译</a>
                        <span class="text-muted">jaronho</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>文章目录一、下载源码二、编译源码三、注意事项1、银河麒麟系统(aarch64)(1)解决armv8-a+dotprod+i8mm指令集支持问题(2)解决armv9-a+sve2指令集支持问题一、下载源码到GitHub网站下载https://github.com/lemenkov/libyuv源码,或者用直接用git克隆到本地,如:gitclonehttps://github.com/lemenko</div>
                    </li>
                    <li><a href="/article/1835489588169240576.htm"
                           title="ARM驱动学习之5 LEDS驱动" target="_blank">ARM驱动学习之5 LEDS驱动</a>
                        <span class="text-muted">JT灬新一</span>
<a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F/1.htm">嵌入式</a><a class="tag" taget="_blank" href="/search/C/1.htm">C</a><a class="tag" taget="_blank" href="/search/%E5%BA%95%E5%B1%82/1.htm">底层</a><a class="tag" taget="_blank" href="/search/arm%E5%BC%80%E5%8F%91/1.htm">arm开发</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%89%87%E6%9C%BA/1.htm">单片机</a>
                        <div>ARM驱动学习之5LEDS驱动知识点:•linuxGPIO申请函数和赋值函数–gpio_request–gpio_set_value•三星平台配置GPIO函数–s3c_gpio_cfgpin•GPIO配置输出模式的宏变量–S3C_GPIO_OUTPUT注意点:DRIVER_NAME和DEVICE_NAME匹配。实现步骤:1.加入需要的头文件://Linux平台的gpio头文件#include//三</div>
                    </li>
                    <li><a href="/article/1835485681187647488.htm"
                           title="【华为OD技术面试真题精选 - 非技术题】 -HR面,综合面_华为od hr面" target="_blank">【华为OD技术面试真题精选 - 非技术题】 -HR面,综合面_华为od hr面</a>
                        <span class="text-muted">一个射手座的程序媛</span>
<a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/%E5%8D%8E%E4%B8%BAod/1.htm">华为od</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E8%81%8C%E5%9C%BA%E5%92%8C%E5%8F%91%E5%B1%95/1.htm">职场和发展</a>
                        <div>最后的话最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!资料预览给大家整理的视频资料:给大家整理的电子书资料:如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以点击这里获</div>
                    </li>
                    <li><a href="/article/1835482277870661632.htm"
                           title="简介Shell、zsh、bash" target="_blank">简介Shell、zsh、bash</a>
                        <span class="text-muted">zhaosuningsn</span>
<a class="tag" taget="_blank" href="/search/Shell/1.htm">Shell</a><a class="tag" taget="_blank" href="/search/zsh/1.htm">zsh</a><a class="tag" taget="_blank" href="/search/bash/1.htm">bash</a><a class="tag" taget="_blank" href="/search/shell/1.htm">shell</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/bash/1.htm">bash</a>
                        <div>Shell是Linux和Unix的外壳,类似衣服,负责外界与Linux和Unix内核的交互联系。例如接收终端用户及各种应用程序的命令,把接收的命令翻译成内核能理解的语言,传递给内核,并把内核处理接收的命令的结果返回给外界,即Shell是外界和内核沟通的桥梁或大门。Linux和Unix提供了多种Shell,其中有种bash,当然还有其他好多种。Mac电脑中不但有bash,还有一个zsh,预装的,据说</div>
                    </li>
                    <li><a href="/article/1835479000600899584.htm"
                           title="Linux MariaDB使用OpenSSL安装SSL证书" target="_blank">Linux MariaDB使用OpenSSL安装SSL证书</a>
                        <span class="text-muted">Meta39</span>
<a class="tag" taget="_blank" href="/search/MySQL/1.htm">MySQL</a><a class="tag" taget="_blank" href="/search/Oracle/1.htm">Oracle</a><a class="tag" taget="_blank" href="/search/MariaDB/1.htm">MariaDB</a><a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/Windows/1.htm">Windows</a><a class="tag" taget="_blank" href="/search/ssl/1.htm">ssl</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/mariadb/1.htm">mariadb</a>
                        <div>进入到证书存放目录,批量删除.pem证书警告:确保已经进入到证书存放目录find.-typef-iname\*.pem-delete查看是否安装OpenSSLopensslversion没有则安装yuminstallopensslopenssl-devel开启SSL编辑/etc/my.cnf文件(没有的话就创建,但是要注意,在/etc/my.cnf.d/server.cnf配置了datadir的,</div>
                    </li>
                    <li><a href="/article/1835469294436184064.htm"
                           title="【从浅识到熟知Linux】Linux发展史" target="_blank">【从浅识到熟知Linux】Linux发展史</a>
                        <span class="text-muted">Jammingpro</span>
<a class="tag" taget="_blank" href="/search/%E4%BB%8E%E6%B5%85%E5%AD%A6%E5%88%B0%E7%86%9F%E7%9F%A5Linux/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>归属专栏:从浅学到熟知Linux个人主页:Jammingpro每日努力一点点,技术变化看得见文章前言:本篇文章记录Linux发展的历史,因在介绍Linux过程中涉及的其他操作系统及人物,本文对相关内容也有所介绍。文章目录Unix发展史Linux发展史开源Linux官网企业应用情况发行版本在学习Linux前,我们可能都会问Linux从哪里来?它是如何发展的。但在介绍Linux之前,需要先介绍一下Un</div>
                    </li>
                    <li><a href="/article/1835467782687387648.htm"
                           title="linux 发展史" target="_blank">linux 发展史</a>
                        <span class="text-muted">种树的猴子</span>
<a class="tag" taget="_blank" href="/search/%E5%86%85%E6%A0%B8/1.htm">内核</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/1.htm">操作系统</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a>
                        <div>linux发展史说明此前对linux认识模糊一知半解,近期通过学习将自己对于linux的发展总结一下方便大家日后的学习。那Linux是目前一款非常火热的开源操作系统,可是linux是什么时候出现的,又是因为什么样的原因被开发出来的呢。以下将对linux的发展历程进行详细的讲解。目录一、Linux发展背景二、UINIX的诞生三、UNIX的重要分支-BSD的诞生四、Minix的诞生五、GNU与Free</div>
                    </li>
                    <li><a href="/article/1835466523163062272.htm"
                           title="Linux sh命令" target="_blank">Linux sh命令</a>
                        <span class="text-muted">fengyehongWorld</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>
                        <div>目录一.基本语法二.选项2.1-c字符串中读取内容,并执行2.1.1基本用法2.1.2获取当前目录下失效的超链接2.2-x每个命令执行之前,将其打印出来2.3结合Here文档使用一.基本语法⏹Linux和Unix系统中用于执行shell脚本或运行命令的命令。sh[选项][脚本文件][参数...]⏹选项-c:从字符串中读取内容,并执行。-x:在每个命令执行之前,将其打印出来。-s:从标准流中读取内容</div>
                    </li>
                    <li><a href="/article/1835466270955368448.htm"
                           title="Linux vi常用命令" target="_blank">Linux vi常用命令</a>
                        <span class="text-muted">fengyehongWorld</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>
                        <div>参考资料viコマンド(vimコマンド)リファレンス目录一.保存系命令二.删除系命令三.移动系命令四.复制粘贴系命令一.保存系命令⏹保存并退出:wq⏹强制保存并退出:wq!⏹退出(文件未编辑):q⏹强制退出(忽略已编辑内容):q!⏹另存为:w新文件名二.删除系命令⏹删除当前行dd⏹清空整个文档gg:移动到文档顶部dG:删除到最后一行ggdG三.移动系命令⏹移动到文档顶部gg⏹移动到文档底部#方式1G</div>
                    </li>
                    <li><a href="/article/1835452402178813952.htm"
                           title="Linux查看服务器日志" target="_blank">Linux查看服务器日志</a>
                        <span class="text-muted">TPBoreas</span>
<a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/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>
                        <div>一、tail这个是我最常用的一种查看方式用法如下:tail-n10test.log查询日志尾部最后10行的日志;tail-n+10test.log查询10行之后的所有日志;tail-fn10test.log循环实时查看最后1000行记录(最常用的)一般还会配合着grep用,(实时抓包)例如:tail-fn1000test.log|grep'关键字'(动态抓包)tail-fn1000test.log</div>
                    </li>
                    <li><a href="/article/1835443696431099904.htm"
                           title="笋丁网页自动回复机器人V3.0.0免授权版源码" target="_blank">笋丁网页自动回复机器人V3.0.0免授权版源码</a>
                        <span class="text-muted">希希分享</span>
<a class="tag" taget="_blank" href="/search/%E8%BD%AF%E5%B8%8C%E7%BD%9158soho_cn/1.htm">软希网58soho_cn</a><a class="tag" taget="_blank" href="/search/%E6%BA%90%E7%A0%81%E8%B5%84%E6%BA%90/1.htm">源码资源</a><a class="tag" taget="_blank" href="/search/%E7%AC%8B%E4%B8%81%E7%BD%91%E9%A1%B5%E8%87%AA%E5%8A%A8%E5%9B%9E%E5%A4%8D%E6%9C%BA%E5%99%A8%E4%BA%BA/1.htm">笋丁网页自动回复机器人</a>
                        <div>笋丁网页机器人一款可设置自动回复,默认消息,调用自定义api接口的网页机器人。此程序后端语言使用Golang,内存占用最高不超过30MB,1H1G服务器流畅运行。仅支持Linux服务器部署,不支持虚拟主机,请悉知!使用自定义api功能需要有一定的建站基础。源码下载:https://download.csdn.net/download/m0_66047725/89754250更多资源下载:关注我。安</div>
                    </li>
                    <li><a href="/article/1835434126874865664.htm"
                           title="ubuntu安装wordpress" target="_blank">ubuntu安装wordpress</a>
                        <span class="text-muted">lissettecarlr</span>

                        <div>1安装nginx网上安装方式很多,这就就直接用apt-get了apt-getinstallnginx不用启动啥,然后直接在浏览器里面输入IP:80就能看到nginx的主页了。如果修改了一些配置可以使用下列命令重启一下systemctlrestartnginx.service2安装mysql输入安装前也可以更新一下软件源,在安装过程中将会让你输入数据库的密码。sudoapt-getinstallmy</div>
                    </li>
                    <li><a href="/article/1835432358141063168.htm"
                           title="深入浅出 -- 系统架构之负载均衡Nginx的性能优化" target="_blank">深入浅出 -- 系统架构之负载均衡Nginx的性能优化</a>
                        <span class="text-muted">xiaoli8748_软件开发</span>
<a class="tag" taget="_blank" href="/search/%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84/1.htm">系统架构</a><a class="tag" taget="_blank" href="/search/%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84/1.htm">系统架构</a><a class="tag" taget="_blank" href="/search/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/1.htm">负载均衡</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a>
                        <div>一、Nginx性能优化到这里文章的篇幅较长了,最后再来聊一下关于Nginx的性能优化,主要就简单说说收益最高的几个优化项,在这块就不再展开叙述了,毕竟影响性能都有多方面原因导致的,比如网络、服务器硬件、操作系统、后端服务、程序自身、数据库服务等,对于性能调优比较感兴趣的可以参考之前《JVM性能调优》中的调优思想。优化一:打开长连接配置通常Nginx作为代理服务,负责分发客户端的请求,那么建议开启H</div>
                    </li>
                    <li><a href="/article/1835428317084348416.htm"
                           title="最简单将静态网页挂载到服务器上(不用nginx)" target="_blank">最简单将静态网页挂载到服务器上(不用nginx)</a>
                        <span class="text-muted">全能全知者</span>
<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/nginx/1.htm">nginx</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%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a>
                        <div>最简单将静态网页挂载到服务器上(不用nginx)如果随便弄个静态网页挂在服务器都要用nignx就太麻烦了,所以直接使用Apache来搭建一些简单前端静态网页会相对方便很多检查Web服务器服务状态:sudosystemctlstatushttpd#ApacheWeb服务器如果发现没有安装web服务器:安装Apache:sudoyuminstallhttpd启动Apache:sudosystemctl</div>
                    </li>
                    <li><a href="/article/1835417097660887040.htm"
                           title="Linux CTF逆向入门" target="_blank">Linux CTF逆向入门</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/CTF/1.htm">CTF</a>
                        <div>1.ELF格式我们先来看看ELF文件头,如果想详细了解,可以查看ELF的manpage文档。关于ELF更详细的说明:e_shoff:节头表的文件偏移量(字节)。如果文件没有节头表,则此成员值为零。sh_offset:表示了该section(节)离开文件头部位置的距离+-------------------+|ELFheader|---++--------->+-------------------</div>
                    </li>
                    <li><a href="/article/1835415332345442304.htm"
                           title="NPM私库搭建-verdaccio(Linux)" target="_blank">NPM私库搭建-verdaccio(Linux)</a>
                        <span class="text-muted">Beam007</span>
<a class="tag" taget="_blank" href="/search/npm/1.htm">npm</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>1、安装nodelinux服务器安装nodea)、官网下载所需的node版本https://nodejs.org/dist/v14.21.0/b)、解压安装包若下载的是xxx.tar.xz文件,解压命令为tar-xvfxxx.tar.xzc)、修改环境变量修改:/etc/profile文件#SETPATHFORNODEJSexportNODE_HOME=NODEJS解压安装的路径exportPAT</div>
                    </li>
                    <li><a href="/article/1835400463676174336.htm"
                           title="C++常见知识掌握" target="_blank">C++常见知识掌握</a>
                        <span class="text-muted">nfgo</span>
<a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>1.Linux软件开发、调试与维护内核与系统结构Linux内核是操作系统的核心,负责管理硬件资源,提供系统服务,它是系统软件与硬件之间的桥梁。主要组成部分包括:进程管理:内核通过调度器分配CPU时间给各个进程,实现进程的创建、调度、终止等操作。使用进程描述符(task_struct)来存储进程信息,包括状态(就绪、运行、阻塞等)、优先级、内存映射等。内存管理:包括物理内存和虚拟内存管理。通过页表映</div>
                    </li>
                    <li><a href="/article/1835399577818198016.htm"
                           title="linux脚本sed替换变量,sed 命令中替换值为shell变量" target="_blank">linux脚本sed替换变量,sed 命令中替换值为shell变量</a>
                        <span class="text-muted">诺坎普之约</span>
<a class="tag" taget="_blank" href="/search/linux%E8%84%9A%E6%9C%ACsed%E6%9B%BF%E6%8D%A2%E5%8F%98%E9%87%8F/1.htm">linux脚本sed替换变量</a>
                        <div>文章目录sed命令中替换值为shell变量替换基本语法sed中替换使用shell变量总结参考文档sed命令中替换值为shell变量替换基本语法大家都是sed有很多用法,最多就应该是替换一些值了。让我们先回忆sed的替换语法。在sed进行替换的时候sed-i's/old/new/g'1.txtecho"hellooldfrank"|sed's/old/new/g'结果如下:hellonewfrank</div>
                    </li>
                    <li><a href="/article/1835398694636187648.htm"
                           title="RK3229_Android9.0_Box 4G模块EC200A调试" target="_blank">RK3229_Android9.0_Box 4G模块EC200A调试</a>
                        <span class="text-muted">suifen_</span>
<a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a>
                        <div>0、kernel修改这部分完全可以参考Linux的移植:RK3588EC200A-CN【4G模块】调试_rkec200a-cn-CSDN博客1、修改device/rockchip/rk322xdiff--gita/device.mkb/device.mkindexec6bfaa..e7c32d1100755---a/device.mk+++b/device.mk@@-105,6+105,8@@en</div>
                    </li>
                    <li><a href="/article/1835390878806536192.htm"
                           title="linux 安装Sublime Text 3" target="_blank">linux 安装Sublime Text 3</a>
                        <span class="text-muted">hhyiyuanyu</span>
<a class="tag" taget="_blank" href="/search/Python%E5%AD%A6%E4%B9%A0/1.htm">Python学习</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/sublime/1.htm">sublime</a><a class="tag" taget="_blank" href="/search/text/1.htm">text</a>
                        <div>方法/步骤打开官网http://www.sublimetext.com/3,选择64位进行下载执行命令wgethttps://download.sublimetext.com/sublime_text_3_build_3126_x64.tar.bz2进行下载3、下载完成进行解压,执行tar-xvvfsublime_text_3_build_3126_x64.tar.bz解压4、解压完成以后,移动到</div>
                    </li>
                    <li><a href="/article/1835382307679203328.htm"
                           title="鲲鹏 ARM 架构 麒麟 Lylin v10 安装 Nginx (离线)" target="_blank">鲲鹏 ARM 架构 麒麟 Lylin v10 安装 Nginx (离线)</a>
                        <span class="text-muted">焚木灵</span>
<a class="tag" taget="_blank" href="/search/arm%E5%BC%80%E5%8F%91/1.htm">arm开发</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                        <div>最近做一个银行的项目,银行的服务器是鲲鹏ARM架构的服务器,并且是麒麟v10的系统,这里记录一下在无法访问外网安装Nginx的方法。其他文章:鲲鹏ARM架构麒麟Lylinv10安装Mysql8.3(离线)-CSDN博客鲲鹏ARM架构麒麟Lylinv10安装Node和NVM(离线)-CSDN博客鲲鹏ARM架构麒麟Lylinv10安装Pm2(离线)-CSDN博客鲲鹏ARM架构麒麟Lylinv10安装P</div>
                    </li>
                    <li><a href="/article/1835381929642389504.htm"
                           title="shell脚本中sed命令如何使用变量" target="_blank">shell脚本中sed命令如何使用变量</a>
                        <span class="text-muted">歪歪的酒壶</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>在shell脚本中我们常常需要使用sed命令进行配置文件的更新,但是更新的内容又往往根据环境相关。值并不是固定的。这里我们介绍一种在sed命令中使用变量的方法。比如,在nginx的配置中,我们需要根据环境来更新/etc/nginx/sites-available/default中的目录配置。通常我们采用一个变量,来记录当前环境需要配置的目录比如:dist_dir=/home/dev/code/ui</div>
                    </li>
                    <li><a href="/article/1835378901174546432.htm"
                           title="KVM虚拟机源代码分析【转】" target="_blank">KVM虚拟机源代码分析【转】</a>
                        <span class="text-muted">xidianjiapei001</span>
<a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/%E8%99%9A%E6%8B%9F%E5%8C%96%E6%8A%80%E6%9C%AF/1.htm">虚拟化技术</a>
                        <div>1.KVM结构及工作原理1.1KVM结构KVM基本结构有两部分组成。一个是KVMDriver,已经成为Linux内核的一个模块。负责虚拟机的创建,虚拟内存的分配,虚拟CPU寄存器的读写以及虚拟CPU的运行等。另外一个是稍微修改过的Qemu,用于模拟PC硬件的用户空间组件,提供I/O设备模型以及访问外设的途径。KVM基本结构如图1所示。其中KVM加入到标准的Linux内核中,被组织成Linux中标准</div>
                    </li>
                    <li><a href="/article/1835376000981102592.htm"
                           title="Nginx之代理模块 ngx_http_proxy_module" target="_blank">Nginx之代理模块 ngx_http_proxy_module</a>
                        <span class="text-muted">途径日暮不赏丶</span>
<a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a>
                        <div>正向代理正向代理是指位于客户机(A)和站点服务器(B)之间的代理服务器(C),为了从站点服务器(B)获取资源,客户机(A)向代理服务器(C)发送请求并指定站点服务器(B),然后代理服务器(C)向站点服务器(B)转交请求并将获取的资源返回给客户机(A)。上述这样的代理模式称为正向代理,正向代理最大的特点:客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户</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>