Nginx常用功能
1,负载均衡
Nginx提供的负载均衡策略有2种:内置策略和扩展策略。
2、Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理。

  • Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能。
  • Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器,只要你正则写的没问题,又有相对应的服务器解决方案,你就可以随心所欲的配置。
  • 并且Nginx对返回结果进行错误页跳转,异常判断等。如果被分发的服务器存在异常,他可以将请求重新转发给另外一台服务器,然后自动去除异常服务器。

3、web缓存
Nginx可以对不同的文件做不同的缓存处理,配置灵活,并且支持FastCGI_Cache,主要用于对FastCGI的动态程序进行缓存。配合着第三方的ngx_cache_purge,对制定的URL缓存内容可以的进行增删管理。

Nginx 虚拟主机管理

  • 虚拟主机使用的是特殊的软硬件技术,它把一台运行在因特网上的服务器主机分成一台台“虚拟”的主机,每台虚拟主机都可以是一个独立的网站,可以具有独立的域名,具有完整的Intemet服务器功能(WWW、FTP、Email等),同一台主机上的虚拟主机之间是完全独立的。从网站访问者来看,每一台虚拟主机和一台独立的主机完全一样。
  • 利用虚拟主机,不用为每个要运行的网站提供一台单独的Nginx服务器或单独运行一组Nginx进程。虚拟主机提供了在同一台服务器、同一组Nginx进程上运行多个网站的功能。

Nginx 并发优化
Linux下高并发socket最大连接数所受的各种限制

  • 修改用户进程可打开文件数限制 :
    vim /etc/security/limits.conf
nginx  -  nofile  65535      # 配置文件末尾添加一行
  • Linux系统级的最大打开文件数限制
    fs.file-max = 188414 //和内存容量相关
  • 修改网络内核对TCP连接的有关限制
    net.ipv4.ip_local_port_range = 1024 65535
  • 限制接收新 TCP 连接侦听队列的大小
    net.core.somaxconn = 2048
  • 启用tcp连接timewait快速回收和重用
    net.ipv4.tcp_tw_recycle = 1
    net.ipv4.tcp_tw_reuse = 1
  • nginx位置匹配到其他路径是什么_服务器

  • Nginx 主要配置文件(nginx.conf)
# 注意每个语句结尾必须 有分隔符 ' ;'
        user nginx niinx;     # 设置 nginx 用户来执行 nginx 服务,nginx 用户不存在的话需创建 
        worker_processes  2;  # 全局区   有两个工作子进程,一般设置为CPU数 * 核数,或者 设置为 "auto" 自动根据主机内核数设置自工作进程
        worker_cpu_affinity  1000  0100; # 当前主机内核数为 4,开启第三、第四个内核来完成两个工作子进程的任务,第一、第二个内核处于闲置状态
         events {
                 # 一般是配置nginx进程与连接的特性
                 multi_accept on;            # 告诉nginx收到一个新连接通知后接受尽可能多的连接
                 use epoll; 		         # 使用epoll模型
                 worker_connections  65535;  # 单个工作进程 worker 并发连接数 ,一个子进程最大允许连接65535个连接
                 
                 sendfile on;                # 开启文件高效传输模式, 同时设置tcp_nopush 和tcp_nodelay 为on,可以防止网路和磁盘IO阻塞。
                 tcp_nopush on; 
                 tcp_nodelay on;
                 keepalived_timeout  65;     #  保持尝试连接时间 65s
         }
 
         # 配置HTTP服务器配置段
         http {
 
                 # 配置虚拟主机段
                     server {
                     
                         # 定位,把特殊的路径或文件再次定位。
                 location  {
                    
                } 
            }
 
             server {
                        ...
             }
         }

nginx 作为 http 服务器时:

  • max_clients = worker_processes * worker_connections

nginx作为反向代理服务器时:

  • max_clients = worker_processes * worker_connections / 2

