Nginx基本知识

2 篇文章 0 订阅
1 篇文章 0 订阅

Nginx.conf配置

基本配置说明
#定义Nginx运行的用户和用户组
user www-data www-data;

#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 2;

#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;

#进程文件
pid /var/run/nginx.pid;

#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
worker_rlimit_nofile 65535;

#工作模式与连接数上限
events
{
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 65535;
}
http块配置
http{
    include mime.types #文件扩展名与文件类型映射表
    default_type application/octet-stream; #默认文件类型
    charset utf-8 #默认文件类型
    server_names_hash_bucket_size 128; #服务器名字的hash表大小
    client_header_buffer_size 32k; #上传文件大小限制
    large_client_header_buffers 4 64k; #设定请求缓冲区大小
    client_max_body_size 8m; #设定请求缓冲区大小
    sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
    autoindex on; #目录列表是否开启访问,默认关闭
    tcp_nopush on; #防止网络阻塞
    tcp_nodelay on; #防止网络阻塞
    keepalive_timeout 120; #长链接超时时间,单位s
    
    #Fastcgi 相关参数为了改善网站性能:减少资源占用,提高访问速度
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    
    #gzip模块设置
    gzip on;        #开启gzip压缩输出
    gzip_min_length 1k; #最小压缩文件大小
    gzip_buffers 4 16k; #压缩缓冲区
    gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)开始压缩的http协议版本(可以不设置,目前几乎全是1.1协议)
    gzip_comp_level 2;   #推荐6压缩级别(级别越高,压的越小,越浪费CPU计算资源)
    gzip_types text/plain application/x-javascript text/css application/xml;
    #压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
    gzip_vary on;   # 是否传输gzip压缩标志
    #limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用
    
    #负载均衡设置
    upstream test.com{
        #weight表示权重,权值越高被分配到的几率越大
        server 192.168.1.1:80 weight=3;
        server 192.168.1.2:80 weight=3;
        server 192.168.1.3:80 weight=2;
    }
    
    #虚拟主机设置
    server{
        #监听端口
        listen 80;
        #域名可以有多个,用空格隔开
        server_name www.test.com blog.test.com;
        index index.html index.php;
        root /var/www;
        location /{
            ...
        }
        
        #日志格式设定
        log_format access '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" $http_x_forwarded_for';
        
        #定义本虚拟主机的访问日志
        access_log /var/log/nginx/test.log access;
        
        #设定查看Nginx状态的地址
        location /NginxStatus {
            stub_status on;
            access_log on;
            auth_basic "NginxStatus";
            auth_basic_user_file conf/htpasswd;
            #htpasswd文件的内容可以用apache提供的htpasswd工具来产生
        }
    
    }
}
location详解
类型
  • 普通location
    1. 无任何前缀
    2. 其他前缀(=、^~、@)
    3. 普通location顺序无关
  • 正则location
    1. (~、 ~*)表示正则前缀
    2. ~区分大小写
    3. ~*不区分大小写
    4. 正则location与顺序有关

先匹配普通,再匹配正则;正则会覆盖普通
执行顺序:

普通location

最大前缀匹配;
前面若指定了^~,则普通location一旦匹配上,就不需要继续正则匹配
制订了=严格匹配也不要继续正则匹配

正则location

顺序匹配,且只要匹配到第一个就停止后面的匹配

实例
location =/{
    #严格匹配,主机名后面不能带任何字符串
    #[ configuration A ] 
}

location /{
    #匹配所有请求
    #但是由于最大前缀原则,最长字符串和正则会优先匹配
    ##[ configuration B ] 
}

location /documents/ {
    #匹配任何以/documents/开头的地址,匹配后会继续往下搜索
    #后面正则没有匹配才采用这一条
    #[ configuration C ] 
}

location ~ /documents/Abc {
  # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
  # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
  #[ configuration CC ] 
}

location ^~ /images/ {
  # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
  ##[ configuration D ] 
}

location ~* \.(gif|jpg|jpeg)$ {
  # 匹配所有以 gif,jpg或jpeg 结尾的请求
  # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
  [ configuration E ] 
}

