Nginx 服务器配置详解

Nginx的代码是由一个核心和一系列的模块组成, 核心主要用于提供Web Server的基本功能,以及Web和Mail反向代理的功能;还用于启用网络协议,创建必要的运行时环境以及确保不同的模块之间平滑地进行交互。不过,大多跟协议相关的功能和某应用特有的功能都是由nginx的模块实现的。这些功能模块大致可以分为事件模块、阶段性处理器、输出过滤器、变量处理器、协议、upstream和负载均衡几个类别,这些共同组成了nginx的http功能。事件模块主要用于提供OS独立的(不同操作系统的事件机制有所不同)事件通知机制如kqueue或epoll等。协议模块则负责实现nginx通过http、tls/ssl、smtp、pop3以及imap与对应的客户端建立会话。

Nginx的核心模块为Main和Events,此外还包括标准HTTP模块、可选HTTP模块和邮件模块,其还可以支持诸多第三方模块。Main用于配置错误日志、进程及权限等相关的参数,Events用于配置IO模型,如epoll、kqueue、select或poll等,它们是必备模块。

更多Nginx相关教程见以下内容

Nginx的主配置文件由几个段组成,这个段通常也被称为nginx的上下文,每个段的定义格式如下所示。需要注意的是,其每一个指令都必须使用分号(;)结束,否则为语法错误。

  1. <section> {
  2. <directive><parameters>;
  3. }

一,全局块的配置

  1. user username [groupname];指定运行worker进程的用户和组
  2.  
  3. worker_processes 4; worker进程的个数;通常其数值应该为CPU的物理核心数减1,默认为4
  4.  
  5. error_log /path/to/error_log level [ debug | info | notice | warn | error | crit | alert | emerg ];错误日志文件及其级别,默认为error级别,错误日志在全局级别,访问日志在虚拟主机级别,调试时可以使用debug级别,但要求在编译时必须使用–with-debug启用debug功能;
  6.  
  7. pid /path/to/pidfile_name;指定nginxpid文件

nginx安装完成后,全局块默认只有这几个配置。

二,events块的配置

  1. events {
  2. use epoll定义使用的事件驱动模型,建议让nginx自动选择,默认使用epoll
  3. worker_connections 1024;每个worker能够并发响应最大请求数,默认为1024
  4. }

nginx 在events只配置此两个选项;

下面介绍 http 块的配置,http块的配置比较多,用法也比较灵活,以下是比较常用的配置。

  1. http {
  2. .....
  3. server {
  4. ......
  5. location {
  6. ......
  7. }
  8.  
  9. }
  10. server {
  11. ......
  12. location {
  13. ......
  14. }
  15. }
  16. }

三,nginx虚拟主机使用

nginx和httpd虚拟主机使用的实现一样,都有基于端口,IP,域名的虚拟机主机。要为nginx配置虚拟主机,只需在http块中额外定义一个server块。

1,配置基于端口的虚拟主机时,只需修改listen中的端口号。

  1. http{
  2. server {
  3. listen 80
  4. server_name a.com
  5. 。。。。。。
  6. }
  7. server {
  8. listen 8080
  9. server_name b.org
  10. 。。。。。。
  11. }
  12. }

2,配置基于域名的虚拟主机

  1. http{
  2. server {
  3. listen 80
  4. server_name a.com
  5. 。。。。。。
  6. }
  7. server {
  8. listen 80
  9. server_name b.org
  10. 。。。。。。
  11. }
  12. }

3,配置基于IP的虚拟主机

  1. http{
  2. server {
  3. listen 192.168.1.11080
  4. server_name a.com
  5. 。。。。。。
  6. }
  7. server {
  8. listen 192.168.1.11180
  9. server_name b.org
  10. 。。。。。。
  11. }
  12. }

四、访问控制access模块(基于IP)

