全栈进阶:Nginx基本功能及其原理

2021-10-11 11:09:31 浏览数 (1)

最近由于在搞服务器的环境部署,来整理记录一下学习的过程。 Java 会用 Apache, PHP / Node / … 会优先采用 Nginx。 本章将带领大家一起来体验Nginx 怎样进行 配置服务器 和 一些基本功能和原理。 前端程序员可能接触的比较少,可能只是日常配置一下反向代理,可以实现接口访问即可。 后端 / 测试 / 运维 程序员 接触的就比较多了,毕竟这是服务端领域的知识范畴。 不管你属于哪个, 掌握Nginx 都会对你有所受益的,向全栈(全干) 进阶的一个阶梯。

Nginx 之旅

Nginx 简介

什么是Nginx

Nginx 是一个高性能 HTTP 和 反向代理 服务器,特点占用内存少,并发能力强。在服务器领域性能比较强。

代理
正向代理

在客户端 (浏览器) 配置代理服务器,通过代理服务器进行互联网访问的过程。 举个简单例子: 例如:当你在 家玩 LOL 游戏,游戏里会有 网吧加成,你可以在本地设置一个网吧的代理,这样你在玩游戏时,也可以体验到 网吧的加成,虽然你不是真正的在网吧。 游戏是只认这个代理,它不看你是家还是在哪。

反向代理

如果服务器做了反向代理,所有的请求会发送到这个反向代理的服务器上,然后反向代理服务器去选择目标服务器获取数据返回给客户端,此时的反向代理服务器和目标服务器 对外是一个 服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。 举个例子: 例如: 你通过百度访问 一个网站, 这个网站的服务器中可能有多个Web服务,但是你直接通过域名就可以访问到指定的网站,这样其中就是反向代理帮你干的,不同的url 转向不通过的Web

小结

两者的区别在于代理的对象不一样:正向代理是为客户端代理,反向代理是为服务端代理。

负载均衡

请求数量大的时候,单个服务器,处理不了,需要增加服务器的数量, 将请求分发到各个服务器,然后 负载分发到不同的服务器上处理,最终返回结果数据。

动静分离

为了加快网站的解析速度,可以将 动态资源 和 静态资源 分别放置不同服务器, 来加快解析速度。降低原来单个服务器压力。

3

Nginx 常用命令

代码语言:javascript复制
1.查看版本
nginx -v

2.关闭
nginx -s stop
3.退出
nginx -s quit
4.重启加载配置
nginx -s reload
5. 启动
./nginx

Nginx 配置

代码语言:javascript复制
#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       8090;
        server_name  localhost;

        #charset koi8-r;
           charset utf-8;

        #access_log  logs/host.access.log  main;

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


        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ .php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ .php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

Nginx 配置文件位置

nginx-1.17.2conf nginx.conf

Nginx 组成

nginx 配置文件 由 三部分组成:

  1. 全局块
  2. events块
  3. http块
1. 全局块

从配置文件到 events 块之间的内容, 主要设置一些 影响nginx 服务器整体运行指令 worker_processes 1; 配置的 并发处理量, 根据你自己的 服务器 CPU 核 来配置多少 该部分配置主要影响Nginx全局,通常包括下面几个部分: 配置运行Nginx服务器用户(组) worker process数 Nginx进程PID存放路径 错误日志的存放路径 配置文件的引入

2. events 块

events 块 的指令 主要影响nginx 服务器与用户的网络链接 worker_connections 1024; 配置支持最大的连接数 该部分配置主要影响Nginx服务器与用户的网络连接,主要包括: 设置网络连接的序列化 是否允许同时接收多个网络连接 事件驱动模型的选择 最大连接数的配置

3.http块

http 块 是 nginx 服务器配置最频繁的部分,代理,缓存核日志定义 等功能和第三方模块的配置在这块配置。 定义MIMI-Type 自定义服务日志 允许sendfile方式传输文件 连接超时时间 单连接请求数上限

3.1 server块

配置网络监听 基于名称的虚拟主机配置 基于IP的虚拟主机配置

3.2 location块

location配置 请求根目录配置 更改location的URI 网站默认首页配置

反向代理操作

代码语言:javascript复制
    server {
        listen     80;    # 监听端口号, 服务器必须开启
        server_name  101.23.x.x;   #  这块为你的 服务器 公网 ip 地址

    	#设置url 转发
        location  ~ /vue/ {
        	# 设置代理
			proxy_pass  http:127.0.0.1:8080;
        }
   		#可设置多个url转发
        location  ~ /react/ {
			proxy_pass  http:127.0.0.1:8090;
        }
    }


访问:
101.23.x.x/vue/
101.23.x.x/react/




    server
    {
        listen 80;  # 监听端口号
        server_name 111.229.51.6;   # 服务器ip 地址
        index index.html index.htm index.php;   #映射文件
        root  /www/wwwroot/Vue;   # 映射文件路径
        
    	# 设置url转发
        location /api/ {
        	#设置反向代理
        	proxy_pass http://localhost:3000/;
        }
    }
访问:
111.229.51.6/getList/

负载均衡

在 http块 进行配置, upstream 中配置多个服务器地址,来实现均衡负载。 然后通过在 serve块中 配置 反向代理的 地址为 负载均衡 name,这样就实现当多用户访问服务器时,减少了单个服务器压力大的情况,进行分发处理请求。

代码语言:javascript复制
upstream myserver{
    server  192.168.x.x:8080;
    server  192.168.x.x:8090;
}

    server
    {
        listen 80;
        server_name 111.229.51.6;
        index index.html index.htm index.php;
        root  /www/wwwroot/Vue;
        
        location /api/ {
        # 进行反向代理
        proxy_pass http://myserver;   #指定代理为 负载均衡name
        }
    }
负载均衡 分配服务策略
轮询
代码语言:javascript复制
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

# 默认 按 轮询的方式 执行 负载均衡。
weight 权重
代码语言:javascript复制
# weight 代表权重默认为 1,权重越高被分配的客户端越多
upstream myserver{
    server  192.168.x.x:8080 weight = 10;
    server  192.168.x.x:8090 weight = 20;
}
ip_hash
代码语言:javascript复制
#每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器
upstream myserver{
    ip_hash;
    server  192.168.x.x:8080 ;
    server  192.168.x.x:8090 ;
}
fair
代码语言:javascript复制
#按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream myserver{
    server  192.168.x.x:8080 ;
    server  192.168.x.x:8090 ;
    fair;
}

Nginx 基本原理

在 开启Nginx 时, 默认会开启两个 线程, 一个 master线程, 一个 worker 线程。 master 线程 是 用来 管理 worker 线程的。

Nginx 工作原理

worker 是如何进行 工作

当 客户端发送了一个请求, 首先 进入的是 Master进程,而Master下面有多个worker进程, worker 的工作机制是 争抢, 哪个 worker 处理快,就会争抢到执行这个请求。

一个 master 和多个 woker 有好处

(1)可以使用 nginx –s reload 热部署,利用 nginx 进行热部署操作 (2)每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 独立的,继续进行争抢,实现请求过程,不会造成服务中断

设置多少个 woker 合适

worker 数和服务器的 cpu 数相等是最为适宜的

连接数 worker_connection
  • 发送请求,占用了 woker 的几个连接数? 2 或者 4 个, 为什么是 2个 或者4个? 当发送一个请求,请求响应 为两个 连接,访问数据库 又需要两个连接。
  • nginx 支持的最大并发数是多少? 普通的静态访问最大并发数是: worker_connections * worker_processes /2 如果是 HTTP 作 为反向代理来说,最大并发数量是: worker_connections *worker_processes/4。

0 人点赞