Nginx的入门和进阶(理论篇)

1,144 阅读9分钟

Nginx快速入门

Nginx简介

Nginx(发音同 engine x)是一款基于异步框架轻量级、高性能的Web服务器反向代理服务器缓存服务器电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev(伊戈尔·赛索耶夫)所开发,最初供俄国大型网站Rambler.ru及搜寻引擎Rambler使用。

Nginx特点

优点:

最突出优点总结:5w高并发、善于处理静态文件、配置简单、稳定。

  • 高并发量:基于 epoll/kqueue 模型开发,支持高并发量,官方说其支持高达 5w 并发连接数的响应
  • 内存消耗少善于处理静态文件,相较于其他web(比如:apache),占用更少的内存及资源
  • 简单稳定:配置简单(一个conf文件),运行简单(nginx命令),而且运行稳定
  • 模块化程度高:功能模块插件化设计,可以自由配置相应的功能。
  • 支持Rwrite重写规则:能够根据域名、URL等请求关键点,实现定制化的高质量分发。
  • 低成本:Nginx的负载均衡功能很强大而且免费开源,相较于几十万的硬件负载均衡器成本相当低。
  • 支持多系统:Nginx代码完全用C语言从头写成,可以在各系统上编译并使用。

缺点:

  • 动态处理差:nginx善于处理静态文件,但是处理动态页面相较于Apache之类重量级的web软件能力稍欠缺
  • rewrite弱:虽然nginx支持rewrite功能多,但是相较于Apache之类重量级的web软件能力稍欠缺。

Nginx部署

安装

  1. nginx的安装
apt-get install -y build-essential libssl-dev libtool libpcre3 libpcre3-dev make openssl zlib1g-dev 
apt-get install nginx -y
  1. 检查效果
netstat -tnulp | grep nginx
  1. 服务相关命令
systemctl start|stop|reload|... nginx  开始、停止、重新加载nginx
/etc/init.d/nginx start|stop|reload|...   
/usr/sbin/nginx ...
nginx -V
  1. nginx服务相关命令
nginx -V
nginx -v
nginx -s stop 
nginx -s reload
nginx -t              检查默认配置文件
nginx -t -c file.conf 指定配置文件进行检查
  1. 移除相关命令
  • 查看和nginx相关软件
dpkg --get-selections|grep nginx
  • 移除nginx,包括相关文件
apt-get --purge remove nginx
apt-get --purge remove nginx-common
apt-get --purge remove nginx-core

Nginx配置简介

nginx软件目录:

  • 工作目录:/etc/nginx
  • 执行文件: /usr/sbin/nginx
  • 日志目录:/var/log/nginx
  • 启动文件:/etc/init.d/nginx
  • web目录:
    • /var/www/html/,首页文件是index.nginx-debian.html
    • /usr/share/nginx/html/ 首页文件是index.html

nginx配置文件:

  • 默认文件:/etc/nginx/nginx.conf
  • 其他目录:/etc/nginx/{sites-available/sites-enabled/conf.d}
  • 文件结构:
    • 全局配置段
    • http配置段
      • server配置段 项目或者应用
        • location配置段 url配置

102030.PNG

Nginx访问原理

010203.PNG

配置详解(最核心的部分)

全局配置段

主要是全局性的和服务级别的属性配置,常见的主要有以下几种设置:

user 设置使用用户(worker)
worker_processes 进行增大并发连接数的处理 跟 cpu 保持一致 八核设置八个
error_log nginx 的错误日志
pid nginx 服务启动时候 pid 
events 定义事件相关的属性
worker_connections 一个进程允许处理的最大连接数
use 定义使用的内核模型

http配置段

主要配置server通用的一些配置

include mime.types; # 文件扩展名与文件类型映射表
default_type application/octet-stream; # 默认文件类型
sendfile on; # 开启高效文件传输模式。
autoindex on; # 开启目录列表访问,合适下载服务器,默认关闭。
tcp_nopush on; # 防止网络阻塞
tcp_nodelay on; # 防止网络阻塞
keepalive_timeout 120; # 长连接超时时间,单位是秒
gzip on; # 开启 gzip 压缩输出

