Nginx从入门到精通

目录

一.Nginx简介

1.Nginx的模块

2.正向代理与反向代理

3.Nginx的作用

二.Nginx的安装

1.安装方式

2.编译安装步骤

三.Nginx的常用命令

1.启动

2.停止

3.退出

4.关闭

5.重新加载

6.查看nginx版本

四.Nginx配置文件

1.nginx.conf简介

2.配置文件解构

五.Nginx负载均衡

1.轮询

2.加权轮询

3.ip_hash

4.least_conn

六.Nginx之server(主机)配置

1.相同的ip配置不通的域名,模仿多个物理机

2.通配符实现

3.默认主机配置

七.Nginx之location配置

1.location的语法

2.常用的修饰符说明

 3.前缀匹配

4.通用匹配

5.精确匹配

6.精确前缀匹配

7.正则表达式匹配(区分大小写)

7.正则表达式匹配(不区分大小写)

8.完整例子

9.实际使用建议

八.Nginx常用案例

1.代理静态文件

2.反向代理

3.跨域配置

4.防盗链


一.Nginx简介

1.Nginx的模块

        高度模块化的设计是 Nginx 的架构基础,Nginx 服务器被分解为多个模块,每个模块就是一个功能模块,只负责自身的功能,模块之间严格遵循“高内聚,低耦合”的原则。

核心模块
    核心模块是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录、配置文件解析、事件驱动机制、进程管理等核心功能。
标准 HTTP 模块
    标准 HTTP 模块提供 HTTP 协议解析相关的功能,如:端口配置、网页编码设置、HTTP 响应头设置等。
可选 HTTP 模块
    可选 HTTP 模块主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,如:Flash 多媒体传输、解析 GeoIP 请求、SSL 支持等。
邮件服务模块
    邮件服务模块主要用于支持 Nginx 的邮件服务,包括对 POP3 协议、IMAP 协议和 SMTP 协议的支持。
第三方模块
    第三方模块是为了扩展 Nginx 服务器应用,完成开发者自定义功能,如:Json 支持、Lua 支持等。

2.正向代理与反向代理

正向代理最大的特点是客户端非常明确要访问的服务器地址,隐藏了真实客户端信息。正向代理,"它代理的是客户端,代客户端发出请求"。
反向代理最大的特点是服务端非常明确请求来自于那个客户端,隐藏了真实服务端信息。反向代理,"它代理的是服务端,代服务端接收请求"。

3.Nginx的作用

(1)正向代理:服务器代理客户端,在客户端配置代理服务器,通过代理服务器进行互联网访问
(2)反向代理:服务器代理服务器,客户端发送请求到代理服务器,由反向代理服务器获取数据返回给客户端,此时反向代理服务器和目标服务器带外就是一个服务器,暴露的是代理服务器的地址,隐藏了真实服务器的IP地址
(3)负载均衡:单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上
(4)动静分离:为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。

二.Nginx的安装

1.安装方式

(1)yum安装,简单易用

(2)编译安装,需要使用第三方模块时需要使用编译安装(推荐使用此方式安装)

(3)docker安装

2.编译安装步骤

1.安装make

yum -y install autoconf automake make

2.安装g++

yum -y install gcc gcc-c++

3.安装nginx依赖库

yum -y install pcre pcre-devel    
yum -y install zlib zlib-devel
yum -y install openssl openssl-devel

4.下载nginx

wget http://nginx.org/download/nginx-1.21.1.tar.gz

5.解压

tar -zxvf nginx-1.19.1.tar.gz

目录结构如下

6.编辑安装

进入到nginx目录下

如果我们不需要指定安装其他模块的话,我们默认只需要执行–prefix就可以了。如果我们需要安装其他模块就需要在编译的时候执行–with 也就是说你需要安装的这个模块默认是没有安装进nginx的,如果我们不需要某些模块这个时候我们就需要执行–without,也就是说without后面跟着的模块默认是安装进nginx的。

./configure  --prefix=/usr/local/nginx
make && make install

参数解释

–prefix指定安装目录
–with-http_ssl_module安装https模块
creating objs/Makefile 代表编译成功
make编译
make install安装

7.配置环境变量 

vi /etc/profile

在最后一行加上

PATH=$PATH:/usr/local/nginx/sbin
export PATH

 生效环境变量

source /etc/profile

8.关闭 防火墙

systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld

三.Nginx的常用命令

1.启动

nginx
# 如果执行配置文件
nginx -c nginx.conf #如果不指定,默认为NGINX_HOME/conf/nginx.conf

2.停止

nginx -s stop

3.退出

nginx -s quit

4.关闭

# 查看nginx进程号
ps -aux | grep nginx

# 杀掉进程
kill -9 nginx

