虚拟主机


虚拟主机 就是指此server块对外提供的虚拟主机,设置了主机的名称并配置好NDS,用户就可以使用这个名称向此虚拟主机发送请求了。
server_name name ...;
对于name而言,name可以只有一个名称,也可以由多个名称并列。之间用空格隔开。每个名字技术一个域名。由二段或者三段组成。之间由点号 . 隔开
server_name myserver.com www.myserver.com
nginx服务器规定,第一个名称作为此虚拟主机的主要名称。
在name中可以使用通配符 ‘*’,但通配符只能在由三段字符串组成的名称的手段或者尾端,或者由两断字符串组成的名称的尾段
server_name *.myserver.com www.myserver.*;
在name中还可以使用正则表达式,并使用波浪号~ 作为正则表达式字符串的开始标记
server_name ~^www\d+.myserver\.com
\d 代表0-9
正则表达式捕捉功能
server_name ~^www\.(.+)\.com$;
当请求通过www.myserver.com到达NGINX服务器端时,将会被上面的正则表达式所匹配。其中 myserver将会被捕捉,并记录到$1中,在本server块的下文配置中,当需要myserver时,就可以使用$1 代替myserver了。

也许服务器端包含很多虚拟主机,如果同时被多个虚拟主机匹配到如何处理呢
由于server_name 指令智齿使用通配符和正则表达式两种配置名称的方式
a 对于匹配方式不同的,按照以下的优先级选择虚拟主机,排在前面的优先处理请求
1 准确匹配 server_name
2 通配符在开始时匹配server_name成功
3 通配符在结尾时匹配server_name成功
4 正则表达式匹配server_name 成功
b
在以上四种匹配方式中,如果server_name被处于统一由县级的匹配方式多次匹配成功。则首次匹配成功的虚拟主机处理请求。

基于IP的虚拟主机配置
linux操作系统支持IP别名的添加。配置急于IP的虚拟主机,即为nginx服务器提供的媚态虚拟主机配置一个不同的ip,因此需要将网卡设置为同事能够监听多个IP地址。
ifconfig eth1:0 192.168.1.31 netmask 255.255.255.0 up
ifconfig eth1:1 192.168.1.32 netmask 255.255.255.0 up
命令中up表示立即启动此别名

http {
    server
    {
        listen: 80;
        server_name: 192.168.1.31}}

配置location块
在nginx的官方文档中定义的location的语法结构为
location { = | ~ | ~* | ^~ } url...
其中url变量是带匹配的请求字符串,可以是不含正则表达式的字符串,可能是含有正则表达式的字符串,如 .\php$
= 用于标准url前,要求请求字符串与url严格匹配。如果已经匹配成功。就停止就绪向下搜索冰立即处理此请求。
~ 用来表示url包含正则表达式,并且区分大小写
* 用于表示url包含正则表达式,并且不区分大小写。
如果url包含正则表达式,就必须要使用
或者~*标识

我们知道,在浏览器传送url时会对一部分字符进行url编码,比如空格被编码为%20, 问号被编码为 %3f等,^有一个特点是,他对url中的这些符号将会进行编码处理。比如 如果location块收到url为/html/%20/data ,则当nginx服务器搜索到配置为 ^/html/ /data 的location时,可以匹配成功

配置请求的根目录
web服务器接收到网络请求之后,首先要在服务器端指定目录中寻找请求资源,在nginx服务器中,指令root就是用来配置这个根目录的
root path;
path为nginx服务器接收到请求以后查找资源的根目录路径。path变量中可以包含nginx服务器预设的大多数变量,只有$document_root and $realpath_root不可使用
此指令可以在http块,server块或者location块使用

