设为首页 收藏本站
查看: 812|回复: 0

[经验分享] Nginx的几种常用配置

[复制链接]

尚未签到

发表于 2018-11-14 06:09:34 | 显示全部楼层 |阅读模式
  1. 设置默认虚拟主机
  (本文永久地址:http://woymk.blog.51cto.com/10000269/1920204)
  对没有匹配的Host值时,返回错误403到客户端
  server {
  listen       80 default_server;
  server_name  _;
  return       403;
  }
  2. 用户认证
  用户认证需要用到apache的htpasswd命令生成密码,如果没有安装apache,可以使用yum install httpd安装。
  生成密码文件,创建用户
  htpasswd -c /usr/local/nginx/conf/htpasswd  test
  添加test用户,第一次添加时需要加-c参数,第二次添加时不需要-c参数
  在nginx的配置文件中添加
  location  / {
  auth_basic              "Auth";
  auth_basic_user_file   /usr/local/nginx/conf/.htpasswd;
  }
  3. 域名重定向(Rewrite)
  例子1:
  server_name  www.a.com  www.test.com;
  if ($host != 'www.test.com' ) {
  rewrite  ^/(.*)$  http://www.test.com/$1  permanent;
  }
  例子2:
  访问 www.abc.com  请求到 www.abc.com/abc/
  if ($document_uri !~ 'abc')
  {
  rewrite ^/(.*)$ http://www.abc.com/abc/$1 permanent;
  }
  注:$document_uri表示访问的url
  Nginx的Rewrite规则与Apache几乎完全一致,
  所不同的是最后的flag标记
  flag标记有:
  last 相当于Apache里的[L]标记,表示完成rewrite,不再匹配后面的规则
  break 与last类似,本条规则匹配完成后,终止匹配,不再匹配后面的规则
  redirect 返回302临时重定向 ,浏览器会显示跳转后的URL地址
  permanent 返回301永久重定向,浏览器会显示跳转后的URL地址
  last/break用来实现URL重写,浏览器地址栏的URL不变,但在服务器端访问的路径发生了变化。
  redirect/permanent实现URL跳转,浏览器地址栏URL会显示跳转后的URL。
  使用 alias 指令时必须用 last 标记 ,使用 proxy_pass 指令时要用 break 表示。last 标记在本条 rewrite 规则执行完毕后,会对其所在 server{....}标签重新发起请求,而 break 标记则在本条
  规则匹配完成后,终止匹配。
  Apache和Nginx规则的对应关系
  Apache的RewriteCond对应Nginx的if
  Apache的RewriteRule对应Nginx的rewrite
  Apache的[R]对应Nginx的redirect
  Apache的[P]对应Nginx的last
  Apache的[R,L]对应Nginx的redirect
  Apache的[P,L]对应Nginx的last
  Apache的[PT,L]对应Nginx的last
  4. 日志切割
  编写脚本:
  vi /usr/local/sbin/logrotate.sh  //加入
  #! /bin/bash
  d=`date -d "-1 day" +%Y%m%d`
  /bin/mv /usr/local/nginx/logs/test.log /usr/local/nginx/logs/test_$d.log

  /etc/init.d/nginx>  /bin/gzip /usr/local/nginx/logs/logs/test_$d.log #如果要对日志进行压缩就加上这句
  日志格式
  log_format main '$remote_addr - $remote_user [$time_local] $request '
  '"$status" $body_bytes_sent "$http_referer" '
  '"$http_user_agent" "$http_x_forwarded_for"';
  此日志格式为,ip不仅记录代理的ip还记录远程客户端真实IP。
  log_format main1 '$proxy_add_x_forwarded_for - $remote_user [$time_local] '
  '"$request" $status $body_bytes_sent '
  '"$http_referer" "$http_user_agent"';
  内部变量说明
  $remote_addr与$http_x_forwarded_for用以记录客户端IP地址,一个记录代理IP,一个记录真实IP;
  $remote_user 用以记录客户端用户名称;
  $time_local 用来记录访问时间与时区;
  $request 用来记录请求的url与http协议;
  $status 用来记录请求状态,成功是200;
  $body_byte_sent 记录发送给客户端文件主体内容大小;
  $http_referer 用来记录从哪个页面链接访问过来的;
  $http_user_agent 记录客户端浏览器的相关信息;
  错误日志error_log日志级别
  error_log 级别分为 debug, info, notice, warn, error, crit  默认为crit, 该级别在日志名后边定义格式如下:
  error_log  /your/path/error.log crit;
  crit 记录的日志最少,而debug记录的日志最多。如果你的nginx遇到一些问题,比如502比较频繁出现,但是看默认的error_log并没有看到有意义的信息,那么就可以调一下错误日志的级别,当你调成error级别时,错误日志记录的内容会更加丰富。
  5. 静态文件不记录日志,并且配置缓存
  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
  {
  expires      30d;
  access_log off;
  }
  location ~ .*\.(js|css)$
  {
  expires      12h;
  access_log off;
  }
  6. 防盗链
  location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$ {
  valid_referers none blocked server_names  www.a.com *.b.com;
  if ($invalid_referer) {
  return 403;
  #rewrite ^/ http://www.example.com/nophoto.gif;
  }
  }
  详细了解请参考《利用nginx“ngx_http_referer_module”模块设置防盗链》
  7. 访问控制
  黑名单
  deny 192.168.1.1;
  deny 192.168.1.2;
  deny 192.168.2.0/24;
  allow all;
  白名单
  allow 192.168.1.0/24;
  allow 127.0.0.1;
  allow 192.168.2.1;
  deny all;
  8. 反向代理
  server {
  listen 80;
  server_name www.test.com;
  location / {
  proxy_pass      http://1.1.1.1/;
  proxy_set_header Host   $host;
  proxy_set_header X-Real-IP      $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
  }
  9. 负载均衡
  upstream test {
  ip_hash;
  server 192.168.1.1;
  server 192.168.1.2;
  }
  server {
  listen 80;
  server_name www.test.com;
  location / {
  proxy_pass      http://test/;
  proxy_set_header Host   $host;
  proxy_set_header X-Real-IP      $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
  }
  注:加上ip_hash作用是使每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
  10. if指令
  该指令用于检查一个条件是否符合,如果条件符合,则执行大括号内的语句。If指令不支持嵌套,不支持多个条件&&和||处理。
  1) 正则表达式匹配,其中:
  == 等值比较
  ~  为区分大小写匹配
  ~* 为不区分大小写匹配
  !~和!~*分别为区分大小写不匹配及不区分大小写不匹配
  举例:if ($http_user_agent ~ MSIE) {rewrite  ^(.*)$  /msie/$1  break;}
  2) 文件及目录匹配,其中:
  -f和!-f用来判断是否存在文件
  -d和!-d用来判断是否存在目录
  -e和!-e用来判断是否存在文件或目录
  -x和!-x用来判断文件是否可执行
  举例:if (!-f $request_filename) {proxy_pass  http://127.0.0.1;}
  11. location命令
  location表达式类型
  ~ 表示执行一个正则匹配,区分大小写
  ~* 表示执行一个正则匹配,不区分大小写
  ^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location。
  = 进行普通字符精确匹配。也就是完全匹配。
  @ "@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files
  location优先级
  在nginx的location和配置中location的顺序没有太大关系。正location表达式的类型有关。相同类型的表达式,字符
  串长的会优先匹配。
  以下是按优先级排列说明:
  第一优先级:等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。
  第二优先级:^~类型表达式。一旦匹配成功,则不再查找其他匹配项。
  第三优先级:正则表达式类型(~ ~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。
  第四优先级:常规字符串匹配类型。按前缀匹配。
  12. nginx全局变量
  arg_PARAMETER    #这个变量包含GET请求中,如果有变量PARAMETER时的值。
  args                    #这个变量等于请求行中(GET请求)的参数,如:foo=123&bar=blahblah;
  binary_remote_addr #二进制的客户地址。
  body_bytes_sent    #响应时送出的body字节数数量。即使连接中断,这个数据也是精确的。
  content_length    #请求头中的Content-length字段。
  content_type      #请求头中的Content-Type字段。
  cookie_COOKIE    #cookie COOKIE变量的值
  document_root    #当前请求在root指令中指定的值。
  document_uri      #与uri相同。
  host                #请求主机头字段,否则为服务器名称。
  hostname          #Set to themachine’s hostname as returned by gethostname
  http_HEADER
  is_args              #如果有args参数,这个变量等于”?”,否则等于”",空值。
  http_user_agent    #客户端agent信息
  http_cookie          #客户端cookie信息
  limit_rate            #这个变量可以限制连接速率。
  query_string          #与args相同。
  request_body_file  #客户端请求主体信息的临时文件名。
  request_method    #客户端请求的动作,通常为GET或POST。
  remote_addr          #客户端的IP地址。
  remote_port          #客户端的端口。
  remote_user          #已经经过Auth Basic Module验证的用户名。
  request_completion #如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时,为空(Empty)。
  request_method    #GET或POST
  request_filename  #当前请求的文件路径,由root或alias指令与URI请求生成。
  request_uri          #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。不能修改。
  scheme                #HTTP方法(如http,https)。
  server_protocol      #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
  server_addr          #服务器地址,在完成一次系统调用后可以确定这个值。
  server_name        #服务器名称。
  server_port          #请求到达服务器的端口号。
  附上一个nginx.conf样板:
user nobody nobody;  
worker_processes 2;
  
error_log /usr/local/nginx/logs/nginx_error.log crit;
  
pid /usr/local/nginx/logs/nginx.pid;
  
worker_rlimit_nofile 51200;
  
events
  
{
  
     use epoll;
  
     worker_connections 6000;
  
}
  
http
  
{
  
     include mime.types;
  
     default_type application/octet-stream;
  
     server_names_hash_bucket_size 3526;
  
     server_names_hash_max_size 4096;
  
     log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'
  
     '$host "$request_uri" $status'
  
     '"$http_referer" "$http_user_agent"';
  
     sendfile on;
  
     tcp_nopush on;
  
     keepalive_timeout 30;
  
     client_header_timeout 3m;
  
     client_body_timeout 3m;
  
     send_timeout 3m;
  
     connection_pool_size 256;
  
     client_header_buffer_size 1k;
  
     large_client_header_buffers 8 4k;
  
     request_pool_size 4k;
  
     output_buffers 4 32k;
  
     postpone_output 1460;
  
     client_max_body_size 10m;
  
     client_body_buffer_size 256k;
  
     client_body_temp_path /usr/local/nginx/client_body_temp;
  
     proxy_temp_path /usr/local/nginx/proxy_temp;
  
     fastcgi_temp_path /usr/local/nginx/fastcgi_temp;
  
     fastcgi_intercept_errors on;
  
     tcp_nodelay on;
  
     gzip on;
  
     gzip_min_length 1k;
  
     gzip_buffers 4 8k;
  
     gzip_comp_level 5;
  
     gzip_http_version 1.1;
  
     gzip_types text/plain application/x-javascript text/css text/htm application/xml;
  
server
  
{
  
     listen 80;
  
     server_name localhost;
  
     index index.html index.htm index.php;
  
     root /usr/local/nginx/html;
  
     location ~ \.php$ {
  
         include fastcgi_params;
  
         fastcgi_pass unix:/tmp/php-fcgi.sock;
  
         fastcgi_index index.php;
  
         fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
  
     }
  
}
  
}



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-634676-1-1.html 上篇帖子: nginx开启core dump文件 下篇帖子: nginx1.6.2编译安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表