nginx基础知识

nginx主配置文件 nginx.conf

配置文件结构如下:

worker_process        # 表示工作进程的数量, 一般设置为cpu的核数
worker_connections    # 表示每个工作进程的最大连接数
server{}              # 块定义了虚拟主机
    listen            # 监听端口
    server_name       # 监听域名
    location {}       # 是用来为匹配的 URI 进行配置, URI 即语法中的“/uri/”
    location /{}      # 匹配任何查询, 因为所有请求都以 / 开头
        root          # 指定对应uri的资源查找路径, 这里html为相对路径, 完整路径为
                      # /opt/nginx-1.7.7/html/
        index         # 指定首页index文件的名称, 可以配置多个, 以空格分开。 如有多
                      # 个, 按配置顺序查找。

location匹配规则

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

模式 含义
location = /uri = 表示精确匹配, 只有完全匹配上才能生效
location ^~ /uri ^~ 开头对URL路径进行前缀匹配, 并且在正则之前。
location ~ pattern 开头表示区分大小写的正则匹配
location ~* pattern 开头表示不区分大小写的正则匹配
location /uri 不带任何修饰符, 也表示前缀匹配, 但是在正则匹配之后
location / 通用匹配, 任何未匹配到其它location的请求都会匹配到, 相当于switch中的default

rewrite语法

  • last : 基本上都用这个 Flag
  • break : 中止 Rewirte, 不再继续匹配
  • redirect : 返回临时重定向的 HTTP 状态 302
  • permanent : 返回永久重定向的 HTTP 状态 301
  1. 下面是可以用来判断的表达式:
-f 和 !-f 用来判断是否存在文件
-d 和 !-d 用来判断是否存在目录
-e 和 !-e 用来判断是否存在文件或目录
-x 和 !-x 用来判断文件是否可执行
  1. 下面是可以用作判断的全局变量
例: http://localhost:88/test1/test2/test.php?k=v
$host: localhost
$server_port: 88
$request_uri: /test1/test2/test.php?k=v
$document_uri: /test1/test2/test.php
$document_root: D:\nginx/html
$request_filename: D:\nginx/html/test1/test2/test.php

redirect语法

server {
    listen 80;
    server_name start.igrow.cn;
    index index.html index.php;
    root html;
    if ($http_host !~ "^star\.igrow\.cn$") {
        rewrite ^(.*) http://star.igrow.cn$1 redirect;
    }
}

防盗链

location ~* \.(gif|jpg|swf)$ {
    valid_referers none blocked start.igrow.cn sta.igrow.cn;
    if ($invalid_referer) {
        rewrite ^/ http://$host/logo.png;
    }
}

根据文件类型设置过期时间

location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
    if (-f $request_filename) {
        expires 1h;
        break;
    }
}

禁止访问某个目录

location ~* \.(txt|doc)${
    root /data/www/wwwroot/linuxtone/test;
    deny all;
}

使用if指令测试一个变量

if ($request_method = POST) {
    return 405;
} 

if ($args ~ post=140){
    rewrite ^ http://example.com/ permanent;
}

最佳实践: 在if指令块内,最好只有 return ...; rewrite ... last; 指令。其他指令执行不一定会是预期的结果。

静态文件服务

server {
    listen 80;
    server_name www.test.com;
    charset utf-8;
    root /data/www.test.com;
    index index.html index.htm;
}

日志

access_log 访问日志

默认的访问日志:

log_format combined '$remote_addr - $remote_user [$time_local] '
                    ' "$request" $status $body_bytes_sent '
                    ' "$http_referer" "$http_user_agent" ';

access_log中可用字段如下:

字段 作用
$remote_addr与 $http_x_forwarded_for 记录客户端IP地址
$remote_user 记录客户端用户名称
$request 记录请求的URI和HTTP协议
$status 记录请求状态
$body_bytes_sent 发送给客户端的字节数, 不包括响应头的大小
$bytes_sent 发送给客户端的总字节数
$connection 连接的序列号
$connection_requests 当前通过一个连接获得的请求数量
$msec 日志写入时间。 单位为秒, 精度是毫秒
$pipe 如果请求是通过HTTP流水线(pipelined)发送, pipe值为“p”, 否则为“.”
$http_referer 记录从哪个页面链接访问过来的
$http_user_agent 记录客户端浏览器相关信息
$request_length 请求的长度( 包括请求行, 请求头和请求正文)
$request_time 请求处理时间, 单位为秒, 精度毫秒
$time_iso8601 ISO8601标准格式下的本地时间
$time_local 记录访问时间与时区

