Nginx 配置常见误区

Nginx 常见配置误区

    1.在location中使用root指令

好的习惯应该是在server 块中配置root指令

server {
  server_name www.domain.com;
  root /var/www/nginx-default/;
  location / {
    [...]
  }
  location /foo {
    [...]
  }
  location /bar {
    [...]
  }}

    2.多个索引指令

好的习惯是在http块中使用一次index,为什么要使用多次呢

http {
  index index.php index.htm index.html;
  server {
    server_name www.domain.com;
    location / {
      [...]
    }
  }
  server {
    server_name domain.com;
    location / {
      [...]
    }
    location /foo {
      [...]
    }
  }}

    3.使用if指令

错误的配置:

server {
  server_name domain.com *.domain.com;
  if ($host ~* ^www\.(.+)) {
    set $raw_domain $1;
    rewrite ^/(.*)$ $raw_domain/$1 permanent;
    [...]
  }
}

此时的if指令强制检测所有域的每个请求,效率很低,可以使用两个server指令代替

正确的配置:

server {
  server_name www.domain.com;
  return 301 $scheme://domain.com$request_uri;}
server {
  server_name domain.com;
  [...]
}

  4.检查文件存在

使用if检测文件存在是很糟糕的,你应该使用try_files

错误的配置:

server {
  root /var/www/domain.com;
  location / {
    if (!-f $request_filename) {
      break;
    }
  }}

正确的配置:

server {
  root /var/www/domain.com;
  location / {
    try_files $uri $uri/ /index.html;
  }}

    5.传递不受控制的请求到php

错误的配置:

location ~* \.php$ {
  fastcgi_pass backend;
  ...}

这样的话,每个以php结尾的请求都会传递到php,默认的php配置将会猜测你请求的文件是否存在。

例如,一个请求类似/forum/avatar/1232.jpg/file.php,这个文件不存在,但是/forum/avatar/1232.jpg这个文件存在,那样php就会处理替换处理这个文件,如果这个文件中嵌入了php代码,php将会执行相应的代码。

可以通过以下的方法避免:

*.在php.ini中设置cgi.fix_pathinfo=0,这将使得php只处理请求的文件,如果文件不存在,则停止继续处理。

*.确保nginx只处理模式匹配的php文件

location ~* (file_a|file_b|file_c)\.php$ {
  fastcgi_pass backend;
  ...}

*.在指定用户上传的目录中禁止执行php文件

location /uploaddir {
  location ~ \.php$ {return 403;}
  ...}

*.使用try_files过滤不存在的页面

location ~* \.php$ {
  try_files $uri =404;
  fastcgi_pass backend;
  ...}

*.使用嵌套的location过滤有问题的页面

location ~* \.php$ {
  location ~ \..*/.*\.php$ {return 404;}
  fastcgi_pass backend;
  ...}

    6.script filename中的fastcgi path

不要使用绝对root路径,使用变量

错误的配置:

fastcgi_param  SCRIPT_FILENAME    /var/www/yoursite.com/$fastcgi_script_name;

正确的配置:

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

这里的$document_root 就是在server块中的root指令的值

    7.重写相关

错误的配置:

    rewrite ^/(.*)$ http://domain.com/$1 permanent;
    rewrite ^ http://domain.com$request_uri? permanent;

正确的配置:不需要检测正则表达式,效率更高

return 301 http://domain.com$request_uri;

    8.重写丢失http://

错误的配置:

    rewrite ^/blog(/.*)$ blog.domain.com$1 permanent;

正确的配置:

 rewrite ^/blog(/.*)$ http://blog.domain.com$1 permanent;

 9.代理相关

错误的配置:所有页面彤彤传递给php

server {
    server_name example.org;
    root /var/www/site;     location / {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass unix:/tmp/phpcgi.socket;
    }}

正确的配置:优先处理静态页面,然手交给php处理

server {
    server_name example.org;
    root /var/www/site;     location / {
        try_files $uri $uri/ @proxy;
    }     location @proxy {
        include fastcgi.conf;
        fastcgi_pass unix:/tmp/php-fpm.sock;
    }}

server {
    server_name example.org;
    root /var/www/site;     location / {
        try_files $uri $uri/ /index.php;
    }     location ~ \.php$ {
        include fastcgi.conf;
        fastcgi_pass unix:/tmp/php-fpm.sock;
    }}
时间: 2024-12-12 10:02:19

Nginx 配置常见误区的相关文章

LNMP架构应用实战——Nginx配置虚拟主机

LNMP架构应用实战--Nginx配置虚拟主机        前面介绍了nginx服务的安装与配置文件,今天介绍下它的另一种实用配置--"虚拟主机",每个虚拟主机可以是一个独立的网站,可以具有独立的域名,同一台服务器上的不同的虚拟主机之间是独立的,用户访问不同虚拟主机如同访问不同的服务器一样,因此它不需要为一个单独的WEB站点提供单独一个nginx服务器和一个单独的nginx进程 1.nginx虚拟主机简单介绍 同apache服务一样,它也有三种不同的虚拟主机,基于域名的虚拟主机.基于

Nginx 配置

Nginx 配置 不论是本地开发,还是远程到 Server 开发,还是给提供 demo 给人看效果,我们时常需要对 Nginx 做配置,Nginx 的配置项相当多,如果考虑性能配置起来会比较麻烦.不过,我们往往只是需要一个静态 Server,或者一个反向代理 Server,这对 Nginx 来说小菜一碟. 本文将给大家介绍 Nginx 配置的基本知识,不想细看的同学可以直接跳到最后一个例子. 简介 Nginx 的安装就不解释了,方便起见,建议在各平台可以直接执行对应安装命令: # CentOS

NODE.JS学习的常见误区及四大名著

NODE.JS学习的常见误区及四大名著 前段时间由于不满于社区里很多人对于NODE.JS的种种误解而写了一篇文章名为: NODE.JS之我见:http://www.cnblogs.com/pugang/p/4374681.html 收到了很多兄弟的热情回复和激烈讨论,在此深表感谢,有的朋友觉得我写的比较粗犷,没有给出具体的性能分析和对比,在此我想说的是其实好多东西的性能分析,根本就不用我写到博客上,其一是如果我写了,很多人同样会觉得不客观,不中立,其二是网上很多中立的机构,随便搜索一下,对比太多

nginx 配置https并自签名证书

2016-10-28 转载请注明出处:http://daodaoliang.com/ 作者: daodaoliang 版本: V1.0.1 邮箱: [email protected] 参考链接: 这里 和 这里 和 官方文档 1. 制作服务器证书 服务器CA私钥: openssl genrsa -des3 -out ca.key 2048 制作解密后的CA私钥(一般无此必要): openssl rsa -in ca.key -out ca_decrypted.key ca.crt CA根证书(公

nginx配置之深入理解

继上一篇<debian+nginx配置初探--php环境.反向代理和负载均衡>成功之后,有点小兴奋,终于不用整lvs那么复杂来搞定负载,但还是有很多概念没弄清楚. 什么是CGI.FastCGI.PHP-CGI.PHP-FPM.Spawn-FCGI? CGI全称是“通用网关接口”(Common Gateway Interface),其实我理解的是一个协议,它描述了客户端和HTTP服务器之间如何传输数据,因此它有各种语言的实现如perl.tcl等,php的实现就是php-cgi.而由于CGI的缺点

Nginx 配置 SSL 证书 + 搭建 HTTPS 网站教程

一.HTTPS 是什么? 根据维基百科的解释: 超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protocol Secure)是超文本传输协议和SSL/TLS的组合,用以提供加密通讯及对网络服务器身份的鉴定.HTTPS连接经常被用于万维网上的交易支付和企业信息系统中敏感信息的传输.HTTPS不应与在RFC 2660中定义的安全超文本传输协议(S-HTTP)相混. HTTPS 目前已经是所有注重隐私和安全的网站的首选,随着技术的不断发展,HTTPS 网站已不再是

