当前位置:首页 > 服务器技术 > nginx

nginx学习笔记

Nginx 学习笔记

一.    安装 nginx

Nginx 官方网站是 http://sysoev.ru/nginx/ 英文主页 http://nginx.net 在这里可以获得 nginx 的最新版本。 Nginx 有三个版本 : 稳定版,开发板,历史稳定版。

     1. 下载 nginx     http://nginx.org/en/download.html

技术分享650) this.width=650;" src="/upload/getfiles/default/2022/11/10/20221110035732267.jpg" title="1.JPG" />

安装 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

下图大概说明了这个层次关系:

 

技术分享650) this.width=650;" src="/upload/getfiles/default/2022/11/10/20221110035732775.jpg" title="2.jpg" />

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

技术分享650) this.width=650;" src="/upload/getfiles/default/2022/11/10/20221110035733108.jpg" title="3.JPG" />

下面是 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)         负载均衡配置

技术分享650) this.width=650;" src="/upload/getfiles/default/2022/11/10/20221110035733412.jpg" title="4.JPG" />

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

技术分享650) this.width=650;" src="/upload/getfiles/default/2022/11/10/20221110035733743.jpg" title="5.JPG" />

在浏览器中输入: http://ip/nginxstatus 输入刚创建的用户名密码登陆

技术分享650) this.width=650;" src="/upload/getfiles/default/2022/11/10/20221110035734081.jpg" title="6.JPG" />

登陆后的页面:

 

技术分享650) this.width=650;" src="/upload/getfiles/default/2022/11/10/20221110035734694.jpg" title="7.JPG" />

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 文件。

检测如下信息说明配置文件正确:

技术分享650) this.width=650;" src="/upload/getfiles/default/2022/11/10/20221110035735092.jpg" title="8.JPG" />

显示 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

技术分享650) this.width=650;" src="/upload/getfiles/default/2022/11/10/20221110035735560.jpg" title="9.JPG" />

关闭 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


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!