Nginx配置

配置规则尽可能清晰准确

Nginx解析顺序

  • Nginx首先会搜索确切名字的散列表,
  • 如果没有找到,则搜索以星号起始的通配符名字的散列表,
  • 如果还是没有找到,继续搜索以星号结束的通配符名字的散列表。
  • 因为名字是按照域名的字节来搜索的,所以搜索通配符名字的散列表比搜索确切名字的散列表慢

demo

/etc/nginx/nginx.conf

参考

# 设置nginx服务的系统使用用户
user  nginx; 
# 工作进程数,默认=CPU核数,高并发时可设置2倍
worker_processes  4; 
# 0001 0010 0100 1000是掩码,分别代表第1、2、3、4核CPU
worker_cpu_affinity 0001 0010 0100 1000;

error_log  /var/log/nginx/error.log warn;  // nginx的错误日志
pid        /var/run/nginx.pid;      // nginx服务启动时候pid

error_page   500 502 503 504  /50x.html

events

events {        
    # 【事件处理模型】linux下默认 epoll, 手动配置的话需要在events模块下
    # Nginx官方文档建议,可以不指定,Nginx会自动选择最佳的事件处理模型服务

    # 最大客户端连接数由 = worker_processes * worker_connections
    # 进程的最大连接数 受Linux系统进程的最大打开文件数限制
    # 执行操作系统命令"ulimit -HSn 65535"或配置,worker_connections的设置才能生效
    worker_rlimit_nofile 65535;
    
    # 每个worker进程允许的最大连接数,默认1024
    worker_connections  1024;    
}

http

