Skip to content

nginx配置和使用

nginx的配置和使用

nginx是什么

nginx是http服务,处理和转发http请求。

nginx能做什么

1. 反向代理
2. 负载均衡
3. 处理静态资源
等

nginx配置组成

main、server(主机设置)、upstream(负载均衡服务器设置)和 location(URL匹配特定位置的设置)。

main块 包含events、http、全局配置;
server块 虚拟服务 主要用于指定主机和端口;
location 块用于路由。
upstream 指令主要用于负载均衡,设置一系列的后端服务器;

默认配置

# Nginx运行的用户和用户组
#user  wrd wrd;
# 运行的进程数
worker_processes  1;

# 错误日志,后面是 错误日志定义等级
error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

# 事件模块
events {
    # 单个后台worker process进程的最大并发链接数 (最大连接数=连接数*进程数)
    worker_connections  1024;
}


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 来文件传输
    sendfile        on;
    # 设置0 禁用
    #keepalive_timeout  0;
    # 长连接超时时间
    keepalive_timeout  65;
    # 开启gzip压缩
    #gzip  on;


    server {
        listen       8000;
        server_name  somename  alias  another.alias;

        location / {
            root   html;
            # 定义首页索引文件的名称
            index  index.html index.htm;
        }
    }

    include servers/*;
}

location

    location  = / {
        # 精准匹配
        echo "location A";
    }

    location  / {
        echo "location B";
    }

    location /book/ {
        # 普通前缀匹配
        echo "location C";
    }

    location /images/abc {
        # 普通前缀匹配
        echo "location H";
    }

    location /images {
        # 普通前缀匹配
        echo "location G";
    }

    location ^~ /images/ {
        # 前缀匹配
        echo "location E";
    }

    location ~ /book/abc {
        # 正则匹配
        echo "location D";
    }


    location ~* \.(gif|jpg|jpeg)$ {
        # 正则匹配
        echo "location F";
    }

    location ~ /images/abc/ {
        # 正则匹配
        echo "location I";
    }

    location ~ /images {
        # 正则匹配
        echo "location J";
    }

    =   开头表示精确匹配
    如 A 中只匹配根目录结尾的请求,后面不能带任何字符串。
    ^~  开头表示uri以某个常规字符串开头,不是正则匹配
    ~   开头表示区分大小写的正则匹配;
    ~*  开头表示不区分大小写的正则匹配
    /   通用匹配, 如果没有其它匹配,任何请求都会匹配到

    匹配逻辑:
    if 精确匹配结果
        return  精确匹配结果
    最长前缀结果 = longest: 普通前缀匹配(空格) or 前缀匹配(^~)
    if 最长前缀结果 属于 前缀匹配(^~)
        return 最长前缀结果
    首个正则结果 = first: 大小写敏感匹配(~) or 大小写不敏感匹配(~*) or 大小写敏感不匹配(!~) or 大小写不敏感不匹配(!~*)
    if 首个正则结果:
        return 首个正则结果
    else:
        return 最长前缀结果

upstream 负载均衡

# 默认轮询
http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;
        }
    }
}

 # 权重
http {
    upstream myapp1 {
        server srv1.example.com weight=4 down; # 下线
        # 超过3次失败,30后尝试再请求这台机器
        server srv2.example.com weight=2 max_fails=3 fail_timeout=30s;
        server srv3.example.com weight=1;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;
        }
    }
}

# ip_hash ip固定分发到一台机器
# least_conn 最少连接负载均衡