1. 设置默认虚拟主机

(本文永久地址:)

对没有匹配的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 reload >/dev/null 2>&1
/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;
         }
}

详细了解请参考

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;     } } }