http {                                                  
    include       /etc/nginx/mime.types;  //设置contentType
    default_type  application/octet-stream;

    # 隐藏Nginx版本号,错误页面泄露
    nserver_tokens off;

    # 默认值可能是32或64,也可能是其他值,这取决于CPU的缓存行的长度
    # 如果这个值是32,那么定义"too.long.server.name.nginx.org"作为虚拟主机名就会失败,
    # 此时会显示下面的错误信息: could not build the server_names_hash
    server_names_hash_bucket_size 64;

    # 值差不多等于名字列表的名字总量,默认是512kb,
    # 一般要查看系统给出确切的值。这里一般是cpu L1 的4-5倍
    server_names_hash_max_size 512;

    # 
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    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  /var/log/nginx/access.log  main;

    # 连接超时是服务的一种自我管理、自我保护的重要机制。
    # (1)PHP程序建立连接消耗的资源和时间相对要少些,通常使用短连接
    # (2)Java程序建立连接消耗的资源和时间更多,一般建议设置长连接
    # 超过这个时间,服务器会关闭该连接
    # 连接(服务端)超时时间,默认为75s,可以在http,server,location块。
    keepalive_timeout 65;  

    # 【快速发送】开启高效文件传输模式,可防止网络及磁盘I/O阻塞,提升Nginx工作效率
    sendfile        on;  
    tcp_nopush      on;
    # 默认情况下当数据发送时,内核并等待更多的字节组成一个数据包才发送,这样可以提高I/O性能。
    # 但是,在每次只发送很少字节的业务场景中,使用tcp_nodelay功能,等待时间会比较长。
    # 激活或禁用TCP_NODELAY选项,当一个连接进入keep-alive状态时生效
    tcp_nodelay     on;

    # 设置读取客户端请求头数据的超时时间,15 是经验参考值,单位:秒
    # 如果超时,客户端还没有发送完整的header数据,服务器端将返回"Request time out(408)"错误
    client_header_timeout 15;

    # 设置读取客户端请求主体的超时时间,默认值是60
    # 这个超时仅仅为两次成功的读取操作之间的一个超时,非请求整个主体数据的超时时间
    # 如果超时,客户端没有发送任何数据,Nginx将返回"Request time out(408)"错误
    client_body_timeout 60;

    # 指定响应客户端的超时时间
    # 这个超时仅限于两个连接活动之间的时间
    # 如果超时,客户端没有任何活动,Nginx将会关闭连接
    # 默认值为60秒,可以改为参考值25秒
    send_timeout 25;

    # 调整上传文件的大小限制(http Request body size 最大的允许的客户端请求主体大小)
    # 设置为0表示禁止检查客户端请求主体大小。此参数对提高服务器端的安全性有一定的作用
    # 在请求头域有"Content-Length",如果超过了此配置值,客户端会收到413错误
    client_max_body_size 8m;

    【gzip】
    # 配置Nginx gzip压缩实现性能优化, 减少响应包的大小,压缩时会稍微消耗一些CPU资源,这个一般可以忽略
    #  Nginx的gzip压缩功能依赖于ngx_http_gzip_module模块,默认已安装
    gzip  on;
    # 被压缩的纯文本文件必须要大于1KB,由于压缩算法的原因,极小的文件压缩后可能反而变大。
    gzip_min_length  1k; 
    # 压缩缓冲区大小。表示申请4个单位为16K的内存作为压缩结果流缓存
    # 默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
    gzip_buffers     4 16k; 
    # 压缩比率。用来指定gzip压缩比,1压缩比最小,速度最快;9压缩比最大,传输速度快,但处理最慢,也比较耗CPU资源。
    gzip_comp_level 2; 
    # 【指定压缩的类型】纯文本内容压缩比很高,最好进行压缩,例如:html、js、css、xml、shtml等格式的文件
    # "text/html"类型总是会被压缩,这个就是HTTP原理部分讲的媒体类型
    # 图片、视频(流媒体)等文件尽量不要压缩,因为这些文件大多都是经过压缩的。
    gzip_types  text/plain application/x-javascript text/css application/xml; 
    # vary header支持。该选项可以让前端的缓存服务器缓存经过gzip压缩的页面
    gzip_vary on;

    # 【ngx_http_limit_conn_module】这个模块用于限制每个定义的key值的连接数,特别是单IP的连接数
    # 不是所有的连接数都会被计数。一个符合计数要求的连接是整个请求头已经被读取的连接
    # 限制单IP的并发连接为1   测试 模拟并发连接1,访问10次服务器:ab-c 1 -n 10 http://10.0.0.3/
    limit_conn addr 1;
    # 设置虚拟主机连接数为2   统计日志中200(成功)与503(过载)出现的次数:grep -c 200 access.log   
    limit_conn perserver 2;

    include /etc/nginx/conf.d/*.conf;      // 读到这个地方是加载另一个默认配置配置文件default.conf
}

Nginx rewrite 重写规则

last和break用来实现URL重写,浏览器地址栏的URL地址不变,但在服务器端访问的程序及路径发生了变化

last

  • 在根location(即location/{……})中或server{……}标签中编写rewrite规则,建议使用last标记
  • 使用alias指令时必须用last标记
  • last标记在本条rewrite规则执行完毕后,会对其所在的server{……}标签重新发起请求

break

  • 在普通的location(例location/oldboy/{……}或if{})中编写rewrite规则,则建议使用break标记
  • 使用proxy_pass指令时要使用break标记
  • break标则会在本条规则匹配完成后,终止匹配,不再匹配后面的规则

Nginx访问认证

  • auth_basic "请输入授权账号";用于设置认证提示字符串(web弹窗)"请输入授权账号"。
  • auth_basic_user_file/application/nginx/conf/htpasswd;用于设置认证的密码文件

禁用IP访问或恶意解析

返回501错误

server {
    listen 80 default_server;
    server_name _;
    return 501;
}

或 通过301跳转到指定页面

server {
    listen 80 default_server;
    server_name _;
    rewrite ^(.*) http://blog.etiantian.org/$1 permanent;
}

或 host主机名字段非指定域名,则301跳转到跳转到指定页面

if ($host !~ ^www/.eduoldboy/.com$) {
    rewrite ^(.*)  http://www.eduoldboy.com$1 permanent;
}