location /data/
{
    root     /locationtest1;
}
curl /locationtest1/data/*.html     类似

更改location的URL
在location还可以使用alias指令改变location接收到的url请求路径
alias path;
其中path即为修改后的根路径,

location    ~^/data/(.+\.(htm|html))$ {
alias    /locationtest1/other/$1;
}

设置网站的默认首页
指令index用于设置网站的默认首页,他一般可以有两个作用,一是用户在发出请求访问网站时,请求地址可以不写首页名称。二是 可以对一个请求,根据其请求内容而设置不同的首页。
index file.....;
其中 file变量可以包括多个文件名,其间使用空格分隔,也可以包含其他变量。

location    ~^/data/(.+)/web/    $
{
    index index.$1.html    index.my1.html    index.html;
    }

当location块接收到/data/locationtest/web/时,匹配成功,它首先将预置变量$1置为locationtest,然后localtion块接收到/data/index.htm的请求时,匹配成功。之后根据alias指令的设置将匹配到的/location/ data 更改为locationtest1/other/了.

查看网络的错误页面
如果用户端尝试查看网页时遇到问题,服务器会将http错误从网站发送到web浏览器,如果无法显示网页,web浏览器会显示网站发送的实际错误网页或web浏览器内置的友好错误信息。nginx服务器智齿自定义错误网页的显示内容。可以通过这一功能在网站发生错误时为用户提供人性化的错误显示页面。

HTTP消息 代码 含义
已移动 HTTP301 请求的数据具有新的位置,并且更改是永久的。
已找到 HTTP302 请求的数据临时具有不同URL
请参阅其他 HTTP303 可在另一URL下找到对请求的响应。并且应使用get方法检索此响应。
未修改 HTTP304 未按预期修改文档
使用代理 HTTP305 必须通过位置字段中提供的代理来访问请求的资源
未使用 HTTP306 不再使用,但保留此代码以便将来使用
无法找到网页 HTTP400 可以连接到web服务器,但是由于web地址URL的问题,无法找到网页
网站拒绝显示此网页 HTTP403 可以连接到网站,但internet explorer没有显示网页的权限
无法找到网页 HTTP404 可以连接到网站,但找不到网页。导致此错误的原因有可能是该网页暂时不可用或网页已被删除
网站无法显示该页面 HTTP405 可以连接到网站,但网页内容无法下载到用户计算机。这通常是由网页编写方式问题引起的
无法读取此网页格式 HTTP406 能够从网站接受信息,但internet explorer不能识别其格式,因而无法正确地显示消息。
该网站太忙,无法显示此网页 HTTP408或409 服务器显示该网页的时间太长,或对同一网页的请求太多
网页不复存在 HTTP410 可以连接到网站,但无法找到网页,与HTTP错误404不同,此错误是永久性的,而且由网站管理员打开。
网站无法显示该页面 HTTP500 正在访问的网站出现服务器问题,
该问题组织了此网页的显示。常见的原因是网站正在维护或使用脚本的交互式网站上的程序出错
未执行 HTTP501 没有将正在访问的网站设置为显示浏览器所请求的内容
不支持的版本 HTTP505 改网站不支持浏览器用于请求网页HTTO协议 最常见的HTTP/1.1

nginx设置网站错误页面的指令为error_page
error_page code .... [=[response]]url
code 要处理的HTTP错误代码,
response 可选项,将code指定的错误代码转化为新的错误代码
url 错误页面的路径或者网站地址,如果设置为路径,则是以nginx服务器安装路径下htmk目录为根路径的相对路径,如果设置为网址,nginx服务器会直接访问该网址获取错误页面

error_page    404    /404.html
error_page    403        http://somewebsite.com/forbidden.html;

error_page    410 =301    /empty.gif

设置将410消息,使用nginx安装路径/html/empty.gif 返回给用户端301的消息(已移动)

基于IP配置nginx的访问权限
nginx配置通过两种途径智齿基本访问权限的控制,其中一种是由HTTP标准ngx_http_access_module支持的,其通过IP来判断客户端是否拥有对NGINX的访问权限,
allow指令,用于设置允许访问nginx的客户端IP
allow address |CIDR all;
address 允许方额嗯的客户端IP地址,不支持同时设置多个。如果有多个IP需要设置,需要重复使用allow指令。
CIDR 允许访问的客户端的CIDR地址,例如202.80.18.23/25,千面是32位ip地址。后面/25 代表改IP地址中钱25位是网络部分,
all 代表所有客户端访问。支持IPV6地址
allow 2620:100:e000:8001;
另一个指令是deny,作用刚好和allow指令相反,他用于设置禁止访问nginx的客户端IP。
deny address|CIDR|ALL;

这两个指令可以在http块 server块或者location块中配置,在使用这两个指令时,要注意设置all的用法

location / {
    deny    192.168.1.1;
    allow    192.168.1.0/24;
    deny    all;
}

基于密码配置nginx的访问权限
nginx支持局域httobasic authentication协议的认证。该协议是一种http性质的认证办法,需要识别用户名和密码,认证失败的哭护短不具有访问nginx服务器的权限。该功能由HTTO标准模块ngx_http_basic_module支持,这是有两个指令需要学习
auth_basic指令,用于开启或者关闭该认证功能
auth_basic string |off;
string,开启该认证功能
off 关闭该认证功能
auth_basic_user_file file;
其中 file为密码文件的绝对路径
这里的密码文件支持铭文或者密码加密后的文件。

name1:password1
name2:password2:comment
name3:password3

加密密码可以使用crypt()函数进行密码加密的格式,在linux平台上可以使用htpasswd命令生成。在php和perl等语言中,也可以提供crypt()函数
htpasswd -c -d /nginx/conf/pass_file username;

    auth_basic_user_file /etc/nginx/nginx_userfile;
    auth_basic string;

文章作者: Thomas
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Thomas !
  目录