5.重新加载

nginx -s reload

6.查看nginx版本

nginx -v

四.Nginx配置文件

1.nginx.conf简介

        Nginx配置文件一般位于Nginx安装目录下的conf目录下,整个文件以block形式组合而成,每一个block都使用"{}"大括号来表示,block中可以嵌套其他block层级。其中main层是最高层次。

2.配置文件解构

Nginx配置文件主要有4部分,main(全局设置)、server(主机设置)、upstream(上游服务器设置,主要为反向代理,负载均衡相关配置)和location(url匹配特定位置的设置),每部分包含若干指令。
(1)Main:影响其他所有部分的设置;
(2)Server:主要用于指定虚拟机主机域名,ip和端口;
(3)Upstream:设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡;
(4)Location:用于匹配网页位置(如,跟目录“/”,”/images”等)。
它们之间的关系是,server继承main,location继承server,upstream既不会继承指令也不会被继承。

 3.配置文件样例详解

########### 每个指令必须有分号结束。#################
#user administrator administrators;  #配置用户或者组,默认为nobody nobody。
#worker_processes 2;  #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大连接数,默认为512
}
http {
    include       mime.types;   #文件扩展名与文件类型映射表
    default_type  application/octet-stream; #默认文件类型,默认为text/plain
    #access_log off; #取消服务日志    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
    access_log log/access.log myFormat;  #combined为日志格式的默认值
    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #热备
    }
    error_page 404 https://www.baidu.com; #错误页
    server {
        keepalive_requests 120; #单连接请求上限次数。
        listen       4545;   #监听端口
        server_name  127.0.0.1;   #监听地址       
        location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           #root path;  #根目录
           #index vv.txt;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip           
        } 
    }
}

五.Nginx负载均衡

1.轮询

upstream dynamicserver {
  server 192.168.64.1:9001; #tomcat 1
  server 192.168.64.1:9002; #tomcat 2
  server 192.168.64.1:9003; #tomcat 3
  server 192.168.64.1:9004; #tomcat 4
}

在轮询中,如果服务器down掉了,会自动剔除该服务器。缺省配置就是轮询策略。此策略适合服务器配置相当,无状态且短平快的服务使用。

2.加权轮询

#动态服务器组
upstream dynamicserver {
  server 192.168.64.1:9001  weight=2;               #tomcat 1
  server 192.168.64.1:9002;                         #tomcat 2
  server 192.168.64.1:9003;                         #tomcat 3
  server 192.168.64.1:9004;                         #tomcat 4
}

weight参数用于指定轮询几率,weight的默认值为1,;weight的数值与访问比率成正比,比如Tomcat 1被访问的几率为其他服务器的两倍。

权重越高分配到需要处理的请求越多。
此策略可以与least_conn和ip_hash结合使用。
此策略比较适合服务器的硬件配置差别比较大的情况。

3.ip_hash

upstream dynamicserver {
  ip_hash;  #保证每个访客固定访问一个后端服务器
  server 192.168.64.1:9001  weight=2;                   #tomcat 1
  server 192.168.64.1:9002;                             #tomcat 2
  server 192.168.64.1:9003;                         #tomcat 3
  server 192.168.64.1:9004; #tomcat 4
}

在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)。
ip_hash不能与backup同时使用
此策略适合有状态服务,比如session。
当有服务器需要剔除,必须手动down掉。

4.least_conn

upstream dynamicserver {
  least_conn;  #把请求转发给连接数较少的后端服务器
  server 192.168.64.1:9001  weight=2;                   #tomcat 1
  server 192.168.64.1:9002;                             #tomcat 2
  server 192.168.64.1:9003;                         #tomcat 3
  server 192.168.64.1:9004; #tomcat 4
}

此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。

六.Nginx之server(主机)配置

1.相同的ip配置不通的域名,模仿多个物理机

(1)修改配置文件如下

server {
        listen       80;
        charset utf-8;
        server_name  www.abc.com;

        location /{
            alias '/root/www/nginx/abc/';
            index  index.html index.htm;
            expires  7d;
        }
}

server {
        listen       80 ;
        charset utf-8;
        server_name  www.bbs.com;


        location /{
            alias '/root/www/nginx/bbs/';
            index  index.html index.htm;
            expires  7d;
        }
}

(2)修改/etc/hosts文件

192.168.64.150 www.abc.com
192.168.64.150 www.bbs.com

(3)访问测试

        我们发现访问不同的域名访问的地址是不一样的这样就像是有多个物理机一样

2.通配符实现

server {
        listen       80;
        charset utf-8;
        server_name  *.com;


        location /{
        default_type text/html;
         echo "通配符在前";
        }
}