Server常见配置属性

常见样式
server {
 listen 端口;
 server_name 主机名;
 ...
}

server配置段最重要的属性是listenserver_name。它们都是用于匹配并处理请求的。

listen属性
  • 作用:定义Server监听的ip和port,当ip/port匹配时候才进行下一步匹配

  • 表现形式:

形式描述示例完整示例
IP:Port地址精确表示样式listen 10.10.10.10:99listen 10.10.10.10:99
IP自动监听 IP:80地址listen 10.10.10.10listen 10.10.10.10:80
Port自动监听 全地址:Portlisten 99或 [::]:99listen 0.0.0.0:99
default_server自动使用默认的地址listen default_serverlisten localhost:80
  • 使用原则:
    • 首先将所有样式补全成IP:Port,然后匹配,匹配Server多,那么接着使用Server_name匹配(通俗的一个理解就是当我们的匹配多个IP:Port的时候,后面的Server_name会起作用)
server_name属性
  • 作用:定义Server监听的域名,当域名匹配时候才进行下一步操作
  • 表现形式: | 格式 | 完整样式 | 前缀正则样式 | 后缀正则样式 | 禁止非法域名或IP | | --- | --- | --- | --- | --- | | 形式 | www.example.com | * .example.com | www.example.* | _ |
  • 使用原则:
    • 优先使用完整样式,然后使用前缀正则样式,最后使用后缀正则样式,如果正则样式相同的时候,匹配最长,否则就走非法规则。
    • 非法域名/IP,表示请求到该主机上一个不存在的IP或者域名
root属性
  • 作用:定义Server相应请求的html文件所在路径
  • 表现形式:
root /var/www/html;
index属性
  • 作用:定义响应请求后返回的文件名称或格式
  • 表现形式:
index index.html index.htm index.nginx-debian.html;
return属性
  • 作用:定义响应请求后返回的http状态码
  • 表现形式:
return 444;

location常见配置属性

location主要是根据Server匹配到的请求路径和关键字去响应和处理

语法:

location optional_modifier location_match { ... } 
location @name { ... }

其中:optional_modifier匹配条件location_match匹配的样式{}要执行的操作

匹配条件主要有两种:正则/前缀字符

匹配规则

  • 正则匹配 | 类型 | 含义 | 匹配方式 | 优先级 | 样式 | | :-----:| :----: | :----: | :----: | :----: | |~|!~ | 普通正则-敏感|不敏感 | 正则符号 | 3 | location ~ .(jpe?g)\*˜ ⁣\*˜普通正则不敏感敏感正则符号3location .(jpe?g) {} | | \~\*\|\!\~\* | 普通正则-不敏感\|敏感 | 正则符号 | 3 | location ~* .(jpe?g) {} |

  • 普通匹配 |类型 |含义 |匹配方式 |优先级| 样式| | :-----:| :----: | :----: | :----: | :----: | |=/路径 |精确匹配| 前缀 |1 |location = /image {}| |^~ |优先匹配| 前缀 |2| location ^~ /page {}| |@ |内部重定向 |前缀| |location @name {}| |空 / |通用匹配 |前缀 |4| location / {}|

使用原则:

  • 前提:根据请求url,获取uri即除了域名/IP之外的部分,用于location匹配
  • 如果有精确匹配,即 =/路径,找到匹配项后,结束匹配。
    • location = 路径 {} 或者 location 完整路径 {}
  • 如果有优先匹配,即 ^~,找到匹配项后,结束匹配。
    • location ^~ 路径
  • 如果有正则匹配,即 ~|!~|~*|!~*,找到匹配项后,不会终止继续匹配,直到找到合适的
    • location ~* 正则字符 {}
  • 如果匹配到多个,则使用location_match最长的

匹配示例

常见示例:

123000.PNG

  • 访问效果如下:
    • 访问根目录/, 比如http://a.com/ 将匹配规则A
    • 访问 http://a.com/login 将匹配规则B
    • 访问 http://a.com/static/a.html 将匹配规则C
    • 访问 http://a.com/a.gif, http://a.com/b.png 规则D和E均适合,按顺序优先使用规则D,而 http://a.com/static/c.png 则优先匹配到规则C
    • 访问 http://a.com/a.PNG 则匹配规则E,因为规则E不区分大小写。
    • 访问 http://a.com/a.XHTML 使用规则F。
    • 访问 http://a.com/category/id/1111 则最终匹配到规则H。

