Nginx简介
Nginx是一个开源且高性能、高可靠的web服务器及邮件代理服务器。它不仅支持热部署,几乎可以做到7*24小时不间断运行,还能在不中断服务的情况下对软件版本进行热更新。它由俄罗斯人伊戈尔·赛索耶夫开发。目前已被F5收购。
常见的web服务器:
httpd:Apache软件基金会
IIS:微软服务器版
GWS:由Google开发
Tengine:淘宝基于nginx进行二次开发
为什么选择nginx而不是apache
- 轻量化。功能模块相对少,源码仅保留http核心模块代码,其它作为插件进行安装。
- 模块化。便于二次开发,对开发人员非常友好。
- 技术成熟。国内公司基本大规模使用,适合当前主流架构趋势。
- 采用epoll模型。当用户发起请求,epoll模型异步非阻塞,直接进行处理,效率高,无连接限制。而Apache采用select模型会对请求进行遍历扫描,从而导致性能低下。
- 支持热部署。 不停机更新配置文件、升级版本、更换日志文件
- 系统内存和CPU占用率低。10000个keep-alive连接模式下的非活动连接,仅需2.5M左右的内存
- 高并发响应性能非常好。据官方统计处理静态文件并发5W/s
Nginx应用场景
- 静态服务应用
浏览器缓存应用
防资源盗用应用
资源分类应用
资源压缩应用
资源缓存应用
跨域访问应用
- 代理服务应用
协议类型设置
正向代理设置
反向代理设置
负载均衡设置
代理缓存设置
动静分离设置
- 安全服务应用
访问控制应用
流量限制应用
拦截异常攻击
拦截SQL注入
- 流行架构应用
LNMP:Linux+Nginx+MySQL+PHP(Fastcgi_pass)
LNMT:Linux+Nginx+MySQL+Tomcat
LNMP:Linux+Nginx+MySQL+Python(uwsgi_pass)
Nginx服务部署
version:1.16.1
为省去源码编译安装的时间本次部署采用官方yum源进行安装,首先编辑/etc/yum.repos.d/nginx.repo文件添加以下内容:
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
运行yum install -y nginx命令进行安装,安装完成后可以使用rpm -ql nginx查看安装信息。
nginx应用程序命令:
nginx -s reload #重新加载配置文件,热重启
nginx -s reopen #重启nginx
nginx -s stop #快速关闭
nginx -s quit #等待工作进程处理完成后关闭
nginx -T #查看nginx最终配置
nginx -t #检查配置是否出错
Nginx配置文件结构
#全局模块
user nginx; #nginx进程所使用的的用户,可以不配置
worker_processes auto; #nginx运行的work进程数量(建议与CPU数量一致或auto)
error_log /var/log/nginx/error.log; #nginx错误日志路径
pid /run/nginx.pid; #nginx服务运行后产生的PID进程号文件路径
include /usr/share/nginx/modules/*.conf;
worker_rlimit_nofile_number 20480; #指定 worker 子进程可以打开的最大文件句柄数。
#指定 worker 子进程异常终止后的 core 文件,用于记录分析问题。
worker_rlimit_core 100M; #存放大小限制
working_directory /opt/nginx/tmp; # 存放目录
#将每个 worker 子进程与我们的 CPU 物理核心绑定。
worker_cpu_affinity 0001 0010 0100 1000; # 4个物理核心,4个 worker 子进程
#指定 worker 子进程的优先级,值越小越优先
worker_priority -10; # 120-10=110,110 就是最终的优先级(120是linux默认进程优先级,优先级范围:-20~+19)
# 指定 worker 子进程优雅退出时的超时时间。
worker_shutdown_timeout 5s;
# worker 子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降。
timer_resolution 100ms;
#指定 Nginx 的运行方式,前台还是后台,前台用于调试,后台用于生产。
daemon off; # 默认是 on,后台运行模式
#事件模块
events {
use epoll; #使用epoll的IO模型,可选值为:select、poll、kqueue、epoll、/dev/poll、eventport
worker_connections 1024; #每个worker进程支持的最大连接数
multi_accept on; #尽可能多地接收请求
#是否打开负载均衡互斥锁。
accept_mutex on # 默认是 off 关闭的,这里推荐打开
# 指定虚拟主机域名
server_name www.nginx.com;
#域名匹配的四种写法:匹配优先级:精确匹配->左侧匹配->右侧通配->正则匹配
#精确匹配:server_name www.nginx.com ;
#左侧通配:server_name *.nginx.com ;
#右侧通配:server_name www.nginx.* ;
#正则匹配:server_name ~^www\.nginx\.*$ ;
}
#http模块,配置最频繁的模块
http {
# 配置日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 访问日志存放目录
access_log /var/log/nginx/access.log main;
sendfile on; #是否调用sendfile函数来输出文件,建议设置为on(高校传输模式)
tcp_nopush on; #减少网络报文段数量,防止网络阻塞
tcp_nodelay on; #提高数据的实时响应性
keepalive_timeout 65; # 保持连接时间,也叫超时时间,单位为秒
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf; #加载子配置项
#server模块
server {
listen 80 default_server; # 配置监听端口
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html; #网站根目录,可以写在http、server、location等配置中
include /etc/nginx/default.d/*.conf; #加载子配置项
#location模块
location / {
alias /opt/nginx/static/image/;#是指定静态资源目录位置,它只能写在 location 中。
}
#默认40x错误对应的访问页面
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
全局模块:配置作用于nginx全局。一般用于定义日志路径、PID文件路径、配置文件引入、事件驱动机制进程管理等。
events模块: 配置影响nginx服务器或用户的网络连接、每个进程最大连接数、事件驱动模型等。
http模块: 可以嵌套多个server模块,配置代理和其它第三方模块的配置。
server模块: server模块也叫虚拟主机模块,用来定义虚拟主机。
location模块: 配置站点请求的理由(站点的路径)以及各种页面的处理情况。匹配规则:
Nginx常用模块
-
目录索引模块:ngx_http_autoindex_module
Syntax: autoindex on | off; Default: autoindex off; Context: http, server, location
例子:
[root@localhost ~]# cd /etc/nginx/conf.d/
[root@localhost conf.d]# ls
default.conf
[root@localhost conf.d]# mv default.conf default.conf.bak
[root@localhost conf.d]# vim www.conf
server {
listen 80;
server_name localhost;
location / {
root /test_code;
index index.html;
autoindex on;
#停止处理请求
return URL或code [msg]; #比如return 404 "pages not found"; # 返回状态码 + 一段文本
#根据指定正则表达式匹配规则,重写 URL。
if ( $uri = "/images/" ){
#rewrite (.*) /pics/ break;
rewirte /images/(.*\.jpg)$ /pic/$1; # $1是前面括号(.*\.jpg)的反向引用
}
}
}
打开网站可以看到以下效果:
-
状态监控模块: ngx_http_stub_status_module
Syntax: stub_status; Default: — Context: server, location
该模块用于输出nginx基本状态信息。
-
访问限制模块: ngx_http_limit_conn_module(基于连接)
ngx_http_limit_req_module(基于请求)Syntax: limit_conn zone number; Default: — Context: http, server, location
当每秒请求超过3次:
- 访问控制模块:
-
ngx_http_auth_basic_module(基于用户)
Syntax: auth_basic string | off; Default: auth_basic off; Context: http, server, location, limit_except ---------------------------------------------------- Syntax: auth_basic_user_file file; Default: — Context: http, server, location, limit_except
安装生成密码的工具:yum install -y httpd-tools
生成密码:[root@localhost test_code]# htpasswd -b -c /etc/nginx/auth_conf username 124
效果如下:
-
ngx_http_access_module(基于IP)
Syntax: allow address | CIDR | unix: | all; Default: — Context: http, server, location, limit_except
- 日志模块: ngx_http_log_module
默认日志配置:
Nginx日志格式允许包含的变量:
$remote_ addr | 记录客户端IP地址 |
---|---|
$remote_ user | 记录客户端用户名. |
$time_ local | 记录通用的本地时间 |
$time_ iso8601 | 记录IS08601标准格式下的本地时间 |
$request | 记录请求的方法以及请求的http协议 |
$status | 记录请求状态码(用于定位错误信息) |
$body_ bytes_ sent | 发送给客户端的资源字节数,不包括响应头的大小 |
$bytes_ sent | 发送给客户端的总字节数 |
$msec | 日志写入时间。单位为秒,精度是毫秒。 |
$http_ referer | 记录从哪个页面链接访问过来的 |
$http_ user_ agent | 记录客户端浏览器相关信息 |
$http_ x_ forwarded_ for | 记录客户端IP地址 |
$request_ length | 请求的长度(包括请求行, 请求头和请求正文)。 |
$request_ time | 请求花费的时间,单位为秒,精度毫秒 |
注:如果Nginx位于负载均衡器,nginx反向代理之后, web服务器无法直接获取到客户端真实的IP地址。
$remote_ addr获取的是反向代理的IP地址。 反向代理服务器在转发请求的http头信息中,增加http_x-forwarded- for信息,用来记录客户端IP地址和客户端请求的服务器地址。
- 虚拟主机:
可以在 /etc/nginx/conf.d/ 下写多个以.conf结尾的配置文件来定义虚拟主机。 - location模块: 使用location模块可以控制网站访问的路径,一个server模块可以有多个location,优先级如下:
匹配符 | 匹配规则 | 优先级 |
---|---|---|
= | 精确匹配 | 1 |
^~ | 某个字符开头,匹配到则停止搜索 | 2 |
~ | 区分大小写匹配 | 3 |
~* | 不区分大小写匹配 | 4 |
!~ | 区分大小写不匹配 | 5 |
!~* | 不区分大小写不匹配 | 6 |
/ | 通用匹配,任何请求都会匹配到 | 7 |
location中的反斜线/
:
#当访问www.nginx.com/test是,先找是否存在test目录,存在目录则找该目录下的index.html;如果没有该目录则找test文件
location /test {
root /usr/share/nginx/html;
index index.html index.htm;
}
#当访问www.nginx.com/test是,先找是否存在test目录,存在目录则找该目录下的index.html;如果没有直接停止
location /test/ {
root /usr/share/nginx/html;
index index.html index.htm;
}
相关参考:
Nginx官网