nginx学习

Nginx的基本概念
nginx是一个高性能的HTTP和反向代理web服务器

  1. 反向代理
    理解正向代理:用户通过代理服务器访问目标服务器,对用户来说,目标服务是可知的。
    反向代理中,用户通过访问反向代理服务器完成访问,但对用户来说,目标服务器并不可知。
    在这里插入图片描述

  2. 负载均衡
    当请求到达服务器后,服务器会开启线程处理请求,服务器开启线程是需要消耗资源的,对服务器来说,这个就是负载的概念,当nginx服务器作为转发服务器将请求分发到不同的服务器上,就达到了负载均衡
    在这里插入图片描述

  3. 动静分离
    将请求区分,请求页面等静态资源的请求分发到静态资源服务器,静态资源的响应相当快,将请求动态资源(业务处理请求)分发到动态资源服务器中,此为动静分离
    在这里插入图片描述

nginx安装、常用命令和配置文件
4. 在linux系统中通过docker安装nginx
//查找镜像
docker search nginx
//拉取镜像
docker pull nginx
//查看镜像
docker images
在这里插入图片描述
在这里插入图片描述

访问成功
在这里插入图片描述

如果无法访问的话,请确保已经在阿里云的安全组策略开放8080端口,开放的端口为8080
在这里插入图片描述

  1. nginx常用命令
    通过docker exec -it nginx-test bash进入容器中,nginx在容器的的启动入口为/usr/sbin下的nginx
    ./nginx -s reload 重新加载nginx.conf配置
    ./nginx -s restart 重启nginx
    ./ngixn -s stop 停止nginx退出容器(pid为1的线程被停止)
    在这里插入图片描述

  2. nginx配置文件
    假设从未本地无nginx的配置文件,则需要从docker容器中拷贝nginx的配置文件
    在这里插入图片描述

获取配置文件后重建nginx容器
在这里插入图片描述

通过docker container inspect nginx-test可以查看命令生效的配置

nginx的配置文件主要由三部分构成
1.全局块
从配置文件开始到event块之间的内容,主要设置一些影响nginx服务器整体运行的配置指令,主要包含服务器的用户组,允许生成的worker process数,进程PID存放路径,日志存放路径和类型以及配置文件的引入等
2.event块
主要影响nginx与与用户网络的连接,常用的设置包括是否开启对多worker process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取事件驱动模型处理连接请求,每个worker process可以同时支持的最大连接数
3.http块
设置代理、缓存和日志定义等绝大多数功能和第三方模块的配置,http全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等
server块为http块的子块,每个server块相当于一个虚拟主机
location块为server块的子块,每个server块包含多个location块,定义每个虚拟主机的访问路劲,对请求的路径进行匹配,对特定的请求进行处理,地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置
//全局块
user nginx;
worker_processes 1; //并发处理服务器的关键配置,值越大支持的并发处理数量越大,一般与cpu核数一致

error_log /var/log/nginx/error.log warn; //日志记录位置 日志等级
pid /var/run/nginx.pid;

events {
worker_connections 1024;//每个worker process支持的最大连接数
}
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       80;
    server_name  localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

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

    #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;
#    }
#}

}

详细配置说明,参考:https://www.runoob.com/w3cnote/nginx-setup-intro.html
########### 每个指令必须有分号结束。#################
#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 ‘ r e m o t e a d d r – remote_addr– remoteaddrremote_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配置反向代理
实现效果:客户端访问nginx,然后nginx将请求分发到tomcat中
1.启动tomcat容器,设置映射端口和挂载文件目录
docker run -d --name tomcat-test -p 8080:8080 -v /test/tomcat:/usr/local/tomcat/webapps tomcat:8
在这里插入图片描述

2.通过nginx实现反向代理
添加配置
在这里插入图片描述

访问nginx路径(前面启动nginx的时候重新设置端口号为9090)
http://IP:9090/test/index.html
在这里插入图片描述

备注:
location说明:
location [=|||^~] /uri/ { … }
= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
~ 开头表示区分大小写的正则匹配
~
开头表示不区分大小写的正则匹配
!和!*分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到。
参考:https://blog.csdn.net/luoyang_java/article/details/83507193

proxy_pass的说明
参考:https://blog.csdn.net/u010433704/article/details/99945557
nginx配置负载均衡
准备条件:准备两个不同的tomcat容器,将其地址配置到nginx中,通过nginx的负载均衡进行路由
nginx配置(配置内容都位于http块下)
在这里插入图片描述
在这里插入图片描述

实现效果:
访问同一个url,请求分发到不同的tomcat
在这里插入图片描述
在这里插入图片描述

nginx负载均衡的策略
1.轮询(默认)
每个请求按照时间顺序逐一分配到不同的后端服务,如果后端服务down掉则nginx自动剔除
2.weight权重
weight代表权重,默认为1,权重越高分配给此服务器的请求越多
指定轮询几率,weight和访问比率成正比,常用于服务器性能不均的情况
在这里插入图片描述

3.ip_hash
每个请求按访问ip的hash结果分配,每个访客固定访问一个后端服务器,可以解决session的问题
配置:
upstream myserver{
ip_hash;
server IP:PORT ;
server IP:PORT;
}

4.fair公平分配
按后端服务器的响应时间来分配请求,响应时间短的优先分配

upstream myserver{
server IP:PORT ;
server IP:PORT;
fair;
}

nginx配置动静分离
将动态请求和静态请求分开,静态请求主要为页面,动态请求主要为业务逻辑处理,包含数据库变更。主要的动静分类手段为:将静态资源使用静态资源服务器存放,通过域名调用;第二个方法为,通过location配置实现请求分发,具体配置如下

location /path/{
root /path/;
autoindex on; //访问文件夹时,会列出其下的所有文件
}

nginx原理
在这里插入图片描述

Nginx 在启动后,会有一个 master 进程和多个 worker 进程。master 进程主要用来管理 worker 进程,包含:接收来自外界的信号,向各 worker 进程发送信号,监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动重新启动新的 worker 进程。

基本的网络事件,则是放在 worker 进程中来处理, 多个 worker 进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个 worker 进程中处理,一个 worker 进程,不可能处理其它进程的请求。

worker进程数是可以设置的,一般会设置与机器CPU核数一致

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值