自上而下进行检查,可以在 http, server, location, limit_except 中配置,与httpd中的配置类似。

  1. 语法: allow|deny address | CIDR | unix:| all;
  2.  
  3. location /{
  4. root /usr/html ;
  5. index index.html index.htm;
  6. allow 172.16.100.8
  7. allow 192.168.0.0/16;
  8. allow 10.1.1.0/16;
  9. deny all
  10. }

五,用户认证示例

此配置是为了禁止外人访问特定页面时进行的限制,需要借助于httpd的htpasswd创建密码文件。

  1. 语法: auth_basic string| off;
  2. auth_basic_user_file file;
  1. 例:
  2.  
  3. location /server {
  4. root /usr/html ;
  5. access_log off;#访问日志
  6. auth_basic "amdin area";#认证时的说明
  7. auth_basic_user_file /etc/nginx/.htpasswd;#密码文件所在位置
  8.  
  9. }

六、建立下载站点autoindex模块

此模块为了便于用户下载站的文件等,类似于ftp的功能,本站的ftp依是如此。

  1. location /{
  2. root html/ftp;
  3. allow all;
  4. autoindex on;#激活/关闭自动索引
  5. autoindex_exact_size on;#设定索引时文件大小的单位(B,KB, MB 或 GB)
  6. autoindex_localtime on;#开启以本地时间来显示文件时间的功能。默认为关(GMT时间)
  7. }

七、防盗链

防盗链是为了防止别的网站盗用自己网站的图片视频等资源,并给自己网站的服务器造成额外的负担。nginx使用valid_referers 指令进行配置防盗链规则。

(1) 定义合规的引用


valid_referers none | blocked | server_names | string …;

 

none : 检测referer头域不存在的情况

blocked:检测referer头域的值被防火墙或者代理服务器删除或者伪装的情况。这种情况下该头域的值不以http或者https开头。

server_names : 设置一个或多个URL,可以使用统配符 * 。


(2) 拒绝不合规的引用

 

  1. if($invalid_referer){
  2. rewrite ^/.*$ http://www.b.org/403.html
  3. }

示例:

  1. location ~* \.(gif|jpg|png|swf|flv|rar|zip)$
  2. {
  3. root /usr/html/htdocs;
  4. valid_referers none blocked server_names *.tianfeiyu.com;
  5. if($invalid_referer){
  6. rewrite ^/ http://www.tianfeiyu.com/wp-content/uploads/2016/01/QQ图片20160131111643.png;
  7. }
  8. }

八、URL rewrite

rewrite用于实现URI的重写,需要pcre的支持。


rewrite指令执行顺序:

 

1.执行server块的rewrite指令(这里的块指的是server关键字后{}包围的区域,其它xx块类似)

2.执行location匹配

3.执行选定的location中的rewrite指令

如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件

如果循环超过10次,则返回500 Internal Server Error错误.

 

  1. rewrite regex replacement [flag];
  1. location /{
  2. root /www/b.org;#每次被rewrite匹配并结束后,都要重新发送请求并再次到location中进行匹配,若有break则直接响应,不再发送新请求
  3. rewrite ^/images/(.*)$ /imgs/$1 last;
  4. }

请求顺序:http://www.b.org/images/a.jpg –> http://www.b.org/imgs/a.jpg

last: 一旦被当前规则匹配并重写后立即停止检查后续的其它rewrite的规则,而后通过重写后的规则重新发起请求;

break: 一旦被当前规则匹配并重写后立即停止后续的其它rewrite的规则,而后继续由nginx进行后续操作;

redirect: 返回302临时重定向;

permanent: 返回301永久重定向;

location /download/ {

    rewrite ^(/download/.*)/media/(.*)\..*$ $1/media/$2.mp3 break;

}

此处若为last,则nginx最多循环10次,超出之后会返回500错误;

注意:一般将rewrite写在location中时都使用break标志,或者将rewrite写在if上下文中;

rewrite_log on|off; 是否把重写过程记录在错误日志中;默认为notice级别;默认为off;

return code;用于结束rewrite规则,并且为客户返回状态码;可以使用的状态码有204, 400, 402-406, 500-504等;

相关推荐