首页 > 系统相关 >nginx学习笔记

nginx学习笔记

时间:2023-04-23 18:44:18浏览次数:47  
标签:http -- module 学习 nginx without 笔记 ngx

开始

简介

Nginx是一款高性能的开源Web服务器和反向代理服务器,它能够提供可扩展性、高可用性和高性能。

优点

  1. 更快

单次请求更快,高峰期也更快

  1. 高扩展性

极具扩展性,它由多个不同功能、不同层次、不同类型且耦合度极高的模块组成,这种低耦合的设计,造就了它庞大的第三方模块

  1. 高可靠性

每个worker进程相对独立,master进程在某个worker进程出错时能迅速拉起新的worker进程

nginx的可靠性来源于其核心框架代码的优秀设计、模块设计的简单性。

官方提供的常用模块都很稳定。

  1. 低内存消耗

一般情况下10000个非活跃的keep-alive连接仅消耗2.5M的内存

  1. 单机支持10万以上的并发连接

nginx支持的并发连接上限取决于内存,10万远没封顶

  1. 热部署

master管理进程

worker工作进程

  1. 最自由的BSD许可协议

nginx的主要应用场合

  1. 作为web服务软件

Nginx是一个支持高性能、高并发的Web服务软件,他举有很多优秀的特性,作为Web服务器,与Apache相比,Nginx能够支持更多的比那个发链接访问,但占用的资源却更少,效率更高,在功能上也很强大,几乎不逊色于Apace。

  1. 反向代理或负载均衡服务

在反向代理负载均衡服务方面,Nginx可以作为服务器、PHP等动态服务器及Memcached缓存的代理服务器,它具类似专业反向代理软件(如Haproxy)的功能,同时也是一个优秀的邮件代理软件,但是Nginx的反向代理功能还是相对比较简单的,特别是不支持TCP的代理,不过从Nginx1.9.0之后就开始支持TCP代理,这也说明Nginx的代理功能也在不断的增强。

  1. 前端业务数据缓存服务

在Web缓存服务方面,Nginx可以通过自身的proxy_cache模块实现类似的Squid等专业的缓存软件的功能。

Nginx的这三大功能,(Web服务,反向代理或负载均衡服务、前端业务数据缓存服务)是国内使用Nginx的主要场景,特别是前面这两个。

安装

必要的软件准备

yum install pcre pcre-devel -y # 如过你已经装了,请跳这一步
#或者使用源代码安装
cd /usr/local/src && wget -O pcre-8.31.tar.gz http://sourceforge.net/projects/pcre/files/pcre/8.31/pcre-8.31.tar.gz/download

tar xf pcre-8.31.tar.gz && cd pcre-8.31

./configure

make && make install

yum install openssl openssl-devel -y # 需要ssl的支持,如果不需要ssl支持,请跳过这一步

#安装nginx
yum install openssl-devel pcre-devel -y

useradd webadmin -M -s /sbin/nologin

cd /usr/local/src && wget -O nginx-1.8.0.tar.gz http://nginx.org/download/nginx-1.8.0.tar.gz

tar xf nginx-1.8.0.tar.gz && cd nginx-1.8.0

./configure --user=webadmin --group=webadmin --prefix=/application/tools/nginx-1.8.0 --with-http_stub_status_module --with-http_ssl_module

make && make install

#建立软连接
ln -s /application/tools/nginx-1.8.0 /usr/local/nginx

nginx编译参数

--prefix= 指向安装目录

--sbin-path= 指向(执行)程序文件(nginx)

--conf-path= 指向配置文件(nginx.conf)

--error-log-path= 指向错误日志目录

--pid-path= 指向pid文件(nginx.pid)

--lock-path= 指向lock文件(nginx.lock)(安装文件锁定,防止安装文件被别人利用,或自己误操作。)

--user= 指定程序运行时的非特权用户

--group= 指定程序运行时的非特权用户组

--builddir= 指向编译目录

--with-rtsig_module 启用rtsig模块支持(实时信号)

