Nginx从入门到掌握【(第2节(共3节)】

简介:

目录: 

  1. nginx作为web服务器时使用的配置.

  2. 网络连接相关的配置:


正文:

一、nginx作为web服务器时使用的配置. 

1. http配置段:

Syntax: http { ... }
Default: —
Context: main 

http{}: 由ngx_http_core_module模块所引入; 

Documentation: http://nginx.org/en/docs/http/ngx_http_core_module.html#http

2. server配置段:

Syntax: server { ... }
Default: —
Context: http

server{}: 由ngx_http_core_module模块所引入; 

Documentation:http://nginx.org/en/docs/http/ngx_http_core_module.html#server

3. location配置段: 

Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default: —
Context: server, location

location{}: 由ngx_http_core_module模块所引入; 

4. 配置框架:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
http {  
    upstream {      
     ...  
       }   
    server {       
       location {            
           root  "/path/to/somedir" ;         
           ...      
       # 类似于httpd中的<Location>,用于定义URL与本地文件系统的映射关系;
           一个server里面可以指定多个location;   
       location URL {            
           if  ... {                
              ...           
           }        
       }   
      # 每个server类似于httpd中的一个<VirtualHost>;      
      server {     
           ...  
        }  
}

注:

  1. http与http相关的指令仅能够放置于http, server, location, upstream, if 上下文,但有些指令仅应用于这5种上下文中的某些之中;   

  2. 为了区分和方便管理每个server段,常用"include FILE_PATH"引用;

例: 

1
2
3
4
http {
     ... 
     include server.conf;  // 此处配置文件server.conf使用的是相对路径,是相对于根路径 /usr/local/nginx 而言的;
}

3. 配置指令: 

1) server {};
作用: 定义一个虚拟主机;

1
2
3
4
5
server {
      listen 8080; 
      server_name www.yangbin.com; 
      root  "/Web/html"
}

2) listen

作用: 指定监听的地址和端口;

1
2
listen ADDRESS[:PORT]
listen PORT;

3) server_name NAME [...]; 
作用: 后面可跟多个主机,名称还可以使用正则表达式(~)或通配符:(~开头)
匹配规则:
   (1) 先做精确匹配检查;
   (2) 左侧通配符匹配检查:*.yangbin.com 
   (3) 右侧通配符匹配检查:如mail.* 
   (4) 正则表达式匹配检查:如~^.*\.yangbin\.com$ 
   (5) default_server;   

例:

1
2
3
4
5
6
7
8
9
10
11
server {
     server_name www.yangbin.com;
     
server {
     server_name *.yangbin.com;
}
     
server {
     server_name mail.*; 
}

4) root path; 
作用: 设置资源路径映射,用于指明请求的URL所对应的资源所在的文件系统上的起始路径; 
     放置范围越大,生效范围越小;

5) location [ = | ~ | ~* | ^~ ] uri {...} 
   location @name { ... }
功能:允许根据用户请求的URL来匹配定义的各location,匹配到时,此请求将被相应的location配  置块中的配置所处理,例如做访问控制等功能; 

匹配规则:
    1) =: 精确匹配检查;
    2) ~: 正则表达式模式匹配检查,区分字符大小写;
    3) ~*: 正则表达式模块匹配检查,不区分字符大小写;
    4) ^~: URI的前半部分匹配,不支持正则表达式; 

匹配的优先级:精确匹配(=),^~,~,~*,不带任何符号的location; 即先匹配普通,再匹配正则; 

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
         listen 80;
         server_name www.yangbin.com; 
         location / {
             root  "/Web/html/"
             index index.html index.htm;
         }
         location  /images/  {
             root  "/Web/images/"
         }   // 上面两行其实表示的完整路径是 /Web/images/images 
            // 目录名后面一定要加 "/" .
         location ~* \.php$ {
             fcgipass; 
        
}

如: 

  /Web/images下有个xx.png,访问时: http://10.68.7.223/images/images/xx.png即可,注意与第一部分/的那个区分开。 
出错可查看相应error日志和access日志; 

6) alias path; 

作用:用于location配置段,定义路径别名; 

