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部署
安装
- nginx的安装
apt-get install -y build-essential libssl-dev libtool libpcre3 libpcre3-dev make openssl zlib1g-dev
apt-get install nginx -y
- 检查效果
netstat -tnulp | grep nginx
- 服务相关命令
systemctl start|stop|reload|... nginx 开始、停止、重新加载nginx
/etc/init.d/nginx start|stop|reload|...
/usr/sbin/nginx ...
nginx -V
- nginx服务相关命令
nginx -V
nginx -v
nginx -s stop
nginx -s reload
nginx -t 检查默认配置文件
nginx -t -c file.conf 指定配置文件进行检查
- 移除相关命令
- 查看和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配置
- server配置段 项目或者应用
Nginx访问原理
配置详解(最核心的部分)
全局配置段
主要是全局性的和服务级别的属性配置,常见的主要有以下几种设置:
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配置段最重要的属性是listen和server_name。它们都是用于匹配并处理请求的。
listen属性
-
作用:定义Server监听的ip和port,当ip/port匹配时候才进行下一步匹配
-
表现形式:
| 形式 | 描述 | 示例 | 完整示例 |
|---|---|---|---|
| IP:Port | 地址精确表示样式 | listen 10.10.10.10:99 | listen 10.10.10.10:99 |
| IP | 自动监听 IP:80地址 | listen 10.10.10.10 | listen 10.10.10.10:80 |
| Port | 自动监听 全地址:Port | listen 99或 [::]:99 | listen 0.0.0.0:99 |
| default_server | 自动使用默认的地址 | listen default_server | listen localhost:80 |
- 使用原则:
- 首先将所有样式补全成IP:Port,然后匹配,匹配Server多,那么接着使用Server_name匹配(
通俗的一个理解就是当我们的匹配多个IP:Port的时候,后面的Server_name会起作用)
- 首先将所有样式补全成IP:Port,然后匹配,匹配Server多,那么接着使用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) {} |
-
普通匹配 |类型 |含义 |匹配方式 |优先级| 样式| | :-----:| :----: | :----: | :----: | :----: | |=/路径 |精确匹配| 前缀 |1 |location = /image {}| |^~ |优先匹配| 前缀 |2| location ^~ /page {}| |@ |内部重定向 |前缀| |location @name {}| |空 / |通用匹配 |前缀 |4| location / {}|
使用原则:
- 前提:根据请求url,获取
uri即除了域名/IP之外的部分,用于location匹配 - 如果有精确匹配,即 =/路径,找到匹配项后,结束匹配。
- location = 路径 {} 或者 location 完整路径 {}
- 如果有优先匹配,即 ^~,找到匹配项后,结束匹配。
- location ^~ 路径
- 如果有正则匹配,即 ~|!~|~*|!~*,找到匹配项后,不会终止继续匹配,直到找到合适的
- location ~* 正则字符 {}
- 如果匹配到多个,则使用location_match最长的。
匹配示例
常见示例:
- 访问效果如下:
- 访问根目录/, 比如
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尾部的/有如下注意事项:
location中的location_match字符有无"/"不受影响。/user/等同/user。对于访问网站域名(http://sswang.com/),尾部有无"/"不受影响。因为浏览器会自动补全"/"。对于访问网站域名后面的路径(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
- root 表示 location 匹配内容的
效果一:
location /img/ {
alias /var/www/image/;
}
效果二:
location /img/ {
root /var/www/image;
}
- 效果一:访问http://localhost/img/,nginx找/var/www/image/目录下的文件
- 效果二:访问http://localhost/img/,nginx找/var/www/image/img/目录下的文件
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必须是存在的,否则的话就出事了