--with-select_module 启用select模块支持(一种轮询模式,不推荐在高载环境下使用)禁用:--without-select_module

--with-poll_module 启用poll模块支持(功能与select相同,与select特性相同,为一种轮询模式,不推荐在高载环境下使用)

--with-file-aio 启用file aio支持(一种APL文件传输格式)

--with-ipv6 启用ipv6支持

--with-http_ssl_module 启用ngx_http_ssl_module支持(使支持https请求,需已安装openssl)

--with-http_realip_module 启用ngx_http_realip_module支持(这个模块允许从请求标头更改客户端的IP地址值,默认为关)

--with-http_addition_module 启用ngx_http_addition_module支持(作为一个输出过滤器,支持不完全缓冲,分部分响应请求)

--with-http_xslt_module 启用ngx_http_xslt_module支持(过滤转换XML请求)

--with-http_image_filter_module 启用ngx_http_image_filter_module支持(传输JPEG/GIF/PNG 图片的一个过滤器)(默认为不启用。gd库要用到)

--with-http_geoip_module 启用ngx_http_geoip_module支持(该模块创建基于与MaxMind GeoIP二进制文件相配的客户端IP地址的ngx_http_geoip_module变量)

--with-http_sub_module 启用ngx_http_sub_module支持(允许用一些其他文本替换nginx响应中的一些文本)

--with-http_dav_module 启用ngx_http_dav_module支持(增加PUT,DELETE,MKCOL:创建集合,COPY和MOVE方法)默认情况下为关闭,需编译开启

--with-http_flv_module 启用ngx_http_flv_module支持(提供寻求内存使用基于时间的偏移量文件)

--with-http_gzip_static_module 启用ngx_http_gzip_static_module支持(在线实时压缩输出数据流)

--with-http_random_index_module 启用ngx_http_random_index_module支持(从目录中随机挑选一个目录索引)

--with-http_secure_link_module 启用ngx_http_secure_link_module支持(计算和检查要求所需的安全链接网址)

--with-http_degradation_module  启用ngx_http_degradation_module支持(允许在内存不足的情况下返回204或444码)

--with-http_stub_status_module 启用ngx_http_stub_status_module支持(获取nginx自上次启动以来的工作状态)

--without-http_charset_module 禁用ngx_http_charset_module支持(重新编码web页面,但只能是一个方向--服务器端到客户端,并且只有一个字节的编码可以被重新编码)

--without-http_gzip_module 禁用ngx_http_gzip_module支持(该模块同-with-http_gzip_static_module功能一样)

--without-http_ssi_module 禁用ngx_http_ssi_module支持(该模块提供了一个在输入端处理处理服务器包含文件(SSI)的过滤器,目前支持SSI命令的列表是不完整的)

--without-http_userid_module 禁用ngx_http_userid_module支持(该模块用来处理用来确定客户端后续请求的cookies)

--without-http_access_module 禁用ngx_http_access_module支持(该模块提供了一个简单的基于主机的访问控制。允许/拒绝基于ip地址)

--without-http_auth_basic_module禁用ngx_http_auth_basic_module(该模块是可以使用用户名和密码基于http基本认证方法来保护你的站点或其部分内容)

--without-http_autoindex_module 禁用disable ngx_http_autoindex_module支持(该模块用于自动生成目录列表,只在ngx_http_index_module模块未找到索引文件时发出请求。)

--without-http_geo_module 禁用ngx_http_geo_module支持(创建一些变量,其值依赖于客户端的IP地址)

--without-http_map_module 禁用ngx_http_map_module支持(使用任意的键/值对设置配置变量)

--without-http_split_clients_module 禁用ngx_http_split_clients_module支持(该模块用来基于某些条件划分用户。条件如:ip地址、报头、cookies等等)

--without-http_referer_module 禁用disable ngx_http_referer_module支持(该模块用来过滤请求,拒绝报头中Referer值不正确的请求)