基于域名的虚拟主机
1、在http大括号中添加如下代码段:

server {    
        listen 80;                     # 监听端口 80    
        server_name www.westos.org;    # 监听域名www.westos.org;
          
        location / {                    
            root    westos;            # 相对路径,相对nginx根目录。也可写成绝对路径
            index index.html;          # 默认跳转到index.html页面             
        }  
    }

2、切换安装目录:cd/usr/local/nginx/
3、创建目录:mkdir westos
4、新建index.html文件:vi /usr/local/nginx/westos/index.html,文件内容: echo “welcom westos”
5、重新读取配置文件:

/usr/local/nginx/sbin/nginx-s reload
kill -HUP进程号

6、配置 CLIENT 测试主机本地解析 hosts:
vim /etc/hosts

172.25.1.2  www.westos.org      #Linux服务器IP地址 以及对应域名 解析

7、访问测试:http://westos.org:80/

基于端口的虚拟主机配置

server {
        listen  8080;
        server_name     abc.com;
        location / {
           root    /home;
           index index.html;
        }
    }

基于IP地址虚拟主机配置

server {
      listen  80;
      server_name  172.25.1.3;
      location / {
              root    ip;
              index index.html;
      }
    }

Location 配置

Location 语法规则:location [=||*|^~] /uri/ {… }

符号

含义

=

= 开头表示精确匹配

^~

^~开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)

~

~ 开头表示区分大小写的正则匹配

~*

~* 开头表示不区分大小写的正则匹配

!和!*

!和!*分别为区分大小写不匹配及不区分大小写不匹配的正则

/

用户所使用的代理(一般为浏览器)

$http_x_forwarded_for

可以记录客户端IP,通过代理服务器来记录客户端的ip地址

$http_referer

可以记录用户是从哪个链接访问过来的

匹配规则示例

产生的效果

