跳至主要內容

Nginx模块配置

知识库集成配置NginxNginx大约 6 分钟

基础模块

HTTP Access(白名单)

此模块提供了一个简易的基于主机的访问控制.

## 仅允许网段 192.168.1.0/24中除 192.168.1.1之外的ip访问.
location / {
  deny    192.168.1.1;
  allow   192.168.1.0/24;
  deny    all;
}

Auth Basic

该模块可以使你使用用户名和密码基于 HTTP 基本认证方法来保护你的站点或其部分内容。

location / {
  auth_basic            "Restricted";
  auth_basic_user_file  conf/htpasswd;
}

AutoIndex

此模块用于自动生成目录列表.

location / {
  autoindex              on;              # 开启整个目录浏览下载
  autoindex_localtime    on;              # 显示文件的GMT时间
  autoindex_exact_size   off;             # 显示文件的大小
}

DAV

可以为 Http webDAV 增加 PUT, DELETE, MKCOL, COPY 和 MOVE 等方法。

需要在编译时指定参数 ./configure --with-http_dav_module

location / {
  root     /data/www;
  client_body_temp_path  /data/client_temp;

  dav_methods  PUT DELETE MKCOL COPY MOVE;

  create_full_put_path   on;
  dav_access             group:rw  all:r;

  limit_except  GET {
    allow  192.168.1.0/32;
    deny   all;
  }
}

其他模块

Http 跳转到 Https

#80端口做301转跳
server {
  listen 80;
  server_name _;
  return 301 https://www.example.cn$request_uri;    #跳转到Https
}
#配置ssl证书和开启ssl功能
server {
  listen       443;
  server_name  www.example.cn;

  ssl                  on;
  ssl_certificate      /usr/ssl/ca.pem;
  ssl_certificate_key  /usr/ssl/ca.key;

  ssl_session_timeout  5m;

  ssl_protocols  SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
  ssl_prefer_server_ciphers   on;
  error_page 497 "https://$host$uri?$args"; ## 这是跳转Http请求到Https

  root   html;
  index  index.html index.htm;
  location / {
      ...
  }
}

资源缓存设置

https://nginx.org/en/docs/http/ngx_http_proxy_module.htmlopen in new window

## 禁止缓存静态资源
location ~ .*\.(css|js|swf|php|htm|html )$ {
  add_header Cache-Control no-store;
  add_header Pragma no-cache;
}
## 设置缓存机制
location ~* ^.+\.(css|js|ico|gif|jpg|jpeg|png|bmp|swf)$ {
  # 关闭日志记录,默认为on
  log_not_found off;
  access_log off;
  # 缓存时间7天 单位 s、m、h、d
  expires 7d;
  # 源服务器
  proxy_pass http://127.0.0.1:8888;
  # 指定上面设置的缓存区域
  proxy_cache imgcache;
  # 缓存过期管理
  proxy_cache_valid 200 302 1d;
  proxy_cache_valid 404 10m;
  proxy_cache_valid any 1h;
  proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
}

调优案例

#user  nobody;

## 和机器的cpu荷属一致 cat /proc/cpuinfo | grep "cores" | uniq
## 开启4个进程
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
## 开启8个进程
# worker_processes 8;
# worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

# 设置日志,错误日志级别有[debug | info | notice | warn | error | crit | alert | emerg],级别越高记录的信息越少
error_log logs/error.log error;

# 最大打开文件数,通过 ulimit -n 命令查看,可修改/etc/security/limits.conf文件
# *   soft nofile   65535
# *   soft nofile   65535
worker_rlimit_nofile 65535;

#pid        logs/nginx.pid;