server {
        listen       80;
        charset utf-8;
        server_name  www.abc.*;


        location /{
        default_type text/html;
         echo "通配符在后";
        }
}

3.默认主机配置

server {
    # 将域名bbs.com 设置为默认虚拟主机
        listen       80 default;
        charset utf-8;
        server_name  www.bbs.com;


        location /{
            alias '/root/www/nginx/bbs/';
            index  index.html index.htm;
            expires  7d; 
        }
}

使用未配置的域名或者IP地址访问,我们发现如果访问一个没有配置的虚拟主机就会跳到www.bbs.com的页面。

七.Nginx之location配置

1.location的语法

location [修饰符] pattern {…}

2.常用的修饰符说明

 3.前缀匹配

没有修饰符表示必须以指定模式开始,指定模式前面没有任何修饰符,直接在location后写需要匹配的uri,它的优先级次于正则匹配

server {
    listen       80;
    server_name www.tangbb.com;
    location /abc {
        default_type text/html;
        echo "abc...";
    }
}

那么如下内容可以就可以正确匹配:
www.tangbb.com/abc
www.tangbb.com/abc/other
www.tangbb.com/abc?.…

4.通用匹配

通用匹配使用一个 / 表示,可以匹配所有请求,一般nginx配置文件最后都会有一个通用匹配规则,当其他匹配规则均失效时,请求会被路由给通用匹配规则处理;如果没有配置通用匹配,并且其他所有匹配规则均失效时,nginx会返回 404 错误

server {
    listen       80;
    server_name www.tangbb.com;
    location /{
        default_type text/html;
        echo "abc...";
    }
}

5.精确匹配

精确匹配使用 = 表示,nginx进行路由匹配的时候,精确匹配具有最高的优先级,请求一旦精确匹配成功nginx会停止搜索其他到匹配项

server {
    listen       80;
    server_name www.tangbb.com;
    location = /abc {
        default_type text/html;
        echo "abc...";
    }
}

如下内容可正确匹配:
www.tangbb.com/abc
www.tangbb.com/abc?.…


如下内容则无法匹配:
www.tangbb.com/abc/
www.tangbb.com/abc/adcde

6.精确前缀匹配

精确前缀匹配的优先级仅次于精确匹配,nginx对一个请求精确前缀匹配成功后,停止继续搜索其他到匹配项

server {
    listen       80;
    server_name www.tangbb.com;
    location ^~ /abc {
        default_type text/html;
        echo "abc...";
    }
}

那么如下内容可以就可以正确匹配:

www.tangbb.com/abc
www.tangbb.com/abc/other
www.tangbb.com/abc?.…

7.正则表达式匹配(区分大小写)

正则匹配区分大小写用 表示;一个请求精确匹配和精确前缀匹配都失败后,如果配置有相关的正则匹配location,nginx会尝试对该请求进行正则匹配。需要说明的是正则匹配之间没有优先级一说,而是按照在配置文件中出现的顺序进行匹配,一旦匹配上一个,就会停止向下继续搜索。

server {
    server_name www.tangbb.com;
    location ~ ^/abc$ {
          default_type text/html;
          echo "abc-regular-x";
    }
}

那么如下内容可以正确匹配:
www.tangbb.com/abc
www.tangbb.com/abc?.…
如下内容则无法匹配:
www.tangbb.com/abc/
www.tangbb.com/ABC
www.tangbb.com/abcde

7.正则表达式匹配(不区分大小写)

正则匹配区分大小写用 ~* 表示。

server {
    server_name www.tangbb.com;
    location ~* ^/abc$ {
          default_type text/html;
          echo "abc-regular-x";
    }
}

那么如下内容就可以正确匹配:
www.tangbb.com/abc
www.tangbb.com/abc?.…
www.tangbb.com/ABC
如下内容则无法匹配:
www.tangbb.com/abc/
www.tangbb.com/abcde

8.完整例子

server {
        server_name www.tangbb.com;
        default_type text/html;
        charset   utf-8;
        location = / {
          echo "规则A";
        }
        location = /login {
            echo "规则B";
        }
        location ^~ /static/ {
            echo "规则C";
        }
        location ^~ /static/files {
            echo "规则X";
        }
        location ~ \.(gif|jpg|png|js|css)$ {
            echo "规则D";
        }
        location ~* \.js$ {
            echo "规则E";
        }
        location /img {
            echo "规则Y";
        }
        location / {
           echo "规则F";
        }
}

请求uri    匹配路由规则
http://www.tangbb.com/    规则A
http://www.tangbb.com/login    规则B
http://www.tangbb.com/register    规则F
http://www.tangbb.com/static/a.html    规则C
http://www.tangbb.com/static/files/a.txt    规则X
http://www.tangbb.com/a.png    规则D
http://www.tangbb.com/a.PNG    规则F
http://www.tangbb.com/img/a.gif    规则D
http://www.tangbb.com/img/a.tiff    规则Y

