nginx使用指南

jopen 10年前

1,运行nginx

可以运行nginx命令开启nginx:

 nginx 

如果nginx已经开启了,可以运行nginx命令加-s 参数来控制nginx的运行
nginx -s signal
signal的值:
  • stop — 快速关闭
  • quit — 优雅的关闭
  • reload — 重新加载配置文件
  • reopen — 重新打开日志文件 

例如:要等nginx处理完当前的请求后关闭nginx可以用下面的命令

nginx -s quit

            修改了配置文件后需要运行下面的命令

nginx -s reload

2,简单配置nginx

打开配置文件,一般在/etc/nginx/nginx.cnf中,依照自己安装参数而定。

nginx.conf 中已经包含了一个server块的配置案例,不过是注释掉的。下面是一个server块的基本配置

http {      server {      }  }

server块下面可以配置一些location来指定请求url对应的本地资源

location / {      root /data/www;  }
上面表示所有的/ 下面的访问资源都在/data/www 文件夹下面

 

location /images/ {      root /data;  }
这个表示所有/images/路径访问的图片都在/data下面

 

那么上面的统一配置就是

server {              listen 8080;        location / {        root /data/www;    }            location /images/ {        root /data;    }    }

如果我访问http://localhost/images/example.png的话,nginx就会返回文件目录中/data/images/下面的example.png图片返回给客户端

如果我访问http://localhost/some/example.html的话,nginx就会返回文件目录中/data/www/下面的example.html图片返回给客户端

listen可以不指定,默认是8080

如果在运行期间修改了配置运行

nginx -s reload

如果配置验证通,但没有按照约定访问到指定的文件可以查看/usr/local/nginx/logs 或/var/log/nginx下面的日志文件access.logerror.log

 

3,配置反向代理

server {      location / {          proxy_pass http://localhost:8080;      }        location /images/ {          root /data;      }  }

proxy_pass指定反向代理的路径,所有符合/的路径都会到http://localhost:8080中获取资源

如:http://192.168.1.100/some/example.html 访问的资源 其实是 http://localhost/some/example.html获取的资源,这些对客户端是透明的。

 

4,主机名

服务器名称通过server_name指令指定,它决定哪个server来处理哪个请求.server_name 可以通过通配符,正则指定。

server {      listen       80;      server_name  example.org  www.example.org;      ...  }    server {      listen       80;      server_name  *.example.org;      ...  }    server {      listen       80;      server_name  mail.*;      ...  }    server {      listen       80;      server_name  ~^(?<user>.+)\.example\.net$;      ...  }
当一个请求同时满足多个主机名的时候优先选择的主机名有如下顺序。

1,全名称,准确的名称。

2,最长的通过*开头的通配符名称“*.example.org

3,最长的通过*结尾的通配符名称“mail.*

4,第一个匹配正则表达式的虚拟主机名

通配符只能在主机名的开始和结束使用,“www.*.example.org”和“w*.example.org” 都是错误的写法,如果需要匹配这种模式可以通过正则表达式指定,如“~^www\..+\.example\.org$” and“~^w.*\.example\.org$”。星号代理主机名的一部分“*.example.org”不仅代表www.example.com还代表www.sub.example.com.example.org既可以代表example.org也可以代表*.example.org。

如果要使用正则表达式,主机名必须以波浪符~开始

server_name  ~^www\d+\.example\.net$;
如果不是以波浪符号~还是,那么它被认为是一个全主机名。

如果正则表达式主机名中包含*,那么它被认为是一个通配符主机名。^和$是必需的,他们是语法和逻辑上的要求。

通过正则捕获可以再后面的变量中引用

server {      server_name   ~^(www\.)?(?<domain>.+)$;        location / {          root   /sites/$domain;      }  }
正则表达捕获可以支持如下的语法

?<name> Perl 5.10 compatible syntax, supported since PCRE-7.0
?'name' Perl 5.10 compatible syntax, supported since PCRE-7.0
?P<name> Python compatible syntax, supported since PCRE-4.0
正则捕获也可以通过数字参数获取
server {      server_name   ~^(www\.)?(.+)$;        location / {          root   /sites/$2;      }  }
$2匹配第二个括号中的正则表达式匹配的内容。

混合主机名

server {      listen       80;      server_name  example.org  www.example.org  "";      ...  }
如果nginx没有可以匹配请求的url主机名的server模块,则默认返回空的主机名来响应请求。

如果用户通过ip访问,这server_name可以配置ip主机名来响应请求

server {      listen       80;      server_name  example.org                   www.example.org                   ""                   192.168.1.1                  ;      ...  }
-表示的主机名代表了所有错误的主机名
server {      listen       80  default_server;      server_name  _;      return       444;  }

在有些时候你可能会访问*.example.com 但其中包好 www.example.com和example.com 且这两个访问跟频繁,最好配置成这样

server {      listen       80;      server_name  example.org  www.example.org  *.example.org;      ...  }
而不要是这样
server {      listen       80;      server_name  .example.org;      ...  }

如果主机名过长需要在http模块中修改参数

server_names_hash_bucket_size
这个参数的值可以使32或64,取决于你的cpu缓存栈的大小

如果你将他设为32,但你的服务器名称很长如:too.long.server.name.example.org,那么它会报错

could not build the server_names_hash,  you should increase server_names_hash_bucket_size: 32
你必须要把它的参数设成两倍


http {      server_names_hash_bucket_size  64;      ...

如果配置的主机名过多就会报这个错

could not build the server_names_hash,  you should increase either server_names_hash_max_size: 512  or server_names_hash_bucket_size: 32
解决方法是尽可能地将server_names_hash_max_size设置的和主机名的个数一样,如果这个配置起不了做用,或配置后导致nginx的启动时间过长的话,就增加server_names_hash_bucket_size的值。

来自:http://blog.csdn.net/ilovezhangxian/article/details/38495631