1、Nginx Web 入门简介

Nginx是一个高性能HTTP、反向代理、IMAP、POP3、SMTP服务器

Nginx特点:高性能、轻量级、占有内存少、并发能力强

Nginx相对于Apache优点如下:

  • 高并发相应性能非常好,官方nginx处理静态文件并发5w/s
  • 负载均衡及反向代理性能非常强
  • 系统内存和cpu占用率低
  • 可对后端服务进行健康检查
  • 支持PHP CGI 方式和 FastCGI 方式
  • 可以作为缓存服务器、邮件代理服务器
  • 配置代码简洁且容易上手

2、Nginx工作原理

nginx web 服务器主要是有各种模块协同工作,从结构上分为核心模块、基础模块、第三方模块


核心模块:http模块、event模块和mail模块

基础模块:http access模块、http fastcgi模块、http proxy模块和http rewrite模块

第三方模块:http upstream request hash模块、notice模块和http access key 模块、limit\_req模块等

从功能上分为三类:

handlers(处理模块):直接处理请求,并进行输出内容和修改headers信息等操作,handlers处理器模块一般只有一个

files(过滤器模块):主要对其他处理器模块输出的内容进行修改操作,最后由nginx输出、

proxies(代理模块):是nginx的http upstream之类模块,这些模块主要与后端一些服务比如fastcgi等进行交互,实现服务代理和负载均衡

Nginx的高并发得益于采用的epoll模型

Apache采用的select模型

select模型的特点: 当用户发起一次请求,select模型会进行一次遍历扫描,因此效率低下

epoll模型的特点:当用户发起请求,epoll模型会直接进行处理,效率高,并无连接限制

3、nginx应用场景

静态服务:浏览器缓存 ,防资源

html|jpg|png......

代理服务:

正向代理:内访外

反向代理:外访内,和负载均衡是一样,但是工作方式有区别

负载均衡:

安全服务:

访问控制:

基于IP的

基于身份认证

访问限制

WAF

云waf

硬件waf

DDOS攻击

CC攻击

SQL注入

。。。

nginx+lua

架构

LNMP

Linux Nginx Mysql Php

LNMT

Linux Nginx Mysql Tomcat

4、Nginx安装

1)EPEL源

版本低,功能少

2)官方源

官方编译好,封装rpm包,并提供yum源,推荐

3)源代码

自己下载源代码,使用configure/make/make install

安装复杂费时,升级麻烦

1、配置nginx官方yum库,安装官方nginx

[root@localhost ]# vim /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 nginx,安装最新的版本的nginx