1
2
3
4
5
6
location  /images/  {
     root  "/Web/web1"
}
location  /images/ {
     alias  "/www/pictures"
// 此处访问 /images/xx .html,就是访问的 /www/pictures/xx .html.

注:

root表示指明路径为对应的location "/" URL;
alias表示路径映射, 即location指令后定义的URL是相对于alias所指明的路径而言;
     一般情况下,在location /中配置root,在location /other中配置alias是一个好习惯.
  例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
One. location ~ ^ /awstats/  {
        alias  /Web/
    }
    访问:http: //yangbin .com /awstats/ 
    实际访问的是http: //yangbin .com /Web/
  
First. location ~ ^ /awstats/  {                     
        #使用alias时目录名后面一定要加“/”
        alias  /Web/awstats/ ;
    }
    访问:http: //yangbin .com /awstats/ 
    实际访问的是http: //yangbin .com /Web/awstats/
  
Third. location ~ ^ /awstats/  {
        root  /Web/ ;
    }
    访问:http: //yangbin .com /awstats/ 
    实际访问的是http: //yangbin .com /web/awstats/

7) index file; 
作用: 设置默认主页面; 

1
index index.php index.html;

8) error_page code [...] [=code] URI | @name 
作用: 根据http响应状态码来指明特定的错误页面;

1
  error_page 404  /404_customed .html;  // 即把404错误的页面设定为我们自己指定的页面;

[=code]: 以指明的响应码进行响应,而非默认的原来的响应,默认表示以新资源的响应码为其响应码; 
例:在server段配置

1
2
3
4
5
6
7
8
9
10
11
server{
     ...
     fastcgi_intercept_errors on;
     error_page  404  /309 .html;   // 此处的 /309 .html是相对于网站根目录而言的,即 location / 对应的root路径.
     location / { 
         root  "/web/www" ;
    
}
[root@nginx nginx] # ls /Web/www/
309.html  index.html
[root@nginx nginx] #

总结:
fastcgi_intercept_errors
语法:fastcgi_intercept_errors on|off 
默认值:fastcgi_intercept_errors off 
使用字段:http, server, location 
该指令指定是否传递4xx和5xx错误信息到客户端,或允许nginx使用error_page处理错误信息。
必须明确在error_page中指定处理方法使这个参数有效。

9) 基于IP的访问控制:
allow IP/Network; 
deny IP/Network; 

示例:

1
2
3
4
5
location  /js/  {
     root  /Web/www/ ;
     allow 10.68.7.0 /24
     deny all; 
}

10) 基于用户的访问控制 

语法: auth_basic STRING | off;
默认值: auth_basic off;
配置段: http, server, location, limit_except

默认表示不开启认证,后面如果跟上字符,这些字符会在弹窗中显示。

语法: auth_basic_user_file "/PATH/TO/PASSWORD_FILE";
默认值: —
配置段: http, server, location, limit_except

可使用相对路径.账号密码文件建议使用htpasswd来创建;

htpasswd命令需要安装apache httpd服务获得.

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@nginx nginx] # which htpasswd
/usr/bin/htpasswd 
[root@nginx nginx] # htpasswd --help 
[root@nginx nginx] # id yangbin
uid=1000(yangbin) gid=1000(yangbin) 组=1000(yangbin)
[root@nginx nginx] # htpasswd -cm  conf/htpasswd/.htpasswd yangbin
New password: 
Re- type  new password: 
Adding password  for  user yangbin
[root@nginx nginx] # ll ./htpasswd/ -a
总用量 4
drwxr-xr-x.  2 root root  23 1月  12 16:07 .
drwxr-xr-x. 13 root root 182 1月  12 16:06 ..
-rw-r--r--.  1 root root  46 1月  12 16:07 .htpasswd
[root@nginx nginx] # chown nginx:root ./htpasswd/.htpasswd
1
2
3
4
5
6
7
8
9
[root@nginx nginx] # vim conf/server.conf  
  ...
  location  /images/  {
             alias    /Web/images/ ;
             auth_basic INPUT_PASSWORD;
             auth_basic_user_file htpasswd/.htpasswd;
   }
   ...
[root@nginx nginx] # ./sbin/nginx -s reload

浏览器访问: 

wKiom1h3PrXiBBg3AAA31OZoacw659.png

完成!

11) https服务
实现方法:生成私钥, 生成证书签署请求,并获得证书; 
例:

1
2
3
4
5
6
7
8
9
10
11
12
13
  server {
      listen       443 ssl;
      server_name  localhost;
     
      ssl_certificate       /usr/local/nginx/ssl/nginx .crt;
      ssl_certificate_key   /usr/local/nginx/ssl/nginx .key;
     
      ssl_session_cache    shared:SSL:1m;
      ssl_session_timeout  5m;
     
      ssl_ciphers  HIGH:!aNULL:!MD5;
      ssl_prefer_server_ciphers  on;
  }