9.实际使用建议

#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
#这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则
location = / {
    proxy_pass http://tomcat:8080/index
}
# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
    alias /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}
# 第三个规则就是通用规则,用来转发动态请求到后端应用服务器
# 非静态文件请求就默认是动态请求,自己根据实际把握
# 毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了
location / {
    proxy_pass http://tomcat:8080/
}

八.Nginx常用案例

1.代理静态文件

server {
        listen       10086;
        server_name  www.tangbb.com;
    
        location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_redirect off;
        }
        
        location /data/ {
            alias '/usr/local/data'; 
            //这里是重点,就是代理这个文件夹 
            expires    7d;
        }
}

访问 http://localhost:10086/data/下面的资源就是访问/usr/local/data文件夹的资源

2.反向代理

server {
    listen       80;
    server_name  www.tangbb.com;;

    location / {
        proxy_pass http://127.0.0.1:8080;
        index  index.html index.htm .jsp;
    }
}

3.跨域配置

server {
        listen       80;
        server_name  test.cross.com;

    if ( $host ~ (.*).cross.com){
        set $domain $1;##记录二级域名值
    }
    #是否允许请求带有验证信息
    add_header Access-Control-Allow-Credentials true;
    #允许跨域访问的域名,可以是一个域的列表,也可以是通配符*
    add_header Access-Control-Allow-Origin  *;
    #允许脚本访问的返回头
    add_header Access-Control-Allow-Headers 'x-requested-with,content-type,Cache-Control,Pragma,Date,x-timestamp';
    #允许使用的请求方法,以逗号隔开
    add_header Access-Control-Allow-Methods 'POST,GET,OPTIONS,PUT,DELETE';
    #允许自定义的头部,以逗号隔开,大小写不敏感
    add_header Access-Control-Expose-Headers 'WWW-Authenticate,Server-Authorization';
    #P3P支持跨域cookie操作
    add_header P3P 'policyref="/w3c/p3p.xml", CP="NOI DSP PSAa OUR BUS IND ONL UNI COM NAV INT LOC"';
    if ($request_method = 'OPTIONS') {##OPTIONS类的请求,是跨域先验请求
            return 204;##204代表ok
        }
}

4.防盗链

# 需要防盗的后缀
location ~* \.(jpg|jpeg|png|gif|bmp|swf|rar|zip|doc|xls|pdf|gz|bz2|mp3|mp4|flv)$
    #设置过期时间
    expires     30d;
    # valid_referers 就是白名单的意思
    # 支持域名或ip
    # 允许ip 192.168.0.1 的请求
    # 允许域名 *.google.com 所有子域名
    valid_referers none blocked 192.168.0.1 *.google.com;
    if ($invalid_referer) {
        # return 403;
        # 盗链返回的图片,替换盗链网站所有盗链的图片
        rewrite ^/ https://site.com/403.jpg;
    }
    root  /usr/share/nginx/img;
}
  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Nginx(发音为“Engine X”)是一个高性能的Web服务器和反向代理服务器。它以其轻量级、高性能和可扩展性而闻名,并且被广泛用于许多大型的互联网公司和网站。 要从入门到精通Nginx开发,你需要掌握以下几个方面: 1. 理解Nginx的基本原理:Nginx采用异步、非阻塞的事件驱动模型,可以同时处理大量的并发请求。你需要了解Nginx的事件循环机制、多进程模型以及其与其他服务器的区别。 2. 学习配置NginxNginx使用基于文本的配置文件来对服务器进行配置。你需要学习配置文件的语法、常用指令和块结构,并能够根据需求配置虚拟主机、反向代理、负载均衡等功能。 3. 理解Nginx模块机制:Nginx采用模块化的架构,允许开发者根据需求编写自定义模块。你需要了解Nginx模块的开发原理、常用的API接口和开发方式,以及如何将自定义模块和Nginx进行编译和链接。 4. 学习使用Nginx扩展功能:Nginx提供了许多扩展功能,例如HTTP缓存、SSL/TLS支持、HTTP/2协议等。你需要学习如何配置和使用这些功能,以提高性能和安全性。 5. 掌握Nginx调优和故障排除:Nginx在高并发和大规模访问下表现出色,但需要进行一些调优和故障排除。你需要学习如何监控Nginx服务器的性能、调整配置参数以优化性能,并能够快速识别和解决常见的故障。 总之,要从入门到精通Nginx开发,需要通过学习理论知识、实践项目和阅读优秀的开发资源来不断提升自己。同时,参与开源社区和与其他开发者的交流也是提高自己的好方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr Tang

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值