## 一、Nginx中虚拟主机配置

### 1、基于域名的虚拟主机配置

1、修改宿主机的hosts文件(系统盘/windows/system32/driver/etc/HOSTS)

​ linux : vim /etc/hosts

格式: ip地址 域名

eg: 192.168.111.152 www.xiong.com

2、在nginx.conf文件中配置server段

```
server {
listen 80;
server_name www.gerry.com; # 域名区分

location / {
root html/gerry;
index index.html;
}
}

server {
listen 80;
server_name www.rm.com; # 域名区分

location / {
root html/rm;
index index.html;
}
}
```

### 2、基于端口号的虚拟主机配置

1、在nginx.conf文件中配置server段

```
server {
listen 80; # 端口区分
server_name www.xiong.com;

location / {
root html/xiong;
index index.html;
}
}

server {
listen 8080; # 端口区分
server_name www.xiong.com;

location / {
root html/xiong;
index index.html;
}
}
```

### 3、基于IP的虚拟主机配置

1、添加网卡的IP别名

```
ifconfig ens33:1 192.168.3.202 broadcast 192.168.3.255 netmask 255.255.255.0 up
route add -host 192.168.3.202 dev ens33:1
ifconfig ens33:2 192.168.3.203 broadcast 192.168.3.255 netmask 255.255.255.0 up
route add -host 192.168.3.203 dev ens33:2
```

从另外一台服务器Ping 192.168.3.202和192.168.3.203两个IP,如果能够Ping通,则证明配置无误。但是,通过ifconfig和route配置的IP别名在服 务器重启后会消失,不过可以将这两条ifconng和route命令添加到/etc/rc.local文件中,让系统开机时自动运行,以下是相关命令:**vi /etc/rc.local**
在文件末尾增加以下内容,然后保存即可

ifconfig ens33:1 192.168.3.202 broadcast 192.168.3.255 netmask 255.255.255.0 up
route add -host 192.168.3.202 dev ens33:1
ifconfig ens33:2 192.168.3.203 broadcast 192.168.3.255 netmask 255.255.255.0 up
route add -host 192.168.3.203 dev ens33:2

2、修改配置文件做如下的Server段配置

```properties
server {
listen 80;
server_name 192.168.3.202;

location / {
root html/host1;
index index.html;
}
}

server {
listen 80;
server_name 192.168.3.203;

location / {
root html/host2;
index index.html;
}
}

## 二、nginx中server_name的匹配顺序

**修改hosts配置文件**

在Hosts文件中做如下配置:

vim /etc/hosts

127.0.0.1 ddd.cn

127.0.0.1 aaa.cn

### 1、最高优先级:完全匹配

首先,在nginx.conf中创建2个server,1个完全匹配,1个通配符匹配

通配符server放在最前,以证明完全匹配的优先级与配置顺序无关

```
server {
listen 80;
server_name *.cn;

location / {
default_type text/html;
echo "通配符在前";
}
}

server {
listen 80;
server_name ddd.cn;

location / {
default_type text/html;
echo "完全匹配";
}
}
```

### 2、第二优先级:通配符在前

```
server {
listen 80;
server_name ddd.*;

location / {
default_type text/html;
echo "通配符在后";
}
}

server {
listen 80;
server_name *.cn;

location / {
default_type text/html;
echo "通配符在前";
}
}
```

### 3、第三优先级:通配符在后

```
server {
listen 80;
server_name ~^\w+\.cn$;

location / {
default_type text/html;
echo "正则匹配";
}
}

server {
listen 80;
server_name ddd.*;

location / {
default_type text/html;
echo "通配符在后";
}
}
```

### 4、listen配置项中default的影响

```
server {
listen 80;
server_name ~^\w+\.cn$;

location / {
default_type text/html;
echo "正则匹配";
}
}

server {
listen 80;
server_name dddd.xxx;

location / {
default_type text/html;
echo "不匹配";
}
}

server {
listen 80 default;
server_name haha.xxx;

location / {
default_type text/html;
echo "不匹配找Listen Default";
}
}
```

### 5、验证default的作用域

```
server {
listen 80 default;
server_name *.cn;

location / {
default_type text/html;
echo "通配符在前";
}
}

server {
listen 80;
server_name ddd.cn;

location / {
default_type text/html;
echo "完全匹配";
}
}

结论: default关键字在所有server段下面的server_name都匹配不上的时候才有效果
```

### 6、验证没有匹配成功也没有default的情况

```
server {
listen 80;
server_name haha.cn;

location / {
default_type text/html;
echo "不匹配,通配符在前";
}
}

