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;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容