Nginx入门

97 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

简介

Nginx是一款轻量级的web服务器、反向代理服务器。

Nginx的Master-Worker模式

Nginx启动后其实就是在80端口启动了socket服务进行监听。 Master负责读取并按照配置文件、管理一个或多个Worker。 每一个Worker进程的维护一个线程,处理连接和请求;其中Worker进程个数由配置文件决定 ,一般和CPU个数相关。

思考:Nginx挂了怎么办?

Keepalived+Nginx实现高可用。 第一:请求不要直接打到Nginx上,应该先通过Keepalived(这就是所谓虚拟IP,VIP) 第二:Keepalived应该能监控Nginx的生命状态(提供一个用户自定义的脚本,定期检查Nginx进程状态,进行权重变化,,从而实现Nginx故障切换) ##动静分离 静态文件放在Nginx, image.png

反向代理和正向代理

image.png 例子:使用vpn代理访问外网。叫村里的小盆友帮忙买辣条,在这里小盆友就充当代理,商店就充当服务端,而“你”充当客户端。 反向代理:

image.png

总结:

正向代理:代理的是客户端;这个时候服务端是不知道真正的客户端。 反向代理:代理的是服务端;这个时候客户端是不知道真正的服务端。 反向代理demo

#启动进程,通常设置成和cpu的数量相等
worker_processes  1;

events {
    #单个后台worker process进程的最大并发链接数   
    worker_connections  1024;
    # 并发总数是 worker_processes 和 worker_connections 的乘积
}
http {
    #设定mime类型,类型由mime.type文件定义
    include       mime.types;
    default_type  application/octet-stream;

    #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
    #对于普通应用,必须设为 on,
    #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
    sendfile        on;
    #连接超时时间
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  127.0.0.01;   

        location / {     #location / 表示处理所有请求
            proxy_pass http://192.168.20.1:8080;   #代理的服务端
        }

        # 定义错误提示页面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

正则表达式说明:

  1. =:用于不含正则表达式的url前,要求字符串与url严格匹配,匹配成功就停止向下搜索并处理请求
  2. ~:用于表示url包含正则表达式,并且区分大小写。
  3. ~*:用于表示url包含正则表达式,并且不区分大小写
  4. ^~:用于不含正则表达式的url前,要求ngin服务器找到表示url和字符串匹配度最高的location后,立即使用此location处理请求,而不再匹配
  5. 如果有url包含正则表达式,不需要有~开头标识
server {   
    listen 8080;                         # 监听的端口      server_name  192.168.1.1;            # 配置访问域名      root  /data/root;                    # 站点根目录      error_page 502 404 /page/404.html;   # 错误页面      location ^~ /api/  {                        # 使用 /api/ 代理 proxy_pass 的值          proxy_pass http://192.168.20.1:8080;    # 被代理的应用服务器 HTTP 地址     
    } 
}

Docker中使用nginx

1. 下载最新的nginx的docker image

 $ docker pull nginx:latest

2. 启动nginx容器

 docker run -d --name nginx -p 80:80  -v /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /docker/nginx/log:/var/log/nginx -v /docker/nginx/html:/usr/share/nginx/html -v /docker/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf nginx

思考:Nginx如何做到高并发下的高效处理?

Nginx采用了Linux的epoll模型,epoll模型基于事件驱动机制,它可以监控多个事件是否准备完毕,如果OK,那么放入epoll队列中,这个过程是异步的。worker只需要从epoll队列循环处理即可。