--without-http_rewrite_module 禁用ngx_http_rewrite_module支持(该模块允许使用正则表达式改变URI,并且根据变量来转向以及选择配置。如果在server级别设置该选项,那么他们将在 location之前生效。如果在location还有更进一步的重写规则,location部分的规则依然会被执行。如果这个URI重写是因为location部分的规则造成的,那么 location部分会再次被执行作为新的URI。 这个循环会执行10次,然后Nginx会返回一个500错误。)

--without-http_proxy_module 禁用ngx_http_proxy_module支持(有关代理服务器)

--without-http_fastcgi_module 禁用ngx_http_fastcgi_module支持(该模块允许Nginx 与FastCGI 进程交互,并通过传递参数来控制FastCGI 进程工作。 )FastCGI一个常驻型的公共网关接口。

--without-http_uwsgi_module 禁用ngx_http_uwsgi_module支持(该模块用来医用uwsgi协议,uWSGI服务器相关)

--without-http_scgi_module 禁用ngx_http_scgi_module支持(该模块用来启用SCGI协议支持,SCGI协议是CGI协议的替代。它是一种应用程序与HTTP服务接口标准。它有些像FastCGI但他的设计 更容易实现。)

--without-http_memcached_module 禁用ngx_http_memcached_module支持(该模块用来提供简单的缓存,以提高系统效率)

-without-http_limit_zone_module 禁用ngx_http_limit_zone_module支持(该模块可以针对条件,进行会话的并发连接数控制)

--without-http_limit_req_module 禁用ngx_http_limit_req_module支持(该模块允许你对于一个地址进行请求数量的限制用一个给定的session或一个特定的事件)

--without-http_empty_gif_module 禁用ngx_http_empty_gif_module支持(该模块在内存中常驻了一个1*1的透明GIF图像,可以被非常快速的调用)

--without-http_browser_module 禁用ngx_http_browser_module支持(该模块用来创建依赖于请求报头的值。如果浏览器为modern ,则$modern_browser等于modern_browser_value指令分配的值;如 果浏览器为old,则$ancient_browser等于 ancient_browser_value指令分配的值;如果浏览器为 MSIE中的任意版本,则 $msie等于1)

--without-http_upstream_ip_hash_module 禁用ngx_http_upstream_ip_hash_module支持(该模块用于简单的负载均衡)

--with-http_perl_module 启用ngx_http_perl_module支持(该模块使nginx可以直接使用perl或通过ssi调用perl)

--with-perl_modules_path= 设定perl模块路径

--with-perl= 设定perl库文件路径

--http-log-path= 设定access log路径

--http-client-body-temp-path= 设定http客户端请求临时文件路径

--http-proxy-temp-path= 设定http代理临时文件路径

--http-fastcgi-temp-path= 设定http fastcgi临时文件路径

--http-uwsgi-temp-path= 设定http uwsgi临时文件路径

--http-scgi-temp-path= 设定http scgi临时文件路径

-without-http 禁用http server功能

--without-http-cache 禁用http cache功能

--with-mail 启用POP3/IMAP4/SMTP代理模块支持

--with-mail_ssl_module 启用ngx_mail_ssl_module支持

--without-mail_pop3_module 禁用pop3协议(POP3即邮局协议的第3个版本,它是规定个人计算机如何连接到互联网上的邮件服务器进行收发邮件的协议。是因特网电子邮件的第一个离线协议标 准,POP3协议允许用户从服务器上把邮件存储到本地主机上,同时根据客户端的操作删除或保存在邮件服务器上的邮件。POP3协议是TCP/IP协议族中的一员,主要用于 支持使用客户端远程管理在服务器上的电子邮件)

--without-mail_imap_module 禁用imap协议(一种邮件获取协议。它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。IMAP协议运行在TCP/IP协议之上, 使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。)

--without-mail_smtp_module 禁用smtp协议(SMTP即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。)

--with-google_perftools_module 启用ngx_google_perftools_module支持(调试用,剖析程序性能瓶颈)

--with-cpp_test_module 启用ngx_cpp_test_module支持

--add-module= 启用外部模块支持

--with-cc= 指向C编译器路径