yum --showduplicates list nginx | expand

  
  
  
![Nginx  Web服务器教程](https://www.icode9.com/i/l/?n=20&i=blog/1328126/202012/1328126-20201223191334414-1913353462.png)

  
  
  
  
  
  
  
  
  
  
 选择对应的版本进行安装

  
  
  
  
  
例如选择版本是1.6.0的,

  
  
  
  
  

[root@localhost yum.repos.d]# yum install nginx-1.16.0


  
  
  
 安装完成后,检验安装版本

  
  
  
  
  

[root@localhost yum.repos.d]# nginx -v
nginx version: nginx/1.16.0


  
  
  
  
  
  
  
  
2、\[root@localhost yum.repos.d\]# rpm -ql nginx

  
  
  
  
  
Nginx主配置文件

  
  
  
  
  
 /etc/nginx

  
  
  
  
  
 /etc/nginx/nginx.conf  
 /etc/nginx/conf.d  
 /etc/nginx/conf.d/default.conf

  
  
  
  
  
Cgi、Fastcgi、Uwcgi配置文件

  
  
  
  
  
 /etc/nginx/fastcgi\_params

  
  
  
  
  
 /etc/nginx/scgi\_params

  
  
  
  
  
 /etc/nginx/uwsgi\_params

  
  
  
  
  
Nginx编码转换映射文件

  
  
  
  
  
 /etc/nginx/koi-utf

  
  
  
  
  
 /etc/nginx/win-utf  
 /etc/nginx/koi-win

  
  
  
  
  
http协议的Content-Type与扩展名  
 /etc/nginx/mime.types  
配置系统守护进程管理器  
 /usr/lib/systemd/system/nginx.service

  
  
  
  
  
Nginx日志轮询,日志切割

  
  
  
  
  
 /etc/logrotate.d/nginx

  
  
  
  
  
Nginx终端管理命令

  
  
  
  
  
 /usr/sbin/nginx  
 /usr/sbin/nginx-debug

  
  
  
  
  
Nginx模块命令

  
  
  
  
  
 /etc/nginx/modules

  
  
  
  
  
 /usr/lib64/nginx  
 /usr/lib64/nginx/modules

  
  
  
  
  
Nginx默认站点目录

  
  
  
  
  
 /usr/share/nginx  
 /usr/share/nginx/html  
 /usr/share/nginx/html/50x.html  
 /usr/share/nginx/html/index.html

  
  
  
  
  
Nginx的帮助手册

  
  
  
  
  
 /usr/share/doc/nginx-1.16.0  
 /usr/share/doc/nginx-1.16.0/COPYRIGHT  
 /usr/share/man/man8/nginx.8.gz

  
  
  
  
  
  
  
  
  
  
Nginx的缓存目录

  
  
  
  
  
 /var/cache/nginx

  
  
  
  
  
Nginx的日志目录

  
  
  
  
  
 /var/log/nginx

  
  
  
  
  
3、官方源nginx带的编译选项

  
  
  
  
  

[root@localhost yum.repos.d]# nginx -V
nginx version: nginx/1.16.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx

            --sbin-path=/usr/sbin/nginx

            --modules-path=/usr/lib64/nginx/modules

            --conf-path=/etc/nginx/nginx.conf

            --error-log-path=/var/log/nginx/error.log

            --http-log-path=/var/log/nginx/access.log

            --pid-path=/var/run/nginx.pid

            --lock-path=/var/run/nginx.lock                       #程序安装目录合路径



            --http-client-body-temp-path=/var/cache/nginx/client_temp

            --http-proxy-temp-path=/var/cache/nginx/proxy_temp

            --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp

            --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp

            --http-scgi-temp-path=/var/cache/nginx/scgi_temp             #临时缓存文件



            --user=nginx

            --group=nginx                                  #设置Nginx进程启动用户和组



            --with-compat

            --with-file-aio

            --with-threads

            --with-http_addition_module

            --with-http_auth_request_module

            --with-http_dav_module

            --with-http_flv_module

            --with-http_gunzip_module

            --with-http_gzip_static_module

            --with-http_mp4_module

            --with-http_random_index_module

            --with-http_realip_module

            --with-http_secure_link_module

            --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module

            --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC'     #设置额外的参数将被添加到CFLAGS变量

            --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'                                                                                #设置附加的参数,链接系统库


  
  
  
如果企业之前的Nginx都是通过源码安装,只需要通过nginx -V查看编译选项,部署新的服务器,获得版本号,configure选项

  
  
  
  
  
  
5、Nginx配置文件
-----------

  
  
  
  
  
Nginx主配置文件 /etc/nginx/nginx.conf 是一个纯文本类型的文件,整个配置文件是以区块的形式组织的,一般,每个区块以一对大括号{}来表示开始与结束。

  
  
  
  
  
 1、CoreModule 核心模块 全局模块

  
  
  
  
  
 2、EventModule 事件驱动模块

  
  
  
  
  
 3、HttpCoreModule http内核模块 局部模块

  
  
  
  
  
  
  
  
  
  
 需了解扩展项

  
  
  
  
  
 CoreModule层下可以有Event、http

  
  
  
  
  
 http模块层允许有多个Server层,Server主要用于配置多个网站

  
  
  
  
  
 Server层又允许有多个Location,Location主要用于定义网站访问路径#CoreModule核心模块:

  
  
  
  
  



user nginx;                      #Nginx进程所使用的用户


worker_processes 1;                 #Nginx运行的work进程数量(建议与cpu数量一致或auto)

error_log /var/log/nginx/error.log warn;     #Nginx错误日志存放路径
pid /var/run/nginx.pid;           #Nginx服务运行后产生的pid进程号

Event模块

events {

worker_connections  1024;            #每个worker进程支持的最大连接数<br></br>  use  epool;                    #事件驱动模型,epool默认,<br></br>

}

http内核模块

#公共的配置定义在http{}

http {

include       /etc/nginx/mime.types;
default_type  application/octet-stream;

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;
#tcp_nopush     on;

keepalive_timeout  65;

#gzip  on;<br></br>  #使用server配置网站,每个server{}代表一个网站(简称虚拟主机)<br></br>  server {<br></br>    listen 80;              #监听端口,默认80<br></br>    server_name localhost;       #提供服务的域名或主机名<br></br>    access_log host.access.log;    #访问日志<br></br>    #控制网站访问路径<br></br>    location / {<br></br>      root /usr/share/nginx/html;  #存放网站代码路径<br></br>      index index.php index.html index.htm; #服务器返回的默认页面文件<br></br>    }<br></br>  #指定错误代码,统一定义错误页面,错误代码重定向到新的location<br></br>    error_page  500 502 503 504 /50x.html<br></br><br></br>   }

  

include /etc/nginx/conf.d/*.conf;

}


  
  
  
  
  
  
  
  
  
### 6、Nginx配置网站

  
  
  
  
  
1、在/etc/nginx/conf.d/下新建配置文件,要求一定是.conf结尾,然后将默认文件关闭

  
  
  
  
  

[root@localhost ]# cd /etc/nginx/conf.d/
[root@localhost conf.d]# mv default.conf default.conf.bak
[root@localhost conf.d]# vim game.conf
server {

listen 80;
server_name game.com;

location / {
    root /home/wwwroot/gms;
    index index.php;

} 

}


  
  
  
配置完,进行语法测试

  
  
  
  
  

[root@localhost conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful


  
  
  
2、获取网页代码

  
  
  
  
  

[root@localhost ~]# cd /home
[root@localhost home]# mkdir wwwroot/ -p


  
  
  
 将后台代码上传职wwwroot下

  
  
  
  
  
3、启动或重载nginx

  
  
  
  
  
systemctl restart nginx / systemctl reload nginx

  
  
  
  
  
4、通过域名访问,要修改windows的本地hosts文件

  
  
  
  
  
C:\\Windows\\System32\\drivers\\etc

  
  
  
  
  
gmsip 域名

  
  
  
  
  
  
  
  
  
  
有可能出现的错误:

  
  
  
  
  
1)解析问题

  
  
  
  
  
2)nginx无法启动

  
  
  
  
  
 端口是否被占用

  
  
  
  
  
 配置文件写错

  
  
  
  
  
3)重载失败

  
  
  
  
  
 配置文件写错了

  
  
  
  
  
 一定检测nginx -t

  
  
  
  
  
4)日志

  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
### 6、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;

  
  
  
  
  
默认中文目录乱码,添加上解决乱码

  
  
  
  
  
例如:

  
  
  
  
  
1、当我们访问game.com时,打开首页

  
  
  
  
  
2、当我们访问game.com/gms时,会打开目录索引列表

  
  
  
  
  
在conf.d下修改ame.conf

  
  
  
  
  

server {

    listen 80;
    server_name game.com;

    location / {                            #访问http://game.com时,跳转导服务器/gms_sz下,寻找index.html
            root /home/wwwroot/gms_sz;    
            index index.php index.html;            

    }
    location /gms {                          #访问http://game.com/gms时,跳转到wwwroot/gms下,开启目录索引防止中文乱码,使用文件自己的时间戳,文件大小以单位的方式显示
            root /home/wwwroot;
           # index index.php index.html;
            #autoindex on;
            charset utf-8;
    }

}


  
  
  
  
###  7、Nginx状态监控

  
  
  
  
  
1、ngx\_http\_stub\_status\_module 用于展示Nginx连接状态信息,需要 --with-http\_stub\_status\_module模块支持

  
  
  
  
  
语法:

  
  
  
  
  
 Syntax:**stub\_status**;

  
  
  
  
  
 Default:—

  
  
  
  
  
 Context:`server`, `location`

  
  
  
  
  
2、配置Nginx status

  
  
  
  
  
 location /nginx\_status {

  
  
  
  
  
 stub\_status;

  
  
  
  
  
 access\_log off; #关闭访问日志

  
  
  
  
  
 }

  
  
  
  
  
3、当使用浏览器访问http://ip/nginx\_status

  
  
  
  
  

Active connections: 2
server accepts handled requests
34 34 66
Reading: 0 Writing: 1 Waiting: 1

Active connections #当前活动连接数

accepts 34       #当前的总连接数TCP

handled 34       #成功的连接数TCP  

requests 64       #总的http请求数 





Reading          #请求

Writing          #响应

Waiting          #等待的请求,开启了keepalive



#注意,一次Tcp的连接数,可以发起多次http的请求,如下配置参数可验证

keepalive_timeout 0;  #类似于关闭长连接

keepalive_timeout 65; #65 s没有活动则断开连接



注意:

如果使用restart重置服务器,会清空所有的连接数

reload重载服务器,不会清空之前的连接数

通过状态监控,可以区分长连接和短链接

修改vim /etc/nginx/nginx.conf下

keepalive_timeout 0;  #将长连接变为短链接



8、Nginx访问控制

 
 基于ip的访问控制 http_access_module

1、Nginx基于IP的访问控制

    //允许配置语法

    Syntax:allow `
address
 | 
CIDR
 | 
unix:
 | 
all
;<br></br>    Default:-<br></br>    Context:  
http

server

location

limit_except

    //拒绝配置语法<br></br>    Syntax:<strong>deny</strong> ```
<em>address</em>
``` | ```
<em>CIDR</em>
``` | ```
unix:
``` | ```
all
```;<br></br>    Default:—<br></br>    Context:```
http
```, ```
server
```, ```
location
```, ```
limit_except

访问控制规则查看流程:

从上往下,依次匹配,满足就停止



企业中反问控制的思路:

先写允许,默认拒绝所有

先写拒绝,默认允许所有

例:

Nginx Web服务器教程

只允许allow ip 访问nginx\_status,其它都拒绝访问

2、基于用户登录认证  http_auth_basic_module<br></br><br></br>  //配置语法:<br></br>  Syntax:<strong>auth_basic</strong> ```
<em>string</em>
``` | ```
off
```;<br></br>  Default:auth_basic off;<br></br>  Context:```
http
```, ```
server
```, ```
location
```, ```
limit_except<br></br>  //用户密码记录配置文件<br></br>  Syntax: <strong>auth_basic_user_file</strong> `<em>file</em>`;<br></br>  Default: —<br></br>  Context: `http`, `server`, `location`, `limit_except<br></br><br></br><br></br>  //需要安装依赖组件`<br></br>
[root@localhost nginx]# yum install httpd-tools

[root@localhost nginx]# htpasswd -b -c /etc/nginx/.auth.conf cm 123456

vim /etc/nginx/conf.d/game.conf

        location /gms {
                root /home/wwwroot;
                index index.php index.html;
                #autoindex on;
                charset utf-8;
                auth_basic "don't test!!!";
                auth_basic_user_file /etc/nginx/.auth.conf;  #和htpasswd -b -c /etc/nginx/.auth.conf cm 123456对应
        }

然后重载nginx测试:

<img alt="Nginx  Web服务器教程" src="https://www.icode9.com/i/l/?n=20&i=blog/1328126/202101/1328126-20210105201400123-330931343.png"></img>

9、Nginx访问限制<br></br>

经常会遇到这种情况,服务器流量异常,负载过大等等,对于大流量恶意的攻击访问,会带来带宽的浪费,服务器压力,影响业务,往往考虑对同一个IP的连接数,并发数进行限制<br></br><br></br>ngx_http_limit_conn_module 模块可以根据定义的key来限制每个键值的连接数,如同一个IP来源的连接数。<br></br>limit_conn_module 连接频率限制<br></br>limit_req_module  请求频率限制<br></br><strong><br></br><br></br></strong>
变量:<br></br>$binary_remote_addr  变量的长度是固定的4字节<br></br>$remote_addr      变量长度是7-15字节<br></br>
<strong><br></br>1、Nginx连接限制配置<br></br></strong>1)Nginx连接限制语法<br></br>Syntax:<strong>limit_conn_zone</strong> ```
<em>key</em>
``` ```
zone
```=```
<em>name</em>
```:```
<em>size</em>
```;<br></br>Default:—<br></br>Context:http<br></br><br></br>Syntax:<strong>limit_conn</strong> ```
<em>zone</em>
``` ```
<em>number</em>
```;<br></br>Default:—<br></br>Context:```
http
```, ```
server
```, ```
location<br></br><br></br>
```<br></br>2)Nginx连接限制实战<br></br><br></br>  http {<br></br>  //http段配置连接限制,同一时刻只允许一个客户端IP连接<br></br>  <strong>limit_conn_zone</strong> $binary_remote_addr ```
zone

  }

3)使用ab工具进行压力测试

  //压力测试

  yum install -y httpd-tools

  ab -n 50 -c 20 http://127.0.0.1/index.html

2、Nginx请求限制配置实站



ngx_http_limit_req_module

1)Nginx请求限制语法


  
  
  
![Nginx  Web服务器教程](https://www.icode9.com/i/l/?n=20&i=blog/1328126/202101/1328126-20210107164106223-1820006352.png)

  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
 ![Nginx  Web服务器教程](https://www.icode9.com/i/l/?n=20&i=blog/1328126/202101/1328126-20210107164133756-1448543593.png)

  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
 2)Nginx请求限制实战

  
  
  
  
  

  http {

  //http段配置请求限制,rate限制速率,限制一秒钟最多一个IP请求

  limit_req_zone `
$binary_remote_addr 

zone
```=req_zone:10m ```
rate
```=1r/s;
```

  
  
  
```
<em>    ...<br></br>    server {<br></br>    ...<br></br>      location / {<br></br>      // </em>1r/s只接收一个请求,其余请求拒绝处理并返回错误码给客户端<em><br></br>        limit_req zone=</em>req_zone<em id="__mceDel">;<br></br>      //</em>请求超过1r/s,剩下的将被延迟处理,请求数超过burst定义的数量,多余的请求返回503<em id="__mceDel">  <br></br>        #</em>limit_req zone=req_zone burst=3 nodelay;<em id="__mceDel"><br></br></em>
```

  
  
  
```
<em id="__mceDel"><em id="__mceDel">      }<br></br><br></br>    }</em></em>
```

  
  
  
```
  }
```

  
  
  
```
3)使用ab工具进行压力测试<br></br>  //压力测试<br></br>  yum install -y httpd-tools<br></br>  ab -n 50 -c 20 http://127.0.0.1/index.html<br></br><strong>3、Nginx连接限制没有请求限制有效<br></br></strong>多个请求可以建立在一次的TCP连接之上,那么我们对请求的精度限制,当然比对一个连接限制会更加的有效<br></br>因为同一时刻只允许一个连接请求进入,但是同一时刻多个请求可以通过一个连接进入,所以请求限制才是比较优的解决方案<br></br><br></br><br></br>
```

  
  
  
```
<br></br>  
```

  
  
  
```
 

标签: nginx, conf, Nginx, 服务器, etc, http, Web

相关文章推荐

添加新评论,含*的栏目为必填