https的具体配置过程,我在lvs那一篇博客有写,这里不再重复了.  

12) stub_status {on|off} 
Context仅用于location上下文;
作用: 主要用于查看Nginx的一些状态信息.
本模块默认是不会编译进Nginx的,如果要使用该模块,则要在编译安装Nginx时指定:

例:

1
2
3
4
5
[root@nginx nginx-1.10.2] # pwd
/mnt/tools/nginx-1 .10.2
[root@nginx nginx-1.10.2] # ./configure --help |egrep "stub"
   --with-http_stub_status_module      enable  ngx_http_stub_status_module
[root@nginx nginx-1.10.2] # ./configure –with-http_stub_status_module

查看已安装的Nginx是否包含"stub_status"模块:

1
#/usr/local/nginx/sbin/nginx -V

结果示例:

1
2
3
4
5
6
7
8
9
server {
        listen  80;
        server_name  yangbin.com;
        
        location / {
            root  "/web/www" ;
            stub_status on;
        }
}
1
2
3
4
5
6
[root@nginx ~] # curl 10.68.7.223
Active connections: 6
server accepts handled requests
  241  241  431 
Reading: 0 Writing: 1 Waiting: 0 
[root@nginx ~] #

说明:

(1) Active connections: 6   # 当前所有处于打开状态的连接数; 
(2) server accepts handled requests 
(3) 241  241  431 
   241 已经接受过的连接数 
   241 已经处理过的连接数 
   431 已经处理过的请求数: 在"保持连接"模式下,请求数量可能会多于连接数量;
(4)Reading: 0  Writing:1  Waiting:5 
   Reading: 正处于接收请求状态的连接数;Nginx 读取到客户端的Header信息数,即连接数;
   Writing: 请求已经接收完成,正处于处理请求或发送响应的过程中的连接数;Nginx 返回给客户端的Header信息数.即响应数据到客户端的数量;
   waiting: 保持连接模式,且处于活动状态的连接数; 开启keep-alive的情况下,这个值等于   active – (reading + writing),意思就是Nginx已经处理完成,正在等候下一次请求指令的驻留连接.
13) rewrite regex replacement flags; 

作用:路由重写是Web服务器中的一个很重要的基本功能。通过路由重写,可以结构化URL,更具语义化(对SEO有益)。另外,分享出去的URL可能会因程序路由变动而导致URL失效,而路由的重写可以很好的解决这类问题。
regex: 用于匹配URI的正则表达式。使用括号"()"标记要截取的内容。
使用环境:server, location, if
注:该指令根据表达式来重定向URI,或者修改字符串。指令根据配置文件中的顺序来执行。注意重写表达式只对相对路径有效;

例:

1
2
rewrite  ^ /images/ (.*\.jpg)$  /imgs/ $1  break
     http: //www .magedu.com /images/a/b/c/1 .jpg -->  /imgs/a/b/c/1 .jpg

flags:
   1) last: 一旦此rewrite规则重写完成后,就不再被后面其他的rewrite规则进行处理,而是由User Agent重新对重写后的URL再一次发起请求,并从头开始执行类似的过程; 
   2) break: 一旦此rewrite规则重写完成后,由User Agent对新的URL重新发起请求,且不会再被当前location内的任何rewrite规则所检查;
   3) redirect: 以302响应码(临时重定向)返回新的URL. 
   4) permanent:  以301响应码(永久重定向)返回新的URL;  

14) if    
语法: if (condition){...} 
应用环境: server, location 
condition:
(1) 变量名:
    变量值为空串,或者以"0"开始,则为false; 其他的均为true; 
(2) 以变量为操作数构成的比较表达式;
    可使用=,!=类似的比较操作符进行测试;
(3) 正则表达式的模式匹配操作:
    ~: 区分大小写的模式匹配检查;
    ~*: 不区分大小写的模式匹配检查; 
    !~和!~*: 对上面两种测试取反; 
(4) 测试路径为文件可能性: -f, !-f  
(5) 测试指定路径为目录的可能性: 
(6) 测试文件的存在性: -e, !-e 
(7) 检查文件是否有执行权限: -x, !-x    
例如:

1
2
3
if ($http_user_agent ~* MSIE) {
       rewrite ^(.*)$  /msie/ $1  break
}

15) 图片防盗链; 

语法: valid_referers none | blocked | server_names | string ...;
默认值: —
配置段: server, location
作用: 指定合法的来源'referer',它决定了内置变量$invalid_referer的值,如果referer头部包含在这个合法网址里面,这个变量被设置为0,否则设置为1.此变量不区分大小写. 

参数说明: 

none: "Referer"来源头部为空的情况
blocked: "Referer"来源头部不为空,但是里面的值被代理或者防火墙删除了,这些值都不以http://或者https://开头.
server_names: "Referer"来源头部包含当前的server_names(当前域名)
arbitrary string: 任意字符串,定义服务器名或者可选的URI前缀.主机名可以使用*开头或者结尾,在检测来源头部这个过程中,来源域名中的主机端口将会被忽略掉
regular expression: 正则表达式,~表示排除https://或http://开头的字符串.

location ~* \.(jpg|gif|jpeg|png)$ {

1
2
3
4
valid_referer none blocked www.yangbin.com; 
if  ($invalid_referer) {
         rewrite ^/ http: //www .yangbin.com /403 .html; 
}

16) 定制访问日志格式;

1
2
3
4
5
log_format main  '$remote_addr - $remote_user [$time_local] "$request"' 
                 '$status $body_bytes_sent "$http_referer"' 
                 '"$http_user_agent" "$http_x_forwarded_for"'
                 
access_log logs /access .log main;

注意:此处可用变量为nginx各模块内建变量; 


二、网络连接相关的配置: 

1. keepalive_timeout TIME; 
    长连接的超时时长,默认是75s; 

2. keepalive_requests N; 
    在一个长连接上所能允许请求的最大资源数;
    
3. keepalive_disable [msie6|safari|none]; 
    位指定类型的User Agent禁用长连接; 

4. tcp_nodelay on|off; 
    是否对长连接使用TCP_NODELAY选项;
    
5. client_header_timeout TIME; 
    读取http请求报文首部的超时时长;


6. client_body_timeout TIME; 
    读取http请求报文body部分的超时时长;
    
7. send_timeout TIME; 
    发送响应报文的超时时长;


--- 第二部分完成!


本文转自 羽丰1995 51CTO博客,原文链接:http://blog.51cto.com/13683137989/1891537


相关文章
|
7月前
|
存储 缓存 负载均衡
Nginx入门笔记
Nginx入门笔记
244 0
|
2月前
|
缓存 负载均衡 安全
Nginx常用基本配置总结:从入门到实战的全方位指南
Nginx常用基本配置总结:从入门到实战的全方位指南
344 0
|
2月前
|
负载均衡 算法 应用服务中间件
Nginx入门 -- 理解 Nginx 的请求处理流程
Nginx入门 -- 理解 Nginx 的请求处理流程
196 1
|
2月前
|
安全 应用服务中间件 网络安全
Nginx入门 -- 了解Nginx中证书配置
Nginx入门 -- 了解Nginx中证书配置
60 0
|
2月前
|
负载均衡 监控 算法
Nginx入门 -- 深入了解Nginx负载均衡
Nginx入门 -- 深入了解Nginx负载均衡
32 0
|
2月前
|
缓存 负载均衡 应用服务中间件
Nginx入门 -- Nginx 配置详解
Nginx入门 -- Nginx 配置详解
320 0
|
2月前
|
存储 缓存 应用服务中间件
Nginx入门 -- 基本数据结构中之ngx_hash_t
Nginx入门 -- 基本数据结构中之ngx_hash_t
43 0
|
2月前
|
存储 缓存 应用服务中间件
Nginx入门 -- 基本数据结构中之ngx_list_t,ngx_queue_t
Nginx入门 -- 基本数据结构中之ngx_list_t,ngx_queue_t
39 0
|
2月前
|
存储 应用服务中间件 nginx
Nginx入门 -- 基本数据结构中之ngx_str_t,ngx_array_t
Nginx入门 -- 基本数据结构中之ngx_str_t,ngx_array_t
83 0
|
2月前
|
前端开发 应用服务中间件 nginx
Nginx入门 -- 理解 Nginx 的基本概念:Pipe 和 Lingering Close
Nginx入门 -- 理解 Nginx 的基本概念:Pipe 和 Lingering Close
74 0