@name示例

@用来定义一个命名 location。主要用于内部重定向,不能用来处理正常的请求。其用法如下:

location / {
 try_files $uri $uri/ @custom
}
location @custom {
 # ...do something
 # custom 命名的 location 中不能再嵌套其它的命名 location
}

关于URL尾部的/有如下注意事项:

  1. location中的location_match字符有无"/"不受影响。/user/等同/user。
  2. 对于访问网站域名(http://sswang.com/),尾部有无"/"不受影响。因为浏览器会自动补全"/"
  3. 对于访问网站域名后面的路径(http://sswang.com/other/)。尾部的"/"很重要
  • URL尾部的"/"表示目录,没有"/"表示文件,而且文件找不到的话,会发生重定向
    • /other/:表示服务器会自动去该目录下找对应的默认文件。
    • /other:表示服务器会先去找other文件,找不到的话会将other当成目录,重定向到/other/,去该目录下找默认文件。

location常见动作:

在location内部常用的功能属性非常多,常见的基本属性、临时跳转、访问控制、目录列表等。

  • 基本属性
location / {
 root /var/www/html; # 指定响应请求的文件所在路径
 index index.php index.html index.htm; # 指定响应请求的默认文件名称
 expires 7d; # 指定响应请求的文件过期时间,一般用于静态文件
 try_files $uri $uri/ =404; # 如果 root 指定的路径下有查找的文件,就返回,否则报错
}
  • 临时跳转
location = /test/ {
 return 302 http://sswang.com/; # 访问旧 url 的时候,临时跳转到新 url,两个 url 均不失效
}
  • 访问控制
location /nginx-status {
 stub_status on; # 开启 nginx 的状态页面,默认关闭
 allow 192.168.8.14; # 允许的访问地址
 deny all; # 默认禁止所有访问
}
注意:
    该功能依赖于 ngx_http_stub_status_module 模块(默认没有安装,需要定制化安装)
  • 目录列表
location /upload {
 alias /var/www/upload; # 指定查看文件列表路径(绝对路径)
 autoindex on; # 开启目录自动索引
 autoindex_exact_size off; # 默认 on,显示文件确切大小(bytes)。off 表示显示文件的大概大小(kB/MB/...)
 autoindex_localtime on; # 默认 off,显示的文件时间为 GMT 时间。on 表示显示文件的服务器时间
}
注意:
    该 alias 指定的目录下,不允许出现 index 属性指定的文件。

root VS alias

  • root 和 alias 所起的作用都是指定响应请求所用文件的路径,只是他们有些许的区别
    • root 表示 location 匹配内容的相对路径
    • alias 表示 一个绝对路径,而且必须以"/"结尾
    • 一般情况下,在location /中配置root,在location /other中配置alias
效果一: 
location /img/ { 
    alias /var/www/image/; 
}
效果二:
location /img/ {
    root /var/www/image;
}

location核心动作

Nginx的配置语法灵活,可控制度非常高。在0.7以后的版本中加入了一个try_files指令,配合命名location ,可以部分替代原本常用的rewrite配置方式,提高解析效率。

  • 指令语法
try_files file ... uri
try_files file ... =code

作用:响应时按顺序查找file,找到则返回file内容,否则的话进行内部重定向(uri)或返回状态码(code)。

  • 常见示例
如果能找到指定的 uri 那么就返回相应的内容,否则的话返回错误状态码 404
try_files $uri $uri/ =404;
如果能找到指定的文件 1/2.html 那么就返回相应的内容,否则的话返回 6.html 文件内容
try_files 1.html 2.html /6.html;
如果能找到指定的 uri 那么就返回相应的内容,否则的话就内部重定向到后端名称为@backup 的 location
try_files $uri @backup;

注意:如果最后一个地址是一个uri的话,那么这个uri必须是存在的,否则的话就出事了