server {
listen 80;
server_name heihei.cn;

location / {
default_type text/html;
echo "不匹配,通配符在后";
}
}

结论: 在请求的server_name 都不匹配也没有default关键字情况下,会根据配置文件的顺序选择配置文件中第一虚拟主机。
```

## 三、日志的配置

```
http {
include mime.types;
default_type application/octet-stream;
# 定义日志的格式
log_format main '$remote_addr - [$time_iso8601] - $msec - $status - $request_time - $body_bytes_sent - "$http_host" - "$request" - "$http_referer" - "$http_user_agent" - "$http_x_forwarded_for"';

  #设置日志默认存储目录
access_log logs/access.log main;
error_log logs/error.log;
}

====== 内置的变量 ===============
$remote_addr, $http_x_forwarded_for(反向) 记录客户端IP地址
$remote_user 记录客户端用户名称
$request 记录请求的URL和HTTP协议
$status 记录请求状态
$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。
$bytes_sent 发送给客户端的总字节数。
$connection 连接的序列号。
$connection_requests 当前通过一个连接获得的请求数量。
$msec 日志写入时间。单位为秒,精度是毫秒。
$pipe 如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。
$http_referer 记录从哪个页面链接访问过来的
$http_user_agent 记录客户端浏览器相关信息
$request_length 请求的长度(包括请求行,请求头和请求正文)。
$request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$time_iso8601 ISO8601标准格式下的本地时间。
$time_local 通用日志格式下的本地时间。
```

## 四、nginx配置location(html location重定向)

匹配指定的请求uri(请求uri不包含查询字符串,如http://localhost:8080/test?id=10,请求uri是/test)

**语法形式**

location [ = | ~ | ~* | ^~ | @] /uri/ { configuration }

location = /uri =开头表示精确前缀匹配,只有完全匹配才能生效。

location ^~ /uri ^~开头表示普通字符串匹配上以后不再进行正则匹配。

location ~ pattern ~开头表示区分大小写的正则匹配。

location ~* pattern ~*开头表示不区分大小写的正则匹配。

location /uri 不带任何修饰符,表示前缀匹配。(一般匹配,最长命中匹配)

location /uri/aaa/bbb 最长命中匹配

location / 通用匹配,任何未匹配到其他location的请求都会匹配到。

注意:正则匹配会根据匹配顺序,找到第一个匹配的正则表达式后将停止搜索。普通字符串匹配则无视顺序,只会选择最精确的匹配。

### 1、location常用匹配

- **=** :精准匹配
- **~** :正则匹配
- **~\*** :正则匹配,不区分大小写
- **^~** : 普通字符匹配, ^~ 的含义是如果命中,则不会再进行任何的正则匹配
- **前面没有任何修饰**: 普通字符匹配

### 2、location匹配顺序

1. 精确匹配
2. 普通匹配
3. 正则匹配

### 4、常用配置指令alias、root、proxy_pass

1、alias——别名配置,用于访问文件系统,在匹配到location配置的URL路径后,指向alias配置的路径,如:

> location /test/ {
>
> ​ alias /usr/local/; ## 文件路径必须为绝对路径
>
> }

请求/test/1.jpg(省略了协议和域名),将会返回文件/usr/local/1.jpg。

如果alias配置在正则匹配的location内,则正则表达式中必须包含捕获语句(也就是括号**()**),而且alias配置中也要引用这些捕获值。如:

> location ~* /img/(.+\.(gif|png|jpeg)) {
>
> ​ alias /usr/local/images/$1;
>
> }

请求中只要能匹配到正则,比如**/img/flower.png** 或者 **/resource/img/flower.png**,都会转换为请求**/usr/local/images/flower.png**。

2、root——根路径配置,用于访问文件系统,在匹配到location配置的URL路径后,指向root配置的路径,并把请求路径附加到其后,如:

> location /test/ {
>
> ​ root /usr/local/;
>
> }

请求/test/1.jpg,将会返回文件/usr/local/test/1.jpg。

3、proxy_pass——反向代理配置,用于代理请求,适用于前后端负载分离或多台机器、服务器负载分离的场景,在匹配到location配置的URL路径后,转发请求到proxy_pass配置额URL,是否会附加location配置路径与proxy_pass配置的路径后是否有"/"有关,有"/"则不附加,如:

> location /test/ {
>
> ​ proxy_pass http://127.0.0.1:8080;
>
> }

## 五、Nginx的Rewrite的使用

Rewrite规则含义就是某个URL重写成特定的URL,从某种意义上说**为了美观或者对搜索引擎友好,提高收录量及排名等。**

Rewrite规则的最后一项参数为flag标记,支持的flag标记主要有以下几种:

**1)** **last** **:相当于Apache里的(L)标记,表示完成rewrite;**

**2)** **break**;本条规则匹配完成后,终止匹配,不再匹配后面的规则

**3)** **redirect**:返回302临时重定向,浏览器地址会显示跳转后的URL地址

**4)** **permanent**:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

5) **last**和break用来实现URL重写,浏览器地址栏URL地址不变。

a) 例如用户访问[www.test.com](http://www.test.com/),想直接跳转到网站下面的某个页面,[www.test.com/new.index.html](http://www.test.com/new.index.html)如何来实现呢?

我们可以使用Nginx Rewrite 来实现这个需求,具体如下:

在server中加入如下语句即可:

**rewrite ^/$ http://www.test.com/index01.html permanent;**

*代表前面0或更多个字符

+代表前面1或更多个字符

?代表前面0或1个字符

^代表字符串的开始位置

$代表字符串结束的位置

。为通配符,代表任何字符

规则里面的$1$2你不知道是怎么来的话,只要记住,第一个()里面的是$1,第二个()里面的是$2.
请求的URL是给人看的,重写后的URL是给电脑看的。

执行搜索

这个规则的目的是为了执行搜索,搜索URL中包含的关键字。

```
请求的URL //hqidi.com/search/some-search-keywords
重写后URL //hqidi.com/search.php?p=some-search-keywords
重写规则 rewrite ^/search/(.*)$ /search.php?p=$1?;
```

用户个人资料页面

大多数运行访问者注册的动态网站都提供一个可以查看个人资料的页面,这个页面的URL包含用户的UID和用户名

```
请求的URL //hqidi.com/user/47/dige
重写后URL //hqidi.com/user.php?id=47&name=dige
重写规则 rewrite ^/user/([0-9]+)/(.+)$ /user.php?id=$1&name=$2?;
```

多个参数

有些网站对字符串参数使用不同的语法,例如 通过斜线“/”来分隔非命名参数

```
请求的URL //hqidi.com/index.php/param1/param2/param3
重写后URL //hqidi.com/index.php?p1=param1&p2=param2&p3=param3
重写规则 rewrite ^/index.php/(.*)/(.*)/(.*)$ /index.php?p1=$1&p2=$2&p3=$3?;
```

类似百科的格式

这种格式特点,一个前缀目录,后跟文章名称

```
请求的URL //hqidi.com/wiki/some-keywords
重写后URL //hqidi.com/wiki/index.php?title=some-keywords
重写规则 rewrite ^/wiki/(.*)$ /wiki/index.php?title=$1?;
```

论坛

论坛一般用到两个参数,一个话题标识(topic)一个出发点(starting post)

```
请求的URL //hqidi.com/topic-1234-50-some-keywords.html
重写后URL //hqidi.com/viewtopic.php?topic=1234&start=50
重写规则 rewrite ^/topic-([0-9]+)-([0-9]+)-(.*)\.html$ viewtopic.php?topic=$1&start=$2?;
```

新网站的文章

这种URL结构的特点,由一个文章标识符,后跟一个斜线,和一个关键字列表组成。

```
请求的URL //hqidi.com/88/future
重写后URL //hqidi.com/atricle.php?id=88
重写规则 rewrite ^/([0-9]+)/.*$ /aticle.php?id=$1?;
```

最后一个问号

若被替换的URI中含有参数(类似/app/test.php?id=5之类的URI),默认情况下参数会被自动附加到替换串上,可以通过在替换串的末尾加上?标记来解决这一问题。

```
rewrite ^/users/(.*)$ /show?user=$1? last;
```

比较一个加上?标记和不加?标记的URL跳转区别:

```
rewrite ^/test(.*)$ //hqidi.com/home premanent;
```

访问//hqidi.com/test?id=5 经过301跳转后的URL地址为 //hqidi.com/home?id=5

```
rewrite ^/test(.*)$ //hqidi.com/home? premanent;
```

访问//hqidi.com/test?id=5 经过301跳转后的URL地址为 //hqidi.com/home

nginx常用配置2的更多相关文章

  1. 【第六课】Nginx常用配置下详解

    目录 Nginx常用配置下详解 1.Nginx虚拟主机 2.部署wordpress开源博客 3.部署discuz开源论坛 4.域名重定向 5.Nginx用户认证 6.Nginx访问日志配置 7.Ngi ...

  2. 轻量级HTTP服务器Nginx(常用配置实例)

    轻量级HTTP服务器Nginx(常用配置实例)   文章来源于南非蚂蚁   Nginx作为一个HTTP服务器,在功能实现方面和性能方面都表现得非常卓越,完全可以与Apache相媲美,几乎可以实现Apa ...

  3. Nginx常用配置实例(4)

    Nginx作为一个HTTP服务器,在功能实现方面和性能方面都表现得非常卓越,完全可以与Apache相媲美,几乎可以实现Apache的所有功能,下面就介绍一些Nginx常用的配置实例,具体包含虚拟主机配 ...

  4. nginx常用配置

    nginx.conf配置文件详解 其主要分为几个模块 全局快 从开始到events块之间的一部分内容,其作用域为全局作用域 events块 主要负责Nginx服务器与用户的网络连接 常用设置: 是否开 ...

  5. Nginx 常用配置方式说明

    原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等问题,可查看当前链接:https://app.yinxiang.com/shard/s17/nl/19391737/7619763f-1 ...

  6. 第十章 nginx常用配置介绍

    一.虚拟主机 1.配置方式 #虚拟主机配置方式:1.基于多IP的方式2.基于多端口的方式3.基于多域名的方式 2.方式一:基于多IP的方式 1.第一个配置文件[root@web02 /etc/ngin ...

  7. nginx常用配置系列-HTTPS配置

    接上篇,nginx配置系列 HTTPS现在已经很流行,特别是AppStore上线的应用要求使用HTTPS进行通信,出于安全考虑也应该使用HTTPS,HTTPS配置需要准备证书文件,现在也有很多免费证书 ...

  8. nginx常用配置系列-虚拟主机

    本来准备详尽的出一份nginx配置讲解,但nginx功能配置繁多,平常使用中使用最多的一般有: 1. 虚拟主机配置 2. HTTPS配置 3. 静态资源处理 4. 反向代理 ============= ...

  9. Nginx 常用配置

    Nginx的负载均衡方式 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2.weight 指定轮询几率,weight和访问比率成正比,用于后端 ...

随机推荐

  1. .NET基础 (06)面向对象的实现

    面向对象的实现1 C#中类可以有多个父类.可以实现多个接口吗2 简述C#中重写.重载和隐藏的概念3 为什么在构造方法中调用虚方法会导致问题4 在C#中如何声明一个类不能被继承 面向对象的实现 1 C# ...

  2. unittest对单个测试类的多种测试执行方法总结

    基于unittest测试框架编写的测试脚本,一般单个测试类下会有多个测试方法,unittest也提供多种测试执行方式,下面就不同方式或者需求一一实操并说明: 一.使用unittest下main()方法 ...

  3. Alpha冲刺(四)

    Information: 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Details: 组员1(组长)柯奇豪 过去两天完成了哪些任务 文章基本的存储.列表生成显示 展示G ...

  4. Python之算法基础

    1>递归相关: 递归:递归算法是一种直接或间接地调用自身算法的过程,在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且                   易于 ...

  5. 强大的CSS 属性选择符 配合 stylish 屏蔽新浪微博信息流广告

    新建一条微博域名下的规则: @-moz-document domain("weibo.com") { #v6_pl_rightmod_rank,#v6_pl_rightmod_ad ...

  6. cannot be resolved to a type (Java)

    最近经常遇到cannot be resolved to a type (Java)报错,以下为在网上找到的解决方案: 1.先看看有没有引用相关jar包2.检查jar是否引用了多个相同的,或者多个jar ...

  7. 性能测试工具Locust的介绍和使用

    内容来自网络 https://www.w3xue.com/exp/article/20191/16707.html https://blog.csdn.net/qq_36255988/article/ ...

  8. iOS通过dSYM文件分析crash

    重点是dwarfdump --uuid命令 我们在iOS开发中会碰到的很多crash问题,如果Debug调试模式的话,我们可以往往很容易的根据log的输出定位到导致crash的原因,但对于已经上线的应 ...

  9. “全栈2019”Java第五十八章:多态中方法返回类型可以是子类类型

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  10. “全栈2019”Java第九章:解释第一个程序

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...