从头到尾掌握Nginx(一)
1)Nginx服务概述
Nginx由俄罗斯的lgor Sysoev开发,专为性能优化而开发,其最知名的优点就是它的稳定性和低系统资源消耗、以及对HTTP并发连接的高处立能力(单台物理服务器可支持30000~50000个并发请求)。正因为如此,大量提供社交网络、新闻资讯、电子商务及虚拟主机等服务的企业纷纷选择Nginx来提供Web服务。
在河间等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站设计、成都网站设计 网站设计制作按需网站设计,公司网站建设,企业网站建设,品牌网站建设,营销型网站建设,外贸网站建设,河间网站建设费用合理。
搭建Web服务如果是为了解析静态网页、动态网页等、不需要太多的功能,那么Nginx绝对是首选。
2)安装Nginx
本次案例采用yum的方式进行安装,不过不使用epel源,因为这个nginx版本更新的太快了,导致epel根本赶不上Nginx的更新速度,所以我们采用官方的yum的yum源进行配置!
[root@nginx ~]# yum install -y gcc gcc- c++ autoconf pcre pcre-devel make automake wget httpd-tools vim tree
#由于是最小化安装的系统,所以安装一些必要的软件
[root@nginx ~]# vim /etc/yum.repos.d/nginx.repo
#配置nginx的yum源,Nginx官方也有相应的配置信息
[nginx]
name=nginx_repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
#该yum源默认情况下安装的是nginx最新的、稳定版
[root@nginx ~]# yum -y install nginx #安装nginx
[root@nginx ~]# nginx -v #查看nginx的版本
nginx version: nginx/1.16.1
3)Nginx安装目录
为了更清晰的了解 Nginx 软件的全貌,有必要介绍下 Nginx 安装后整体的⽬录结构及⽂件功能。
[root@nginx ~]# rpm -ql nginx
#查看与nginx相关的目录
下图对nginx的安装目录进行详细的解释!
4)Nginx的编译参数
[root@nginx ~]# nginx -V
#查看nginx的编译参数
下图展示了Nginx编译参数选项以及作用!
5)Nginx常用模块
Nginx模块分为 Nginx官⽅模块以及Nginx第三⽅模块!如图表:
Nginx编译选项 | 模块作用 |
---|---|
ngx_http_core_module | 包含⼀些核⼼的http参数配置,对应Nginx的配置区块部分 |
ngx_http_access_module | 访问控制模块,⽤来控制⽹站⽤户对Nginx的访问 |
ngx_http_gzip_module | 压缩模块,对Nginx返回的数据压缩,属于性能优化模块 |
ngx_http_fastcgi_module | fastci模块,和动态应⽤相关的模块,例如PHP |
ngx_http_proxy_module | proxy代理模块 |
ngx_http_upstream_module | 负载均衡模块,可以实现⽹站的负载均衡功能及节点的健康检查 |
ngx_http_rewrite_module | URL地址重写模块 |
ngx_http_limit_conn_module | 限制⽤户并发连接数及请求数模块 |
ngx_http_limit_req_module | 限制Nginx request processing rate根据定义的key |
ngx_http_log_module | 访问⽇志模块,以指定的格式记录Nginx客户访问⽇志等信息 |
ngx_http_auth_basic_module | Web认证模块,设置Web⽤户通过账号密码访问Nginx |
nginx_http_ssl_module | ssl模块,⽤于加密的http连接,如https |
6)Nginx内置变量
$uri:当前请求的URI,不带参数;
$request_uri:请求的URI,带完整参数;
$host:http请求报文中host首部,如果没有则以处理此请求的虚拟主机名称名代替;
$hostname:nginx服务运行在主机的主机名;
$remote_addr:客户端IP;
$remote_port:客户端端口;
$remote_user:使用用户认证时客户端用户输入的用户名;
$request_filename:用户请求中的URI经过本地root或alias转换后映射的本地文件路径;
$request_method:请求方法:GET、POST、PUT
$server_addr:服务器地址;
$server_name:服务器名称;
$server_port:服务器端口;
$server_protocol:服务器向客户端发送响应时的协议,如http/1.1 http/1.0;
$scheme:在请求中使用scheme,作用是截取http://xxxx.com中的http;
$http_HEADER:匹配请求报文中指定的HEADER;
$http_host:匹配请求报文中的host首部;
$document_root:当前请求映射到的root配置;
$http_user_agent:从http请求的头部信息中,获取客户端的访问设备;
$status:响应报文返回的状态码;
$body_bytes_sent:从服务端响应给客户端body信息大小;
$http_referer:http上一级页面,防盗链、用户行为;
$http_x_forwarded_for:http请求携带的http信息;
$time_local:nginx的时间;
7)Nginx的配置文件
Nginx主配置⽂件 /etc/nginx/nginx.conf 是⼀个纯⽂本类型的⽂件,整个配置⽂件是以区块的形式组织的。⼀般,每个区块以⼀对⼤括号 {} 来表示开始与结束。
//nginx默认配置语法
user //设置nginx服务的系统使⽤⽤户
worker_processes //⼯作进程, 配置和CPU个数保持⼀致
error_log //错误⽇志, 后⾯接⼊的是路径
pid //Nginx服务启动时的pid
//events事件模块
events { //事件模块
worker_connections //每个worker进程⽀持的最⼤连接数
use //内核模型,select,poll,epoll
}
//⾮虚拟主机的配置或公共配置定义在http{}段内, server{}段外
http {
...
//必须使⽤虚拟机配置站点, 每个虚拟机使⽤⼀个server{}段
'server' {
listen 80; //监听端⼝, 默认80
server_name localhost; //提供服务的域名或主机名
//控制⽹站访问路径
'location' / {
root /usr/share/nginx/html; //存放⽹站路径
index index.html index.htm; //默认访问⾸⻚⽂件
}
//指定错误代码, 统⼀定义错误⻚⾯, 错误代码重定向到新的Locaiton
error_page 500 502 503 504 /50x.html;
'location' = /50x.html {
root html;
}
}
...
//第⼆个虚拟主机配置
'server' {
...
}
}
8)Nginx日志配置
//配置语法: 包括: error.log access.log
Syntax: log_format name [escape=default|json] string ...;
Default: log_format combined "...";
Context: http
//Nginx默认配置
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
//Nginx⽇志变量
$remote_addr //表示客户端地址
$remote_user //http客户端请求nginx认证⽤户名
$time_local //Nginx的时间
$request //Request请求⾏, GET等⽅法、http协议版本
$status //respoence返回状态码
$body_bytes_sent //从服务端响应给客户端body信息⼤⼩
$http_referer //http上⼀级⻚⾯, 防盗链、⽤户⾏为分析
$http_user_agent //http头部信息, 客户端访问设备
$http_x_forwarded_for //http请求携带的http信息
9)Nginx状态监控
--with-http_stub_status_module 记录 Nginx 客户端基本访问状态信息!
具体配置如下:
location /mystatus {
stub_status on;
access_log off;
}
//Nginx_status概述
Active connections:2 //Nginx当前活跃连接数
server accepts handled requests
16 16 19
server表示Nginx处理接收握⼿总次数。
accepts表示Nginx处理接收总连接数。
请求丢失数=(握⼿数-连接数)可以看出,本次状态显示没有丢失请求。
handled requests,表示总共处理了19次请求。
Reading Nginx读取数据
Writing Nginx写的情况
Waiting Nginx开启keep-alive⻓连接情况下, 既没有读也没有写, 建⽴连接情况
10)Nginx下载站点
Nginx默认是不允许列出整个目录浏览下载的!
Syntax: autoindex on | off;
Default:
autoindex off;
Context: http, server, location
//autoindex常⽤参数
autoindex_exact_size off;
默认为on, 显示出⽂件的确切⼤⼩,单位是bytes。
修改为off,显示出⽂件的⼤概⼤⼩,单位是kB或者MB或者GB。
autoindex_localtime on;
默认为off,显示的⽂件时间为GMT时间。
修改为on, 显示的⽂件时间为⽂件的服务器时间。
charset utf-8,gbk;
默认中⽂⽬录乱码,添加上解决乱码。
配置目录浏览功能
//开启⽬录浏览
location /down {
root /usr/share/nginx/html;
autoindex on;
autoindex_localtime on;
autoindex_exact_size off;
}
11)Nginx访问限制
连接频率限制:limit_conn_module
请求频率限制:limit_req_module
http协议的连接与请求
HTTP是建⽴在TCP, 在完成HTTP请求需要先建⽴TCP三次握⼿(称为TCP连接),在连接的基础上在HTTP请求。
HTTP协议的连接与请求
HTTP协议版本 | 连接关系 |
---|---|
HTTP1.0 | TCP不能复用 |
HTTP1.1 | 顺序性TCP复用 |
HTTP2.0 | 多路复用TCP复用 |
HTTP请求建立在一次TCP连接基础上;
一次TCP请求至少产生一次HTTP请求;
1)Nginx连接限制
//Nginx连接限制语法
Syntax: limit_conn_zone key zone=name:size;
Default: —
Context: http
Syntax: limit_conn zone number;
Default: —
Context: http, server, location
//具体配置如下:
http {
//http段配置连接限制, 同⼀时刻只允许⼀个客户端IP连接
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
...
server {
...
location / {
//同⼀时刻只允许⼀个客户端IP连接
limit_conn conn_zone 1;
}
//压⼒测试
yum install -y httpd-tools
ab -n 50 -c 20 http://127.0.0.1/index.html
2)Nginx请求限制
//Nginx请求限制语法
Syntax: limit_req_zone key zone=name:size rate=rate;
Default: —
Context: http
Syntax: limit_conn zone number [burst=number] [nodelay];
Default: —
Context: http, server, location
//具体配置如下:
http {
//http段配置请求限制, rate限制速率,限制⼀秒钟最多⼀个IP请求
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
...
server {
...
location / {
//1r/s只接收⼀个请求,其余请求拒绝处理并返回错误码给客户端
limit_req zone=req_zone;
//请求超过1r/s,剩下的将被延迟处理,请求数超过burst定义的数量, 多余的请求返回503
#limit_req zone=req_zone burst=3 nodelay;
}
//压⼒测试
yum install -y httpd-tools
ab -n 50 -c 20 http://127.0.0.1/index.html
连接请求没有请求限制有效?
1)多个请求可以建⽴在⼀次的TCP连接之上, 那么我们对请求的精度限制,当然⽐对⼀个连接的限制会更加的有效;
2)因为同⼀时刻只允许⼀个连接请求进⼊;
3)但是同⼀时刻多个请求可以通过⼀个连接进⼊;
4)所以请求限制才是⽐较优的解决⽅案;
12)Nginx访问控制
基于IP的访问控制:http_access_module
基于⽤户登陆认证:http_auth_basic_module
1)基于IP的访问控制
//允许配置语法
Syntax: allow address | CIDR | unix: | all;
Default: -
Context: http, server, location, limit_except
//拒绝配置语法
Syntax: deny address | CIDR | unix: | all;
Default: -
Context: http, server, location, limit_except
//配置拒绝某⼀个IP, 其他全部允许
location ~ ^/1.html {
root /usr/share/nginx/html;
index index.html;
deny 192.168.10.1; #注意检查顺序是从上往下
allow all;
}
//只允许某⼀个⽹段访问,其它全部拒绝
location / {
root html;
index index.php index.html index.htm;
allow 192.168.10.0/24;
deny all;
}
http_access_module局限性:
下图是使⽤http_x_forwarded_for记录真实客户端IP地址以及代理服务器IP
解决方案:
1)采⽤HTTP头信息控制访问, 代理以及web服务开启 http_x_forwarded_for;
2)结合geo模块;
3)通过HTTP⾃动以变量传递;
2)基于用户登录认证
//配置语法
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
//需要安装依赖组件
[root@nginx ~]# yum install httpd-tools
[root@nginx ~]# htpasswd -c /etc/nginx/auth_conf zhangsan #新创建的用户
[root@nginx ~]# htpasswd -b /etc/nginx/auth_conf lisi 123456 #增加用户需使用-b选项并指定密码
//可在http,server,location下添加如下信息
auth_basic "请输入用户名及密码!";
auth_basic_user_file /etc/nginx/auth_conf;
用户认证局限性:
1)用户信息依赖文件方式;
2)用户管理文件过多,无法联动;
3)操作管理机械,效率低下;
解决方法:
1)Nginx结合LUA实现高效认证;
2)Nginx结合nginx-auth-ldap模块;
13)Nginx虚拟主机
所谓虚拟主机,在web服务器⾥是⼀个独⽴的⽹站站点,这个站点对应独⽴的域名(也可能是IP或端⼝),具有独⽴的程序及资源⽬录,可以独⽴地对外提供服务供⽤户访问。
1)配置基于域名的虚拟主机
1.创建web站点⽬录
[root@nginx conf]# mkdir /soft/code/{www,bbs}
[root@nginx conf]# echo "www" > /soft/code/www/index.html
[root@nginx conf]# echo "bbs" > /soft/code/bbs/index.html
2.配置虚拟主机
[root@nginx conf]# cat conf.d/{www,bbs}.conf
server {
listen 80;
server_name www.nginx.com;
root /soft/code/www;
...
}
server {
...
listen 80;
server_name bbs.nginx.com;
root /soft/code/bbs;
}
2)配置不同端⼝访问不同虚拟主机
//仅修改listen监听端⼝即可, 但不能和系统端⼝发⽣冲突
server {
...
listen 8001;
...
}
server {
...
listen 8002;
...
}
3)配置虚拟主机别名
所谓虚拟主机别名,就是虚拟主机设置除了主域名以外的⼀个域名,实现⽤户访问的多个域名对应同⼀个虚拟主机⽹站的功能。
以www.nginx.com 域名的虚拟主机为例:为其增加⼀个别名nginx.com时,出现⽹站内容和访问www.nginxi.com 是⼀样的,具体配置如下:
//默认配置
[root@nginx ~]# vim /etc/nginx/nginx.conf
server {
listen 80;
server_name www.nginx.com;
}
//别名配置
[root@LNMP ~]# vim /etc/nginx/nginx.conf
server {
listen 80;
server_name www.nginx.com nginx.com;
...
}
//使⽤Linux下curl测试结果
[root@LNMP conf]# curl nginx.com
www.nginx.com
[root@LNMP conf]# curl www.nginx.com
www.nginx.com
//访问带www和不带www是⼀样的, 除了别名实现也可以通过rewrite实现
————————本文到此结束,感谢阅读————————————
文章名称:从头到尾掌握Nginx(一)
标题来源:http://azwzsj.com/article/ijjped.html