nginx学习笔记
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了nginx学习笔记,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含12113字,纯文字阅读大概需要18分钟。
内容图文
![nginx学习笔记](/upload/InfoBanner/zyjiaocheng/1165/3ba0643447114e258b846057f4127cc2.jpg)
Nginx 学习笔记
一. 安装 nginx
Nginx 官方网站是 http://sysoev.ru/nginx/ 英文主页 http://nginx.net 在这里可以获得 nginx 的最新版本。 Nginx 有三个版本 : 稳定版,开发板,历史稳定版。
1. 下载 nginx http://nginx.org/en/download.html
安装 nginx 之前确保系统已经安装了 gcc,openssl-devel,pcre-devel,zlib-devel 软件库 。这几个库一般安装系统时只要选择了开发环境一般都已经安装好了,如果没有安装使用 yum 安装即可。
2. 开始安装 nginx
经过编译安装的 nginx 包含了大部分可用模块,可通过“ ./configure --help ”选项设置各个模块的使用情况,例如对不需要的 http_ssi 模块可以通过 --without-http_ssi_module ”方式关闭。如果需要“ http_perl ”模块,可以通过“ --with-http_perl_module ”方式进行安装。
[root@open 下载 ]#tar -zxvf nginx-1.8.0.tar.gz -C /usr/src/
[root@open 下载 ]#cd /usr/src/nginx-1.8.0/
[root@open nginx-1.8.0]#./configure \
>--with-http_stub_status_module
>--with-http_gzip_static_module
>--prefix=/usr/local/nginx
[root@open nginx-1.8.0]#make
[root@open nginx-1.8.0]#make install
上面 configure 选项中“ --with-http_stub_status_module ”可以用来启用 nginx 的 nginxstatus 功能,监控 nginx 的当前状态。
Nginx 安装完成
二. Nginx 配置文档
Nginx 的配置文件是一个纯文本文件,它一般位于 nginx 安装目录的 conf 目录下,这个配置文件是以 block 的形式组织的。每个 block 一般以一个大括号“ {} ”来表示, block 可以分为几个层次,整个配置文件中 main 指令位于最高层,在 main 层下面可以有 events , HTTP 等层级,而在 HTTP 层中又包含有 server 层,即 server block , server block 中又可分为 location 层,并且一个 server block 中可以包含多个 location block 。
下图大概说明了这个层次关系:
1. 配置与调试 nginx
Nginx 安装后,会产生相应的安装目录,根据前面的安装路径, nginx 的配置文件路径为 /usr/local/nginx/conf 其中的 nginx.conf 这个配置文件为 nginx 的主配置文件。
Nginx 配置文件分为四部分:
-
Main( 全局设置 )
-
Server (主机设置)
-
Upstream (负载均衡服务器设置)
-
Location ( URL 匹配特定位置的设置)
Main 部分设置的指令将影响其它所有设置。
Server 部分的指令主要用于指定主机和端口。
Upstream 指令主要用于负载均衡,设置一系列的后端服务器。
Location 部分用于匹配网页位置。
这四者关系: server 继承 main , location 继承 server 。 Upstream 既不会继承其他设置也不会被继承。
1) nginx 的全局配置
下面这段内容是 nginx 的全局配置属性:
#user nobody; //nginx worker 进程运行用户
worker_processes 1; //nginx 开启的进程数
#error_log logs/error.log; // 主模块指令,定义全局错误日志文件
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; // 指定进程 id 的存储文件位置
worker_rlimit_nofile 65535;
events {
use epoll; // 指定 nginx 工作模式
worker_connections 1024; // 每个进程最大连接数
}
User 主模块指令: 指定 nginxworker 进程运行用户以及用户组,默认由 nobody 账号运行。
Worker_processes: 指定 nginx 要开启的进程数。每个 nginx 进程平均耗费 10MB-12MB 根据经验,一般指定一个进程足够了,如果多核 CPU 建议指定和 CPU 的数量一样多的 进程即可。
Error_log: 用来定义全局错误日志文件,日志输出级别有 debug( 输出最详细 ) , info (仅次于 debug ), notice (注意,提示服务器某些应用可能要出问题), warn (警告,需要引起管理员注意), error (错误,服务器某些应用已经出现错误,不能正常工作), crit( 估计服务器已经宕机了 ) 。
Pid : 用来指定进程和 id 的存储文件位置
Worker_rlimit_nofile: 用于绑定 worker 进程和 CPU , linux 内核 2.4 以上可用。
Events : 设定 nginx 的工作模式及连接数上限。
Use : 用来指定 nginx 的工作模式。 Nginx 支持的工作模式有 select , poll,kqueue,epoll,rtsig 和 /dev/poll 其中 select 和 poll 都是标准的工作模式, kqueue 和 epoll 是高效的工作模式,不同的是 epoll 用在 linux 平台,而 kqueue 用在 BSD 系统中。对于 linux 系统, epoll 工作模式是首选。
Worker_connections: 定义 nginx 每个进程的最大连接数默认是 1024 ,最大客户端连接数由 worker_processes 和 worker_connections 决定。即: max_client=worker_processes*worker_connections 。作为反向代理时为: max_client=worker_processes*worker_connections/4
进程的最大连接数受 linux 系统进程的最大打开文件数限制,在执行操作系统命令“ ulimit -n 65536” 后 worker_connections 的设置才能生效。
2) HTTP 服务器配置
http {
include 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 logs/access.log main;
sendfile on; // 开启高效文件传输模式
tcp_nopush on; // 防止网络阻塞
#keepalive_timeout 0;
keepalive_timeout 65; // 超时时间,默认为秒
gzip on; // 开启 zip 压缩输出
client_max_body_size 20m; // 客户端请求最大大哥文件字节数
client_header_buffer_size 32k;// 客户端请求头 headerbuffer 大小
large_client_header_buffers 432k;
client_header_timeout 10;
client_body_timout 10;
send_timeout 10;
include 主模块指令 :实现对配置文件所包含的设定,可以减少主配置文件的复杂度,类似于 apache 的 include 用法
default_type : 属于 HTTP 核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置 PHP 环境时, nginx 是不予解析的此时,用浏览器访问 PHP 文件就会出现下载窗口。
Log_format : 用于指定 nginx 日志的输出格式。 mylog 为此日志输出格式的名称 . 例如:
Log_format mylog ‘$server_name $remote_addr - $remote_user
[$time_local] “$request”’
‘$status $uptream_status $body_bytes_sent
“http_referer”’
‘”$http_user_agent” “$http_x_forwarded_for”’
‘$ssl_protocol $ssl_cipher $upstream_addr
$request_time $upstream_response_time’;
可以在下面的 access_log 指令中引用。
Access_log logs/nginx_access.log mylog;
$server_name : 虚拟主机名称
$remote_addr : 远程客户端的 IP 地址
- :空白,用一个“ - ”占位符代替,历史原因导致还存在
$remote_user : 远程客户端用户名称,用于记录浏览者进行身份验证时提供的名字,如登陆百度的用户名 test ,如果没有登陆就是空白。
[$time_lockal] : 访问的时间与时区。
$request : 请求的 URL 和 HTTP 协议,这是真个 PV 日志记录中最有用的信息,记录服务器收到一个什么样的请求。
$status : 记录请求返回的 http 状态吗,如成功是 200
$body_bytes_sent : 发送给客户端的文件主题内容的大小,如 899 ,可以将日志每条记录中这个值累加起来初略估计服务器吞吐量。
$http_referer : 记录从哪个页面链接访问过来。
$http_user_agent : 客户端浏览器信息
$http_x_forwarded_for : 客户端的真实 ip ,通常 web 服务器放在反向代理的后面,这样就不能获取到客户的 ip 地址,通过 $remote_add 拿到的 ip 地址是反向代理服务器的 ip 地址。反向代理服务器在转发请求的 http 头信息中,可以增加 x_forwarded_for 信息,用以记录原有客户端的 ip 地址和原来客户端的请求的服务器地址。
$ssl_protocol :ssl 协议版本,如 TLSv1
$ssl_cipher : 交换数据中的算法。
$upstream_addr :upstream 的地址,即真正提供服务器的主机地址。
$request_time : 整个请求的总时间
$upstream_response_time : 请求过程中 upstream 的响应时间
Client_max_body_size: 用来设置允许客户端请求的最大的单个文件字节数。
Client_header_buffer_size: 用来指定客户端请求头的 headerbuffer 大小。对于大多数请求, 1KB 的缓冲区大小已经足够,如果自定义了消息头或有更大的 cookie ,可以增加缓冲区大小。这里设置为 32KB 。
Large_client_header_buffers : 用来指定客户端请求中较大的消息头的缓存最大数量和大小,“ 4 ”为个数,“ 128K ”为大小,最大缓存为 4 个 128KB
Sendfile :参数用于开启高效文件传输模式,将 tcp_nopush 和 tcp_nodely 两个指令设置为 on 用于防止网络阻塞。
Keepalive_timeout : 用于设置客户端连接保持活动的超时连接。在超过这个时间之后,服务器会关闭该连接。
Client_header_timeout : 用于设置客户端请求头读取超时时间。如果超过这个时间,客户端还没有发送任何数据, nginx 将返回“ request time out(408) ”错误。
Client_body_timeout : 用于设置客户端请求主题读取超时时间,默认值为 60. 如果超过这个时间,客户端还没有发送任何数据, nginx 将发后“ request time out(408) ”错误。
Send_timeout: 用于指定响应客户端的超时时间,这个超时仅限于两个链接活动之间的时间,如果超过这个时间,客户端没有任何活动, nginx 将会关闭连接。
3 ) HTTP gzip 模块配置
配置 nginx 的 http gzip 模块,这个模块支持在线实时压缩输出数据流,经过良好的配置优化,可以大幅的提升网站的输出效率。要看是否安装此模块,使用如下命令:
[root@open ~]# /usr/local/nginx/sbin/nginx –V
下面是 httpgzip 模块在 nginx 配置中相关属性设置:
gzip on; // 开启 gzip 压缩
gzip_min_length 1k; // 压缩页面最小字节数
gzip_buffers 4 16k; // 申请 4 个单位 16K 内存作为压缩结果流缓存
gzip_http_version 1.1; // 设置识别 http 协议版本
gzip_comp_level 2; // 指定 gzip 压缩比
gzip_types text/plain applicatio/x-javascript text/css
application/xml; // 指定压缩类型
gzip_vary on;
gzip :用于设置开启或者关闭 gzip 模块,“ gzip on ”表示开启 gzip 压缩,实时压缩输出数据流。
Gzip_min_length : 用于设置允许压缩的页面最小字节数,页面字节数从 header 头的 content-length 中获取。默认值是 0 ,不管页面多大都进行压缩。建议设置成大于 1K 的字计数,小于 1K 可能会越压越大
Gzip_buffers : 表示盛情 4 个单位为 16K 的内存作为压缩结果流缓存,默认值是盛情与原始数据大小相同的内存空间来存储 gzip 压缩结果。
Gzip_http_version: 用于设置识别 HTTP 协议版本,默认是 1.1 ,目前大部分浏览器已经支持 gzip 解压,使用默认即可。
Gzip_comp_level : 用来指定 gzip 压缩比, 1 压缩比最小,处理速度最快, 9 压缩比最大,传输速度最快,但处理最慢,比较消耗 CPU 资源
Gzip_types : 用来指定压缩的类型,无论是否指定,“ text/html ”类型总是会被压缩的。
Gzip_vary : 选项可以让前端缓存服务器缓存经过 gzip 压缩的页面,例如,用 squid 缓存经过 nginx 压缩的数据。
3) 负载均衡配置
Upstream 是 nginx 的 http upstream 模块,这个模块通过一个简单的调度算法来实现客户端 IP 到后端服务器的负载均衡。在上面的设定中,通过 upstream 指令指定了一个负载均衡器的名称为 my_test 。这个名称可以任意指定,在后面需要用到的地方直接调用即可。
Nginx 负载模块支持 4 种调度算法 :
轮询(默认) :每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。
weight :指定轮询权值, weight 值越大,分配到的访问几率越高,主要用于后端每个服务器性能不均的情况下。
ip_hash : 每个请求按访问 IP 的 hash 结果分配,这样来自同一个 IP 的访客固定访问一个后端服务器,有效解决动态网页存在的 session 共享问题。但是仅仅能用 ip 来分配后端,因此 ip_hash 是有缺陷的 :
-
nginx 不是前端的服务器, ip_hash 要求 nginx 一定是最前端的服务器,否则 nginx 得不到正确 ip ,就不能根据 ip 做 hash 譬如使用的是 squid 最为前端,那么 nginx 取 ip 时只能得到 squid 服务器 ip 地址,用这个个地址来做分流肯定是错乱的。
-
Nginx 的后端还有其他方式负载均衡,如果 nginx 后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求肯定不能定位到同一台 session 应用服务器上,这么算起来, nginx 后端智能直接指向应用服务器,或者再搭一个 squid ,然后指向应用服务器,最好的办法是用 location 做一次分流,将需要 session 的部分请求通过 ip_hash 分流,剩下的走其它后端去。
fair : 这是比上面两个更加智能的负载均衡算法,此种算法可以依据页面大小和加载时间长短智能的进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的有限分配。 Nginx 本身是不支持 fair 的,如果需要使用这种调度算法,必须下载 nginx 的 upstream_fair 模块。
url_hash : 此方法按访问 url 的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。 Nginx 本身是不支持 url_hash 的,如果需要使用这种调度算法,必须安装 nginx 的 hash 软件包。
在 HTTPupstream 模块中,可以通过 server 指令指定后端服务器的 IP 地址和端口,同时还可以设定每个后端服务器在负载均很调度中的状态。常用的状态有:
down :表示当前的 server 暂时不参与负载均衡
backup :预留的备份机器,当其他所有的非 backup 机器出现故障或者忙的时候,才会请求 backup 机器,因此这台机器压力最轻。
max_fails : 允许请求失败的次数,默认为 1 ,当超过最大次数时,返回 proxy_next_upstream 模块定义的错误。
fail_timeout : 在经历了 max_fails 次失败后,暂停服务的时间。 max_fails 可以和 fail_timeout 一期使用。
当负载调度算法为 ip_hash 时,后端服务器在负载均衡调度中的状态不能是 weight 和 backup 。
4)Server 虚拟主机配置
Server{
listen 80; // 服务器监听端口
server_name localhost; // 服务器 IP 地址或域名
index index.html index.htm index.php index.jsp;
root /opt/html/ // 网页根目录
charset gb2312; // 网页默认编码格式
access_log /data/logs/nginx_access.log mylog; // 日志存放路径
error_log /data/logs/nginx_error.log; // 错误日志存放路径
}
Server 标志定义虚拟主机开始, listen 用于指定虚拟主机的服务器端口; server_name 用来指定 ip 地址或者域名,多个域名之间用空格分开; index 用于设定访问的默认首页地址; root 指令用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径; charset 用于设置网页的默认编码格式。 Access_log 用来指定次虚拟主机的访问日志存放路径。最后的, mylog(mylog 为 http 段内设置的日志输出格式,在 access_log 中引用 ) 用于指定访问日志输出格式。
4) URL 匹配设置
URL 地址匹配是 nginx 匹配中最灵活的部分。 Location 支持正则表达式匹配,也支持条件判断匹配,用户可以通过 location 指令实现 nginx 对动,静态网页的过滤处理。
以下设置是通过 location 指令来对网页 URL 进行分析处理,所有扩展名为 .gif .jpg .png .bmp .swf 的静态文件都交给 nginx 处理,而 expires 用来指定静态文件的过期时间,这里是 30 天
location ~ .*\. (gif|jpg|jpeg|png|bmp|swf)$ {
root /opt/html/;
expires 30d;
}
下面这段设置是将 upload 和 html 下的所有文件都交给 nginx 来处理,当然, upload 和 html 目录包含在 /opt/html/ 目录中
location ~ ^/(uplocad|html)/ {
root /opt/html/;
expires 30d;
}
location 语法规则:
location [=|~|~*|^~|] /uri/ {...}
= : 精确匹配,如果这个查询匹配,将停止搜索并立即处理此请求
~ : 以 ~ 开头表示区分大小写匹配的正则表达式
~* : 以此为开头表示不区分大小写的正则表达式
^~ : 如果把这个前缀用于一个常规字符串,那么告诉 nginx 如果路径匹配那么不测试正则表达式。
示例 1 :
location / {} // 匹配任何查询,因为所有请求都以 / 开头。但是正则表达式规则将被优先和查询匹配。
示例 2 :
location =/ {} // 仅仅匹配 /
示例 3 :
location ~* .(gif|jpg|jpeg)$ {
Rewrite .(gif|jpg)$ /logo.png;
} // 不区分大小写匹配任何以 gif,jpg,jpeg 结尾的文件。
5) stubstatus 模块配置
stubstatus 模块能够获取 nginx 自上次启动以来的工作状态,此模块非核心模块,需要在 nginx 编译安装时手工指定才能使用。
location /NginxStatus {
stub_status on;
access_log logs/nginxstatus.log;
auth_basic “nginxstatus”;
auth_basic_user_file ../htpasswd;
}
stub_status 为“ on ”表示启用 stubstatus 的工作状态统计功能; access_log 用来指定 stubstatus 模块的访问日志文件; auth_basic 是 nginx 的一种认证机制; auth_basic_user_file 用来指定认证的密码文件,因此需要用 apache 的 htpasswd 命令来生成密码文件。例如添加一个 webadmin 用户 :
[root@open ~]# htpasswd -c/usr/local/nginx/conf/htpasswd webadmin
在浏览器中输入: http://ip/nginxstatus 输入刚创建的用户名密码登陆
登陆后的页面:
Active connections 表示当前活跃的连接数,第三行 3 个数字表示 nginx 当前共处理了 3 个连接,成功建立了 3 次握手,总共处理了 5 个请求。最后一行的 reading 表示 nginx 读取到客户端 header 信息数; writing 表示 nginx 返回给客户端的 header 信息数, waiting 表示 nginx 已经处理完,正在等候下一次请求指令时的驻留连接数。
6) nginx 的启动,关闭和平滑重启
nginx 自身提供了一些用于日常维护的命令 :
检查 nginx 配置文件的正确性 :
/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
上述:“ -t ”参数用于检查配置文件是否正确,但并不执行。“ -c ”参数用于指定配置文件路径,如果不指定配置文件路径, nginx 默认会在安装时指定的安装目录下查找 conf/nginx.conf 文件。
检测如下信息说明配置文件正确:
显示 nginx 的版本以及相关编译信息:
/usr/local/nginx/sbin/nginx -V
显示安装 nginx 版本信息
/usr/local/nginx/sbin/nginx -v
Nginx 的启动,关闭与重启
Nginx 对进程的控制能力非常强大,可以通过信号指令控制进程,常用的信号:
-
QUIT : 表示处理完当前请求后,关闭进程。
-
HUP : 表示重新加载配置,也就是关闭原有的进程,并开启新的工作进程。此操作不会中断用户的访问请求,因此可以通过此信号平滑的重启 nginx 。
-
USR1 : 用于 nginx 的日志切换,也就是重新打开一个日志文件,例如每天要生成一个新的日志文件时,可以使用这个信号来控制。
-
USR2 : 用于平滑升级可执行程序。
-
WINCH : 从容关闭工作进程。
Nginx 的启动命令:
/usr/local/nginx/sbin/nginx
查看 nginx 启动进程:
Ps -ef | grep nginx
关闭 nginx
Kill -xxx pid //xxx 是信号名, pid 是进程号
Killall -9 nginx // 强制杀死 nginx 所有进程。慎用。
Nginx 平滑重启 (不间断的重新启动 nginx )
Kill -HUP ‘cat /usr/local/nginx/logs/nginx.pid’
本文出自 “追求探索” 博客,请务必保留此出处http://caesar1990.blog.51cto.com/8821483/1727287
原文:http://caesar1990.blog.51cto.com/8821483/1727287
内容总结
以上是互联网集市为您收集整理的nginx学习笔记全部内容,希望文章能够帮你解决nginx学习笔记所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。