--with-cpp= 指向C预处理路径

--with-cc-opt= 设置C编译器参数(PCRE库,需要指定–with-cc-opt=”-I /usr/local/include”,如果使用select()函数则需要同时增加文件描述符数量,可以通过–with-cc- opt=”-D FD_SETSIZE=2048”指定。)

--with-ld-opt= 设置连接文件参数。(PCRE库,需要指定–with-ld-opt=”-L /usr/local/lib”。)

--with-cpu-opt= 指定编译的CPU,可用的值为: pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64

--without-pcre 禁用pcre库

--with-pcre 启用pcre库

--with-pcre= 指向pcre库文件目录

--with-pcre-opt= 在编译时为pcre库设置附加参数

--with-md5= 指向md5库文件目录(消息摘要算法第五版,用以提供消息的完整性保护)

--with-md5-opt= 在编译时为md5库设置附加参数

--with-md5-asm 使用md5汇编源

--with-sha1= 指向sha1库目录(数字签名算法,主要用于数字签名)

--with-sha1-opt= 在编译时为sha1库设置附加参数

--with-sha1-asm 使用sha1汇编源

--with-zlib= 指向zlib库目录

--with-zlib-opt= 在编译时为zlib设置附加参数

--with-zlib-asm= 为指定的CPU使用zlib汇编源进行优化,CPU类型为pentium, pentiumpro

--with-libatomic 为原子内存的更新操作的实现提供一个架构

--with-libatomic= 指向libatomic_ops安装目录

--with-openssl= 指向openssl安装目录

--with-openssl-opt 在编译时为openssl设置附加参数

--with-debug 启用debug日志

Nginx信号管理

Nginx的信号管理命令为:kill -参数 Nginx进程号
例如:kill -HUP $(cat /usr/local/nginx/logs/nginx.pid)
查看pid文件位置,可执行nginx -V,查找--pid-path
查看conf文件位置,可执行nginx -V,查找--conf-path

参数 解释
TERM, INT 快速关闭
QUIT 优雅关闭进程,等请求结束后再关闭
KILL 停止一个顽固的进程
HUP 改变配置文件,平滑重读配置文件
USR1 重读日志,可在日志切割时使用
USR2 平滑升级
WINCH 优雅关闭旧的进程,配合USER2一块使用
#启动nginx
/usr/local/nginx/sbin/nginx

#停止nginx
nginx -s stop 或者
kill -TERM 主进程号 或者
kill -INT 主进程号

#重新加载配置文件
nginx -s reload 或者 
kill -HUP 主进程号

#测试配置文件,检查配置文件语法是否正确
nginx -t

#查看nginx版本信息: 
nginx -v

#查看nginx版本信息,编译版本,和配置参数:
nginx -V

#重启日志文件,备份日志文件时常用:
nginx -s reopen 或者 
kill -USR1 主进程号

#nginx的平滑升级
kill -USR2 旧版本主进程号
kill -WINCH 旧版本主进程号
#再查看版本号, 就平滑升级成了新的版本

Nginx配置

user root;
events {
    worker_connections  1024;
}
http {
  include mime.types;
  server {
    listen 80;
    server_name localhost;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    root /etc/web/dist;
    access_log /log/web/access.log main;
    error_log /log/web/error.log;
    error_page 404 = /;
    location = /easyolap {
      try_files $uri $uri/ /index.html;
    }
    location /static {
      root   /etc/web/dist;
    }
    location /easyolap/v1/ {
      proxy_pass http://pre-api.xx.com;
    }
  }
}

日志按日期存储

shell+定时任务+nginx信号管理

思路:凌晨00:00:01,把昨天的日志重命名,放在相应的目录下
再USR1信息号控制nginx重新生成新的日志文件
具体脚本:

#!/bin/bash
base_path='/log/web'
log_path=$(date -d yesterday +"%Y%m")
day=$(date -d yesterday +"%d")
mkdir -p $base_path/$log_path
mv $base_path/access.log $base_path/$log_path/access_$day.log
#echo $base_path/$log_path/access_$day.log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

