Nginx教程(万字图文全面详解)

Nginx教程(万字图文全面详解)-mikechen

Nginx定义

Nginx是一款轻量级的高性能的Web服务器和反向代理服务器,是由俄罗斯的程序设计师Igor Sysoev所开发。

Nginx教程(万字图文全面详解)-mikechen

Nginx 处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。

 

Nginx特点

由于以下这几点,所以使用Nginx非常火,在互联网项目中广泛应用。

  • 相较于 Apache具有占有内存少、稳定性高、并发能力强等优势;
  • Nginx 使用基于事件驱动架构,使得其可以支持数以百万级别的 TCP 连接;
  • 高度的模块化、扩展性好、和自由软件许可证、使得第三方模块层出不穷;
  • Nginx 是一个跨平台服务器,可以运行在 Linux、Windows、Mac OS 等操作系统上。

 

Nginx功能应用

Nginx教程(万字图文全面详解)-mikechen

1.正向代理

正向代理最大的特点是:客户端非常明确要访问的服务器地址,服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端,正向代理模式屏蔽或者隐藏了真实客户端信息。

例如:在大陆访问www.google.com,我们需要一个代理服务器,我们通过代理服务器去访问谷歌,这个过程就是正向代理。

来看个示意图:

Nginx教程(万字图文全面详解)-mikechen

我们可以通过这种方式,访问原来无法访问的资源,比如: Google。

2.反向代理

反向代理,客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器。

来看个示意图:

Nginx教程(万字图文全面详解)-mikechen

由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。

3.负载均衡

单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上。

来个示意图:

Nginx教程(万字图文全面详解)-mikechen

将用户访问的请求,根据负载均衡算法,分发到集群中的一台处理服务器,这就是我们说的负载均衡

4.动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。

来个示意图:

Nginx教程(万字图文全面详解)-mikechen

 

 

Nginx下载

1.Nginx官网下载

Nginx下载地址:https://nginx.org/en/download.html

 

2.下载稳定版

如下图所示:

Nginx教程(万字图文全面详解)-mikechen

然后再把Nginx的下载包上传Linux服务器。

 

Nginx安装

Nginx安装步骤如下:

1.安装依赖环境

检查linux服务器中是否存在: gcc-c++、 pcre-devel、 zlib-devel、openssl-devel,没有就安装相关的依赖。

如果都没有安装,使用如下语句安装:

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

2.解压压缩包

tar -zxvf nginx-1.20.2.tar.gz

Nginx教程(万字图文全面详解)-mikechen

需要注意:解压后得到的是源码,源码需要编译后才能安装。

3.编译之前,先创建nginx临时目录,如果不创建,在启动nginx的过程中会报错

mkdir /var/temp/nginx -p

4.在nginx目录,输入如下命令进行配置,目的是为了创建makefile文件

./configure \   
--prefix=/usr/local/nginx \    
--pid-path=/var/run/nginx/nginx.pid \    
--lock-path=/var/lock/nginx.lock \    
--error-log-path=/var/log/nginx/error.log \    
--http-log-path=/var/log/nginx/access.log \    
--with-http_gzip_static_module \    
--http-client-body-temp-path=/var/temp/nginx/client \    
--http-proxy-temp-path=/var/temp/nginx/proxy \    
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \    
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \    
--http-scgi-temp-path=/var/temp/nginx/scgi

注:代表在命令行中换行,用于提高可读性配置命令:

Nginx教程(万字图文全面详解)-mikechen

5.make编译&安装

make
make install

6.进入sbin目录启动nginx

启动:nginx
停止:./nginx -s stop
重新加载:./nginx -s reload

在浏览器访问nginx,记得要在防火墙中放行80端口。

Nginx教程(万字图文全面详解)-mikechen

 

Nginx命令

Nginx常用命令:

nginx -s stop       快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。
nginx -s quit       平稳关闭Nginx,保存相关信息,有安排的结束web服务。
nginx -s reload     因改变了Nginx相关配置,需要重新加载配置而重载。
nginx -s reopen     重新打开日志文件。
nginx -c filename   为 Nginx 指定一个配置文件,来代替缺省的。
nginx -t            不运行,仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
nginx -v            显示 nginx 的版本。
nginx -V            显示 nginx 的版本,编译器版本和配置参数。

 

