千家信息网

从头到尾掌握Nginx(一)

发表于:2024-11-26 作者:千家信息网编辑
千家信息网最后更新 2024年11月26日,1)Nginx服务概述Nginx由俄罗斯的lgor Sysoev开发,专为性能优化而开发,其最知名的优点就是它的稳定性和低系统资源消耗、以及对HTTP并发连接的高处立能力(单台物理服务器可支持3000
千家信息网最后更新 2024年11月26日从头到尾掌握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=0enabled=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_modulefastci模块,和动态应⽤相关的模块,例如PHP
ngx_http_proxy_moduleproxy代理模块
ngx_http_upstream_module负载均衡模块,可以实现⽹站的负载均衡功能及节点的健康检查
ngx_http_rewrite_moduleURL地址重写模块
ngx_http_limit_conn_module限制⽤户并发连接数及请求数模块
ngx_http_limit_req_module限制Nginx request processing rate根据定义的key
ngx_http_log_module访问⽇志模块,以指定的格式记录Nginx客户访问⽇志等信息
ngx_http_auth_basic_moduleWeb认证模块,设置Web⽤户通过账号密码访问Nginx
nginx_http_ssl_modulessl模块,⽤于加密的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.logSyntax: 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 requests16                  16                  19server表示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.0TCP不能复用
HTTP1.1顺序性TCP复用
HTTP2.0多路复用TCP复用
HTTP请求建立在一次TCP连接基础上;一次TCP请求至少产生一次HTTP请求;
1)Nginx连接限制
//Nginx连接限制语法Syntax:     limit_conn_zone key zone=name:size;Default:    -Context:    httpSyntax: 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-toolsab  -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:    httpSyntax: 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-toolsab  -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.html2.配置虚拟主机[root@nginx conf]#  cat conf.d/{www,bbs}.confserver  {                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.confserver  {                listen 80;                server_name www.nginx.com;}//别名配置[root@LNMP  ~]# vim /etc/nginx/nginx.confserver  {                listen  80;                server_name     www.nginx.com   nginx.com;                ...}//使⽤Linux下curl测试结果[root@LNMP  conf]#  curl    nginx.comwww.nginx.com[root@LNMP  conf]#  curl    www.nginx.comwww.nginx.com//访问带www和不带www是⼀样的, 除了别名实现也可以通过rewrite实现

--------本文到此结束,感谢阅读------------

0