定时任务:

01 00 * * * /xxx/path/b.sh  每天0时1分(建议在02-04点之间,系统负载小)

location语法

location 有”定位”的意思, 根据Uri来进行不同的定位.
在虚拟主机的配置中,是必不可少的,location可以把网站的不同部分,定位到不同的处理方式上.
比如, 碰到.php, 如何调用PHP解释器? --这时就需要location

语法

location [=|~|~*|^~] patt {
}
参数解释:
= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
~ 开头表示区分大小写的正则匹配
~* 开头表示不区分大小写的正则匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配的正则
/ 通用匹配,任何请求都会匹配到。

中括号可以不写任何参数,此时称为一般匹配
也可以写参数
因此,大类型可以分为3种

  1. location = patt {} [精准匹配]
  2. location patt{} [一般匹配]
  3. location ~ patt{} [正则匹配]

location配置优先级

  1. 先判断精准匹配,如果匹配,立即返回结果并结束解析过程
  2. 然后,判断普通命中没如果有多个命中,记录最长的匹配结果
  3. 再然后判断正则表达式的解析过程,按配置里的正则表达式顺序为准,由上到下开始匹配,一旦匹配成功立即返回结果并结束解析过程。

通过上面的分析我们可以知道:

  1. 普通匹配与顺序无关,因为按照匹配的长短来取匹配结果。
  2. 正则匹配与顺序有关,因为是从上往下匹配。(首先匹配,取其之。结束解析过程)

一个简单的例子:

  server {
    listen 8080;
    server_name localhost;
    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 /log/web/access.log main;
    error_log /log/web/error.log;
    location / {
      root myhtml/;
      #autoindex on;
      #index index.html;
    }
  }

nginx的rewrite语法详解

rewrite 使用环境

Server location if

重写过程中可能用到的指令

if (条件) { // 设定条件在进行重写
}

set # 设置变量

return # 返回状态码

break # 跳出rewrite

rewrite # 重写

rewrite模块指令

指令 语法 默认值 使用环境
break break none server, location, if
if (尽量考虑使用 trp_files 代替) if (condition) none server, location
return return code none server, location, if
rewrite rewrite regex replacement flag none server, location, if
rewrite_log rewrite_log on/off off server, location, if
set set variable value none server, location, if

语法格式如下:

if + 空格 (条件) {
  重写模式
}

括号中的条件有如下几种写法:

  • = 用来判断相等,用于字符串的比较
  • ~ 用正则来匹配(区分大小写)
  • ~* 用正则来匹配(不区分大小写)
  • -f-d-e 判断是否为文件、是否为目录和是否存在

ecshop实战重写url

#add by luo for ecshop grobal rewrite
location /ecshop {
    # 商品详情页 http://192.168.0.200/ecshop/goods.php?id=9 -> http://192.168.0.200/ecshop/goods-9.html
    rewrite goods-(\d+)-.*\.html /ecshop/goods.php?id=$1;

    # 文章详情页 http://192.168.0.200/ecshop/article.php?id=12 -> http://192.168.0.200/ecshop/article-12.html
    rewrite article-(\d+)-.*\.html /ecshop/article.php?id=$1;

    # 复杂栏目检索页 http://192.168.0.200/ecshop/category.php?category=3&display=list&brand=0&price_min=0&price_max=0&filter_attr=0&page=1&sort=goods_id&order=ASC#goods_list -> http://192.168.0.200/ecshop/category-3-b0-min0-max0-attr0-1-goods_id-ASC.html
    rewrite category-(\d+)-b(\d+)-min(\d+)-max(\d+)-attr([\d\.]+)-(\d+)-(\w+)-(\w+)\.html /ecshop/category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5&page=$6&sort=$7&order=$8#goods_list;

    # 栏目检索页 http://192.168.0.200/ecshop/category-3-b1-min200-max1700-attr167.229.202.199.html -> http://192.168.0.200/ecshop/category.php?id=3&brand=1&price_min=200&price_max=1700&filter_attr=167.229.202.199
    rewrite category-(\d+)-b(\d+)-min(\d+)-max(\d+)-attr([\d\.]+).*\.html /ecshop/category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5;

    # 栏目页面 http://192.168.0.200/ecshop/category-2-b0.html -> http://192.168.0.200/ecshop/category.php?id=3&brand=1
    rewrite category-(\d+)-b(\d+)-.*\.html /ecshop/category.php?id=$1&brand=$2;
}

