1.预备知识
Web
服务器的主要功能由
ngx_http_core_module
模块(
HTTP
框架的主要成员)实现,
Web
服务器还有许多功能是由其他的
HTTP
模块实现的。
HTTP
配置项都必须直属于
http
块、
server
块、
location
块、
upstream
块或
if
块等
HTTP
配置项自然必须全部在
http{}
块之内,这里的
“
直属于
”
是指配置项直接所属的大括号
为配置一个完整的静态
Web
服务器提供了非常多的功能,下面会把这些配置项分为
8
类进行详述:
2虚拟主机与请求的分发
IP
地址的数量有限,因此经常存在多个主机域名对应着同一个
IP
地址的情况,这时
nginx.conf
中就可以按照
server_name
(对应用户请求中的主机域名)并通过
server
块来定义
server
块就是一个虚拟主机,它只处理与之相对应的主机域名请求。这样,
Nginx
就能以不同的方式处理访问不同主机域名的
HTTP
请求了
(1)监听端口
listen address:port[default(deprecated in 0.8.21)|default_server|
[backlog=num|rcvbuf=size|sndbuf=size|accept_filter=filter|deferred|
bind|ipv6only=[on|off]|ssl]]
解释
1.address:port :
注意:不加端口时,默认监听
端口
listen [::]:8000;listen [fe80::1];listen [:::a8c9:1234]:80;
default default_server
backlog=num
6 deferred
在设置该参数后,若用户发起建立连接请求,并且完成了TCP的三次握手, 内核也不会为了这次的连接调度worker进程来处理,只有用户真的发送请求数据时(内核已 经在网卡中收到请求数据包),内核才会唤醒worker进程处理这个连接。这个参数适用于大 并发的情况下,它减轻了worker进程的负担。当请求数据来临时,worker进程才会开始处理 这个连接。只有确认上面所说的应用场景符合自己的业务需求时,才可以使用deferred配 置
7 bind
SL协议的三个特性
① 保密:在握手协议中定义了会话密钥后,所有的消息都被加密;
② 鉴别:可选的客户端认证,和强制的服务器端认证;
③ 完整性:传送的消息包括消息完整性检查(使用MAC)。
(2) server_name
语法: server_name name[...];
默认: server_name"";
配置块 server
后可以跟多个主机名称,
server_name
www.testweb.com
、 download.testweb.com;
HTTP
请求时,
Nginx
会取出
header
头中的
Host
,与每个
server
中的
进行匹配,以此决定到底由哪一个
server
块来处理这个请求。有可能一个
Host
与
server
块中的
server_name
都匹配,这时就会根据匹配优先级来选择实际处理的
server
块。
与
Host
的匹配优先级如下
1
)首先选择所有字符串完全匹配的
server_name
,如
www.testweb.com
。2
)其次选择通配符在前面的
server_name
,如
*.testweb.com
。3
)再次选择通配符在后面的
server_name
,如
www.testweb.*
。4
)最后选择使用正则表达式才匹配的
server_name
,如
~^\.testweb\.com$
。
Host
与所有的
server_name
都不匹配,这时将会按下列顺序选 择处理的server
块。
1)优先选择在listen配置项后加入[default|default_server]的server块。
2)找到匹配listen端口的第一个server块
server_names_hash_bucket_size server_names_hash_max_size
语法: server_names_hash_bucket_size size;
默认: server_names_hash_bucket_size 32|64|128;
配置块: http、server、location
语法: server_names_hash_max_size size;
默认: server_names_hash_max_size 512;
配置块: http、server、location
server name
的能力,
Nginx
使用散列表来存储
server_name
。
设置了每个散列桶占用的内存大小。
会影响散列表的冲突率。
server_names_hash_max_size
越大,
key
的冲突率则会降低,检索速度也更server_names_hash_max_size越小,消耗的内存就越小,但散列
key
的冲突率可能增高
(5)重定向主机名称的处理
语法: server_name_in_redirect on|off;
默认: server_name_in_redirect on;
配置块: http、server或者location
server_name
使用。在使用
on
打开时,表示在重定向请求时会使用
里配置的第一个主机名代替原先请求中的
Host
头部,而使用
off
关闭时,表示在重
Host
头部。
(6)location
语法: location[=|~|~*|^~|@]/uri/{...}
配置块 server
会尝试根据用户请求中的
URI
来匹配上面的
/uri
表达式,如果可以匹配,就选择
块中的配置来处理用户请求。
location
的匹配规则(可使用正则表达式)
1
)
=
表示把
URI
作为字符串,以便与参数中的
uri
做完全匹配2
)
~
表示匹配
URI
时是字母大小写敏感的。3
)
~*
表示匹配
URI
时忽略字母大小写问题。4
)
^~
表示匹配
URI
时只需要其前半部分与
uri
参数匹配即可。5
)
@
表示仅用于
Nginx
服务内部请求之间的重定向,带有
@
的
location
不直接处理用户请求
是有顺序的,当一个请求有可能匹配多个
location
时,实际上这个请求会
location
处理
“
如果匹配
…
则
…”
。如果需要表达
“
如果不匹配
…
…”
,就很难直接做到。有一种解决方法是在最后一个
location中使用/
作为参数,它会匹配
HTTP
请求,这样就可以表示如果不能匹配前面的所有
location
,则由
“/”
这个
location
处
location / {
# /可以匹配所有请求
…
}
文件路径的定义
(1)以root方式设置资源路径
语法: root path;
默认: root html;
配置块: http、server、location、if
例子:
location /download/ {
root optwebhtml;
}
URI
是
/download/index/test.html
,那么
Web
服务器将
opt
web
html
download/index/test.html
文件的内容。
(2)以alias方式设置资源路径
语法: alias path;
配置块: location
也是用来设置文件资源路径的,它与
root
的不同点主要在于如何解读紧跟
location
后
uri
参数,这将会致使
alias
与
root
以不同的方式将用户请求映射到真正的磁盘文件上。例
URI
是
/conf/nginx.conf
,而用户实际想访问的文件:
location conf {
alias usr/local/nginx/conf/;
}
root
设置,那么语句如下所示:
location conf {
root usr/local/nginx/;
}
alias
时,在
URI
向实际文件路径的映射过程中,已经把
location后配置的/conf这部分
/conf/nginx.conf
请求将根据
alias path
映射为
path/nginx.conf
。
root
则不
URI
请求来映射,因此,
/conf/nginx.conf
请求会根据
root path
映射为
。这也是
root
可以放置到
http
、
server
、
location
或
if
块中,而
alias
只能放置
location
块中的原因
(3)访问首页
语法: index file...;
默认: index index.html;
配置块: http、server、location
URI
是
/
,这时一般是返回网站的首页,而这与
root
和
alias
都不同。
ngx_http_index_module
模块提供的
index
配置实现。
index
后可以跟多个文件参数,
Nginx
location {
root path;
index index.html htmlindex.php /index.php;
}
Nginx
首先会尝试访问
path/index.php
文件,如果可以访问,就直接返回文
path
html
index.php
文件的内容,依此类推。
(4)根据HTTP返回码重定向页面
语法: error_page code[code...][=|=answer-code]uri|@named_location
配置块: http、server、location、if
error_page
中设置的
code
,则重定向到新
URI
中。例如:
error_page 404 404.html;
error_page 502 503 504 50x.html;
error_page 403 http://example.com/forbidden.html
;
error_page 404 = @fetch;
2.虽然重定向了URI,但返回的HTTP错误码还是与原来的相同。用户可以通 过“=”来更改返回的错误码,例如
error_page 404 =200 empty.gif;
error_page 404 =403 forbidden.gif;
3. 如果不想修改URI,只是想让这样的请求重定向到另一个location中进行处理,那么可以 这样设
location / (
error_page 404 @fallback;
)
location @fallback (
proxy_pass http://backend
;
)
(5)是否允许递归使用error_page
语法: recursive_error_pages[on|off];
默认: recursive_error_pages off;
配置块: http、server、location
try_files
语法: try_files path1[path2]uri;
配置块: server、location
后要跟若干路径,如
path1 path2…
,而且最后必须要有
uri
参数,意义如下:尝试
path
,如果可以有效地读取,就直接向用户返回这个
path
对应的文件结
path
都找不到有效的文件,就重定向到最后的参数
上。因此,最后这个参数
uri
必须存在,而且它应该是可以有效重定向的
try_files systemmaintenance.html $uri $uri/index.html $uri.html @other;
location @other {
proxy_pass http://backend
;
}
system
maintenance.html
等,都找不到,就会反向
http://backend
服务上。还可以用指定错误码的方式与
error_page
配合使用,例如
location {
try_files $uri $uri /error.phpc=404 =404;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/129627.html