location = / { # 规则A }

访问根目录/,比如http://localhost/将匹配规则A

location =/login { # 规则B }

访问 http://localhost/login 将匹配规则B,http://localhost/register则匹配规则H

location ^~ /static/ { # 规则C }

访问 http://localhost/static/a.html 将匹配规则C

location ~ .(gif jpj)$ { # 规则D }

访问 http://localhost/a.gif,http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而http://localhost/static/c.png则优先匹配到规则C

location ~* .png$ { # 规则E }

访问 http://localhost/a.PNG 则匹配规则E,而不会匹配规则D,因为规则E不区分大小写。

location !~ .xhtml$ { # 规则F }

访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到

location !~* .xhtml$ { # 规则G }

location = / { # 规则H }

访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(PHP),tomcat(jsp),nginx作为方向代理服务器存在。

实际常用规则

1.第一个必选规则

location = / {                              # 直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理。
       proxy_passhttp://tomcat:8080/index       # 这里是直接转发给后端应用服务器了,也可以是一个静态首页
    }

2.第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用

location ^~ /static/ {
       # 请求/static/a.txt 将被映射到实际目录文件:/webroot/res/static/a.txt
       root /webroot/res/;
    }

    location ~* \.(gif|jpg|jpeg|png|css|js|ico)${
       root /webroot/res/;
    }

3.第三个规则就是通用规则,用来转发动态请求到后端应用服务器 (#非静态文件请求就默认是动态请求,带.php,.jsp等后缀的情况)

location / {
       proxy_pass http://tomcat:8080/
    }

ReWrite语法

  • Nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向
  • rewrite只能放在 server{} , location{} , if{} 语句块中,并且只能对域名后边的除去传递的参数外的字符串起作用。

Rewrite全局变量

变量

含义

$remote_addr

客户端的IP地址。

$remote_port

客户端的端口。

$request_uri

包含请求参数的原始URI,不包含主机名,如”/foo/bar.php?arg=baz”。

$host

请求主机头字段,否则为服务器名称。

if 指令
if 语法格式

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

return 指令

应用实例 < 1 >:限制 IP访问

Location / {
Deny 172.25.0.10;            # 拒绝来自 172.25.0.10 IP的访问请求
Allow 172.25.0.0/24;         # 允许 172.25.0.0/24 这个网段的所有强求
Deny all;                    # 拒绝所有用户请求
}

If ($remote_addr = 172.25.0.254) {      # 来自 172.25.0.254 IP的访问请求后,返回 403 报错信息
return 403;
}

rewrite 重定向 指令

  • #判断目录是否存在
  • #服务器内部的rewrite和302跳转不一样.跳转的话URL都变了,变成重新http请求index.html,而内部rewrite 重定向,上下文没变

应用实例 < 2 >:http(80端口) 访问重定向 https(443端口)

  • cd /etc/pki/tls/certs
  • make cert.pem # 制作 cert.pem (key 文件)
  • mv cert.pem /usr/local/nginx/conf/
  • vim /usr/local/lnmp/nginx/conf/nginx.conf
  • nginx -t
  • nginx -s reload
server {
	listen 80;
	server_name www.westos.org;                               # 访问 http://www.westos.org
	rewrite ^/(.*)$ https://www.westos.org/$1 permanent;      # 重定向访问 https://www.westos.org
}

server {
	listen 443 ssl;                                      # 监听 443 端口 
	server_name localhost;                               # 虚拟服务器 具备https (443端口) 主机为本主机
	ssl_certificate       cert.pem;
	ssl_certificate_key   cert.pem;                      # 加密,密匙访问
	...
	location / {
	root html;
	index  index.html;
	}
}

应用实例 < 3 >:域名www.westos.org/bbs 访问重定向 bbs.westos.org

server {
	listen 80;
	server_name www.westos.org;                               # 访问 http://www.westos.org
	rewrite ^/bbs$ http://bbs.westos.org permanent;           # www.westos.org/bbs 访问重定向 bbs.westos.org (首页)
    rewrite ^/bbs/(.*)$ http://bbs.westos.org/$1 permanent;   # www.westos.org/bbs/(.* 所有) 访问重定向 bbs.westos.org/(所有) 
                                                              # 注意:两次重定向路径层次不一样
}

应用实例 < 4 >:域名bbs.westos.org 重定向 www.westos.org/bbs

if ($host = "bbs.westos.org"){                               # if 请求主机(服务器)域名为 bbs.westos.org
	rewrite ^/(.*)$ http://www.westos.org/bbs/$1 permanent;  # 重定向 www.westos.org/bbs/下
	}

Nginx 工作原理及安装配置
工作原理:

  • Nginx 由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个 location block(location 是 Nginx配置中的一个指令,用于 URL 匹配),而在这个 location 中所配置的每个指令将会启动不同的模块去完成相应的工作。
    Nginx 的模块从结构上分为:
  • 核心模块:HTTP 模块、 EVENT 模块和 MAIL 模块
  • 基础模块: HTTP Access 模块、HTTP FastCGI 模块、HTTP Proxy 模块和 HTTP Rewrite模块
  • 第三方模块:HTTP Upstream Request Hash 模块、 Notice 模块和 HTTP Access Key模块。

nginx.conf 配置文件结构

...              #全局块

events {         #events块
   ...
}

http      #http块
{
    ...   #http全局块
    server        #server块
    { 
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局块
}
  1. main (全局块):main部分配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
  2. events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  3. http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
  4. server块(主机设置):指令主要用于指定虚拟主机域名、IP和端口等,虚拟主机的相关参数,一个http中可以有多个server。
  5. location块(URL匹配特定位置后的设置):配置请求的路由( 即匹配网页位置–比如,根目录"/","/images",等等),以及各种页面的处理情况。
    备注:server继承main,location继承server;upstream(event+http)既不会继承指令也不会被继承。它有自己的特殊指令,不需要在其他地方的应用。