标签:http,--,module,学习,nginx,without,笔记,ngx
From: https://www.cnblogs.com/dabanya/p/17347418.html

相关文章

  • 深度学习样本绘制注意事项
    在绘制深度学习样本的时候,部分初学者总是用绘制监督分类样本的方法绘制深度学习样本,在图像上随意绘制样本,这种绘制样本的方法不适用于深度学习样本绘制。如下为错误的示例:深度学习样本绘制应遵循“全、多、精”三个原则:样本子区域选取,应该全面覆盖多种地物类型。绘制样本尽......
  • 「学习笔记」2-SAT问题
    SAT是适定性\(\text{(Satisfiability)}\)问题的简称。一般形式为k-适定性问题,简称k-SAT。而当\(k>2\)时该问题为NP完全的。所以我们只研究\(k=2\)的情况。2-SAT,简单的说就是给出\(n\)个集合,每个集合有两个元素,已知若干个\(<a,b>\),表示\(a\)与\(b\)矛盾(其中......
  • RxDart框架学习
    一、RxDart是什么?RxDart是一个响应式编程框架,是基于ReactiveX的响应式函数编程库,ReactiveX是一个强大的库,通过使用可观察的序列来编写异步的程序。它突破了语言以及平台的限制,使我们在写异步程序的时候更简洁。ReactiveX开发过多个语言下的响应式框架,比较有名的就是RxJava、R......
  • 《Redis设计与实现》读书笔记
    《Redis设计与实现》读书笔记简单动态字符串SDS的定义结构:buf数组:用于保存字符串len属性:记录SDS中保存字符串的长度free属性:记录buf中未使用字节数量遵循C字符串以空字符串结尾的惯例,保存空字符串的字节不计入长度SDS与C字符串的区别常数复杂度获取字符串长度因为SDS中......
  • 自学Vue基础笔记
    ......
  • Markdowm学习
    #Markdowm学习标题##二级标题###三级标题#字体**Hello,world!***Hello,world****Hello,worid!***~~Hello,world!~~#引用>##分割线---##图片![截图](E:\新建文件夹(2)\屏幕截图2022-11-12165730.png)![图片]()##超链接[点击跳转](http://m.jrj.com.cn/......
  • Nginx配置跨域,覆盖后端服务跨域配置
    本篇文章主要介绍了,如何通过Nginx配置跨域,并覆盖后端服务跨域配置。先看下后端代码跨域配置:主要的目标是:不修改后端跨域配置代码,来实现Nginx跨域指定域名。@BeanpublicCorsFiltercorsFilter(){finalUrlBasedCorsConfigurationSourceurlBasedCorsCon......
  • Unity___QFramework笔记
    引入Event引入事件监听。使用方法先定义一个事件类//定义数据变更事件publicstructCountChangeEvent//++{}//执行事件this.SendEvent<CountChangeEvent>();//++//注册事件this.RegisterEvent<CountChangeEvent>(e......
  • nginx 转发
    server{listen80;#listen443ssl;server_name*.*.com;#rewrite^(.*)$https://$host$1permanent;gzipon;gzip_staticon;#需要http_gzip_static_module模块gzip_min_length1k;gzip_comp_level4;gzip_proxiedany......
  • 安装centos79的笔记
    一、安装下载centos79最终全集版的iso文件:https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/isos/x86_64/一般建议下载那个CentOS-7-x86_64-Everything-2207-02.iso,一代经典的centos7,出到的最后一个版本。这里进行的是在vmwareworkstation16.1中安装,2C4G40G的简朴配置......