error_log 错误日志

error_log 主要记录客户端访问 Nginx 出错时的日志, 格式不支持自定义。
error_log 指令用来指定错误日志, 语法: error_log path [level] ;

反向代理

反向代理( Reverse Proxy) 方式是指用代理服务器来接受网络的连接请求, 然后将请求转发给内部网络上的服务器, 并将从服务器上得到的结果返回给网络请求连接的客户端, 此时代理服务器对外就表现为一个反向代理服务器。

负载均衡

upstream 负载均衡概要

配置如下:

upstream test.net{
    ip_hash;
    server 192.168.10.13:80;
    server 192.168.10.14:80 down;
    server 192.168.10.15:8009 max_fails=3 fail_timeout=20s;
    server 192.168.10.16:8080;
} 

server {
    location / {
        proxy_pass http://test.net;
    }
}

upstream支持的负载均衡算法

  • 轮询( 默认) : 每个请求按时间顺序逐一分配到不同的后端服务器, 如果后端某台服务器宕机, 故障系统被自动剔除, 使用户访问不受影响。 Weight 指定轮询权值, Weight 值越大, 分配到的访问机率越高, 主要用于后端每个服务器性能不均的情况下。
  • ip_hash: 每个请求按访问 IP 的 hash 结果分配, 这样来自同一个 IP 的访客固定访问一个后端服务器, 有效解决了动态网页存在的 session 共享问题。
  • fair: 这是比上面两个更加智能的负载均衡算法。 此种算法可以依据页面大小和加载时间长短智能地进行负载均衡, 也就是根据后端服务器的响应时间来分配请求, 响应时间短的优先分配。 Nginx 本身是不支持 fair 的, 如果需要使用这种调度算法, 必须下载 Nginx的 upstream_fair 模块。
  • url_hash: 此方法按访问 url 的 hash 结果来分配请求, 使每个 url 定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。 Nginx 本身是不支持 url_hash 的,如果需要使用这种调度算法, 必须安装 Nginx 的 hash 软件包。
  • least_conn: 最少连接负载均衡算法, 简单来说就是每次选择的后端都是当前最少连接的一个 server(这个最少连接不是共享的, 是每个 worker 都有自己的一个数组进行记录后端 server 的连接数)。
  • hash: 这个 hash 模块又支持两种模式 hash, 一种是普通的 hash, 另一种是一致性hash(consistent)

upstream支持的状态参数

  • down: 表示当前的 server 暂时不参与负载均衡。
  • backup: 预留的备份机器。 当其他所有的非 backup 机器出现故障或者忙的时候, 才会请求 backup 机器, 因此这台机器的压力最轻。
  • max_fails: 允许请求失败的次数, 默认为 1 。 当超过最大次数时, 返回proxy_next_upstream 模块定义的错误。
  • fail_timeout: 在经历了 max_fails 次失败后, 暂停服务的时间。 max_fails 可以和
  • fail_timeout 一起使用。

配置nginx负载均衡

upstream webservers {
    server 192.168.18.201 weight=1;
    server 192.168.18.202 weight=1;
} 

server {
    listen 80;
    server_name localhost;
    location / {
        proxy_pass http://webservers;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

注, upstream 是定义在 server{ } 之外的, 不能定义在 server{ } 内部。 定义好 upstream之后, 用 proxy_pass 引用一下即可.

配置nginx进行健康状态检查
利用 max_fails、 fail_timeout 参数, 控制异常情况

upstream webservers {
    server 192.168.18.201 weight=1 max_fails=2 fail_timeout=2;
    server 192.168.18.202 weight=1 max_fails=2 fail_timeout=2;
}

配置backup服务器
当所有服务器都不能提供服务,给用户展示提示错误的页面:

server {
    listen 8080;
    server_name localhost;
    root /data/www/errorpage;
    index index.html;
}

负载均衡配置:

upstream webservers {
    server 192.168.18.201 weight=1 max_fails=2 fail_timeout=2;
    server 192.168.18.202 weight=1 max_fails=2 fail_timeout=2;
    server 127.0.0.1:8080 backup;
}

配置ip_hash负载均衡

upstream webservers {
    ip_hash;
    server 192.168.18.201 weight=1 max_fails=2 fail_timeout=2;
    server 192.168.18.202 weight=1 max_fails=2 fail_timeout=2;
}

你可能感兴趣的:(nginx基础知识)