Nginx 配置简述

不论是本地开发,还是远程到 Server 开发,还是给提供 demo 给人看效果,我们时常需要对 Nginx 做配置,Nginx 的配置项相当多,如果考虑性能配置起来会比较麻烦.不过,我们往往只是需要一个静态 Server,或者一个反向代理 Server,这对 Nginx 来说小菜一碟. 本文将给大家介绍 Nginx 配置的基本知识,不想细看的同学可以直接跳到最后一个例子. 简介 Nginx 的安装就不解释了,方便起见,建议在各平台可以直接执行对应安装命令: # CentOS yum insta

技术干货 | Docker容器中需要避免的十种常见误区

Docker容器的三大优势: 第一:具备恒定特性–操作系统.库版本.配置.文件夹以及应用程序全部涵盖在内.大家可以将质量检查流程中使用的测试镜像原封不动地引入生产环境当中. 第二:具备轻量化特性–容器的体积非常小巧.相较于动辄成百上千MB的操作系统,它只需要配备主进程所必需的内存外加数十MB额外容量. 第三:速度惊人–大家可以享受等同于单一进程的容器启动速度.相较于长达数分钟的传统负载启动时长,现在我们完全能够在几秒钟内启动一套新容器. 不过很多用户仍然在以对待典型虚拟机的方式审视容器,在这种情

[转] Nginx 配置 SSL 证书 + 搭建 HTTPS 网站教程

一.HTTPS 是什么? 根据维基百科的解释: 超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protocol Secure)是超文本传输协议和SSL/TLS的组合,用以提供加密通讯及对网络服务器身份的鉴定.HTTPS连接经常被用于万维网上的交易支付和企业信息系统中敏感信息的传输.HTTPS不应与在RFC 2660中定义的安全超文本传输协议(S-HTTP)相混. HTTPS 目前已经是所有注重隐私和安全的网站的首选,随着技术的不断发展,HTTPS 网站已不再是