Nginx目录结构

├── conf                             # Nginx所有配置文件的目录
│   ├── fastcgi.conf                 # fastcgi相关参数的配置文件
│   ├── fastcgi.conf.default         # fastcgi.conf的原始备份文件
│   ├── fastcgi_params               # fastcgi的参数文件
│   ├── fastcgi_params.default       
│   ├── koi-utf
│   ├── koi-win
│   ├── mime.types                   # 媒体类型
│   ├── mime.types.default
│   ├── nginx.conf                   # Nginx主配置文件
│   ├── nginx.conf.default
│   ├── scgi_params                  # scgi相关参数文件
│   ├── scgi_params.default  
│   ├── uwsgi_params                 # uwsgi相关参数文件
│   ├── uwsgi_params.default
│   └── win-utf
├── fastcgi_temp                     # fastcgi临时数据目录
├── html                             # Nginx默认站点目录
│   ├── 50x.html                     # 错误页面优雅替代显示文件,例如当出现502错误时会调用此页面
│   └── index.html                   # 默认的首页文件
├── logs                             # Nginx日志目录
│   ├── access.log                   # 访问日志文件
│   ├── error.log                    # 错误日志文件
│   └── nginx.pid                    # pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
├── proxy_temp                       # 临时目录
├── sbin                             # Nginx命令目录
│   └── nginx                        # Nginx的启动命令
├── scgi_temp                        # 临时目录
└── uwsgi_temp                       # 临时目录

 

Nginx配置文件

Nginx配置文件所在位置:nginx/conf/nginx.conf。

1.Nginx配置结构

main        # 全局配置,对全局生效
├── events  # 配置影响 nginx 服务器或与用户的网络连接
├── http    # 配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置
│   ├── upstream # 配置后端服务器具体地址,负载均衡配置不可或缺的部分
│   ├── server   # 配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块
│   ├── server
│   │   ├── location  # server 块可以包含多个 location 块,location 指令用于匹配 uri
│   │   ├── location
│   │   └── ...
│   └── ...
└── ...

2.Nginx配置含义

Nginx教程(万字图文全面详解)-mikechen

  • 全局块main:nginx 的全局配置,对全局生效;
  • events:配置影响 nginx 服务器或与用户的网络连接;
  • http:可以嵌套多个 server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;
  • server:配置虚拟主机的相关参数,一个 http 中可以有多个 server;
  • location:配置请求的路由,以及各种页面的处理情况;
  • upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分。

 

3.Nginx配置文件

worker_processes  1;                                    # worker进程的数量
events {                                                  # 事件区块开始
    worker_connections  1024;                            # 每个worker进程支持的最大连接数
}                                                        # 事件区块结束
http {                                                   # HTTP区块开始
    include       mime.types;                            # Nginx支持的媒体类型库文件
    default_type  application/octet-stream;             # 默认的媒体类型
    sendfile        on;                                   # 开启高效传输模式
    keepalive_timeout  65;                               # 连接超时
    server {                                            # 第一个Server区块开始,表示一个独立的虚拟主机站点
        listen       80;                                  # 提供服务的端口,默认80
        server_name  localhost;                           # 提供服务的域名主机名
        location / {                                    # 第一个location区块开始
            root   html;                               # 站点的根目录,相当于Nginx的安装目录
            index  index.html index.htm;                  # 默认的首页文件,多个用空格分开
        }                                                  # 第一个location区块结果
        error_page   500502503504  /50x.html;             # 出现对应的http状态码时,使用50x.html回应客户
        location = /50x.html {                          # location区块开始,访问50x.html
            root   html;                                  # 指定对应的站点目录为html
        }
    }  
    ......

 

Nginx配置使用实例

1.反向代理配置实例

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        #server_name localhost;
        server_name  192.168.71.167;
        location / {
            root   html;
            #添加下面的一句话
            proxy_pass http://127.0.0.1:8080;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

2.负载均衡配置实例

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    upstream myserver{
      #ip_hash;
      server 192.168.71.167:8080 weight=1;
      server 192.168.71.167:8081 weight=1;
    }

    server {
        listen       80;
        #server_name localhost;
        server_name  192.168.71.167;
        location / {
            root   html;
                        proxy_pass http://myserver;
                        proxy_connect_timeout 10;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

 

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法