events {
 #外部连接数
 worker_connections 1024;
 #收到新的连接通知后接受尽可能多的连接
 multi_accept on;
 # 采用I/O多路复用事件模型,处理效率高
 use epoll;
}
http {
 include mime.types;
 default_type application/octet-stream;

 # 设置日志格式化
 log_format main '{"@timestamp":"$time_local",' #访问的时间和时区
  # 客户端地址
  '"client_ip":"$remote_addr",'
  # 客户端用户名称
  '"client_name":"$remote_addr",'
  # 请求的URI和HTTP协议
  '"request":"$request",'
  # 发送给客户端文件内容大小
  '"size":$body_bytes_sent,'
  # 请求的总时间
  '"response_time":$request_time,'
  # upstream响应时间
  '"upstream_time":"$upstream_response_time",'
  # 后台upstream的地址,提供服务的主机地址
  '"upstream_host":"$upstream_addr",'
  # 请求地址(浏览器输入的IP或域名)
  '"http_host":"$http_host",'
  # 客户端请求的真实IP,如果代理存在,即有值,否则没值
  '"xff":"$http_x_forwarded_for",'
  # url跳转来源
  '"referer":"$http_referer",'
  # 用户终端浏览器等信息
  '"agent":"$http_user_agent",'
  # HTTP请求状态
  '"status":"$status"}';

 # 设置访问日志,参数gzip:压缩级别;buffer:存放日志的缓冲区大小;flush:缓冲区日志刷到磁盘的时间
 access_log logs/access.log main gzip=4 flush=5m;

 # 开启高效文件传输模式
 sendfile on;
 # 减少网络报文,一次性传输
 tcp_nopush on;
 # 提高I/O性能
 tcp_nodelay on;

 # 客户端连接保持会话超时时间
 keepalive_timeout 60;
 # 请求头的超时时间(默认60s)
 client_header_timeout 15;
 # 请求体的超时时间(默认60s)
 client_body_timeout 15;
 # 客户端未在规定时间响应关闭连接
 send_timeout 15s;
 # DNS解析超时(默认30s)
 resolver_timeout 15s;
 # 关闭不响应的客户端连接
 reset_timedout_connection on;

 # 客户端请求头部的缓冲区大小,需根据系统,用命令getconf PAGESIZE获取
 client_header_buffer_size 4k;
 # 客户端请求主体的缓冲区大小
 client_body_buffer_size 512k;
 # 客户端请求服务器最大允许大小,可限制上传文件大小
 client_max_body_size 100m;
 # 打开文件指定缓存,max指定缓存数量,建议和打开文件数一致(worker_rlimit_nofile),inactive指定时间内文件未被请求则删除缓存
 open_file_cache max=65535 inactive=60s;
 # 多长时间检查一次缓存的有效信息
 open_file_cache_valid 30;
 # 文件的最少使用次数,open_file_cache指令中的inactive参数时间内,一次也未被使用,它将被移除
 open_file_cache_min_uses 1;

 # 后端服务器连接的超时时间(默认60秒)
 proxy_connect_timeout 15s;
 # 后端服务器数据回传时间(默认60秒)
 proxy_send_timeout 120s;
 # 等候后端服务器响应时间(默认60秒)
 proxy_read_timeout 120s;
 # 缓冲区大小(头部信息);默认值4k|8k
 proxy_buffer_size 8k;
 # 响应的数量和大小;默认是8 4k|8k
 proxy_buffers 4 64k;
 # 决定缓冲区发送数据大小,通常是proxy_buffers的两倍
 proxy_busy_buffers_size 128k;
 # 把数据一次性写入临时文件的大小
 proxy_temp_file_write_size 128k;
 # 临时文件路径
 proxy_temp_path /tmp/proxy_temp;
 # levels:目录层次,比如1:2会生成16*256个子目录
 # keys_zone:缓存名字和共享内存大小
 # inactive:在指定时间内文件未被请求则删除缓存
 # max_size:最大缓存空间
 proxy_cache_path /usr/local/nginx/nginx_cache levels=1:2 keys_zone=nginx_cache:200m max_size=50g inactive=168h;
 # 出现超时、500、502等错误时,分配给下一台服务器处理
  proxy_next_upstream http_500 http_502 http_503 http_504 http_404 error timeout invalid_header;

 # 隐藏版本号
 server_tokens off;
 # 域名哈希表的桶大小(默认512)
 server_names_hash_bucket_size 128;
 # 域名哈希表最大大小(默认1024)
 server_names_hash_max_size 512;

 # 开启GZIP压缩功能
 gzip on;
 # 无条件启用压缩 off 关闭对后端服务器的响应结果进行压缩
 gzip_proxied any;
 # 判断是否需要压缩
 gzip_vary on;
 # 允许压缩的最小字节数
 gzip_min_length 1k;
 # 使用4个为16k的内存作为压缩结果缓存流
 gzip_buffers 4 16k;
 # 压缩版本,用于设置识别HTTP协议版
 gzip_http_version 1.1;
 # 压缩比例,1压缩比最小,速度最快,9压缩比最大,速度最慢,消耗CPU资源在1~9中设置,1压缩比最小,速度最快,9压缩比最大,速度最慢,消耗CPU资源
 gzip_comp_level 4;
 # 压缩类型
 gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss;

 # 禁用IE6以下进行压缩
 gzip_disable "MSIE [1-6].";


 server {
  listen 80;
  server_name localhost;
  #charset koi8-r;
  #access_log  logs/host.access.log  main;

  location / {
   root html;
   index index.html index.htm;

   #禁止非GET|POST请求,就是禁止OPTIONS、PUT等请求
   if ($request_method !~ ^(GET|HEAD|POST)$) {
    return 403;
   }
  }
  # 设置动态加载的文件后缀
  location ~ \.(svg|jpg|jpeg|png|gif|bmp|ico|swf|flv)$ {
   # 缓存路径
   root /var/www/images/;
   # 单位 s、m、h、d
   expires 30d;
   # 关闭日志记录,默认为on
   log_not_found off;
   access_log off;
  }
  # 防盗链
  location ~ .*\.(jpg|gif|png)$ {
   # 防止别人直接引用你网站资源链接。 指定域名或ip
   valid_referers none blocked www.test.com test.com;
   if ($invalid_referer) {
    return 403;
   }
   root /var/www/images;
  }
  #error_page  404              /404.html;
  # redirect server error pages to the static page /50x.html
  error_page 500 502 503 504 /50x.html;
  location = /50x.html {
   root html;
  }
 }
}

gzip_proxied选项

gzip_proxied选项,可以根据系统的实际情况决定,总共存在多种选项:

- off:关闭Nginx对后台服务器的响应结果进行压缩。
- expired:如果响应头中包含Expires信息,则开启压缩。
- no-cache:如果响应头中包含Cache-Control:no-cache信息,则开启压缩。
- no-store:如果响应头中包含Cache-Control:no-store信息,则开启压缩。
- private:如果响应头中包含Cache-Control:private信息,则开启压缩。
- no_last_modified:如果响应头中不包含Last-Modified信息,则开启压缩。
- no_etag:如果响应头中不包含ETag信息,则开启压缩。
- auth:如果响应头中包含Authorization信息,则开启压缩。
- any:无条件对后端的响应结果开启压缩机制。