location /images/ {
  # 字符匹配到 /images/,继续往下,会发现 ^~ 存在
  [ configuration F ] 
}

location /images/abc {
  # 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
  # F与G的放置顺序是没有关系的
  [ configuration G ] 
}

location ~ /images/abc/ {
  # 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
    [ configuration H ] 
}

执行顺序
  • 以=开头表示精确匹配
  • ^~开头表示以常规字符串开头,不是正则匹配
  • ~区分大小写正则匹配
  • ~*不区分大小写正则匹配
  • /通用匹配,没有其他匹配,任何请求都会匹配到
rewrite功能
#语法 
rewrite [regex] [replacement] [flag]
rewrite 规则
  • rewrite只能出现在server{}、location{}、if{}中,只对域名后除去传递的参数有作用;
  • 执行顺序:
    如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件;循环超过10次,则返回500 Internal Server Error错误。
    1. server块的rewrite指令;
    2. 执行location匹配;
    3. 执行location中的rewrite指令;
flag标志位
  • last:相当于Apache的[L]标记,表示完成rewrite
  • break:停止执行当前虚拟主机的后续rewrite指令集
  • redirect:返回302临时重定向,地址栏会显示跳转后的地址
  • permanent:返回301永久重定向,地址栏会显示跳转后的地址

tips:

  1. last一般写在server和if中,而break一般使用在location中
  2. last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配
  3. break和last都能组织继续执行后面的rewrite指令
if指定与全局变量
#语法
#1.当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false
#2.直接比较变量和内容时,使用=或!=
#3.~正则表达式匹配,~*不区分大小写的匹配,!~区分大小写的不匹配
if(condition){
    
}

-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行
可用于if判断的全局变量:

  • KaTeX parse error: Expected 'EOF', got '#' at position 8: args : #̲这个变量等于请求行中的参数,同query_string
  • $content_length : 请求头中的Content-length字段。
  • $content_type : 请求头中的Content-Type字段。
  • $document_root : 当前请求在root指令中指定的值。
  • $host : 请求主机头字段,否则为服务器名称。
  • $http_user_agent : 客户端agent信息
  • $http_cookie : 客户端cookie信息
  • $limit_rate : 这个变量可以限制连接速率。
  • $request_method : 客户端请求的动作,通常为GET或POST。
  • $remote_addr : 客户端的IP地址。
  • $remote_port : 客户端的端口。
  • $remote_user : 已经经过Auth Basic Module验证的用户名。
  • $request_filename:当前请求的文件路径,由root或alias指令与URI请求生成。
  • $scheme : HTTP方法(如http,https)。
  • $server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
  • $server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。
  • $server_name : 服务器名称。
  • $server_port : 请求到达服务器的端口号。
  • $request_uri :包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
  • u r i : 不 带 请 求 参 数 的 当 前 U R I , uri : 不带请求参数的当前URI, uriURIuri不包含主机名,如”/foo/bar.html”。
  • d o c u m e n t u r i : 与 document_uri : 与 documenturiuri相同。

常用正则

rewrite实例
http {
    # 定义image日志格式
    log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status;
    # 开启重写日志
    rewrite_log on;

    server {
        root /var/www;

        location / {
                # 重写规则信息
                error_log logs/rewrite.log notice;
                # 注意这里要用‘’单引号引起来,避免{}
                rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4;
                # 注意不能在上面这条规则后面加上“last”参数,否则下面的set指令不会执行
                set $image_file $3;
                set $image_type $4;
        }

        location /data {
                # 指定针对图片的日志格式,来分析图片类型和大小
                access_log logs/images.log mian;
                root /data/images;
                # 应用前面定义的变量。判断首先文件在不在,不在再判断目录在不在,如果还不在就跳转到最后一个url里
                try_files /$arg_file /image404.html;
        }
        location = /image404.html {
                # 图片不存在返回特定的信息
                return 404 "image not found\n";
        }
}

对形如/images/ef/uh7b3/test.png的请求,重写到/data?file=test.png,于是匹配到location /data,先看/data/images/test.png文件存不存在,如果存在则正常响应,如果不存在则重写try_files到新的image404 location,直接返回404状态码。

参考文献
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值