文章内容输出来源:拉钩教育Java高薪训练营
Nginx
Nginx基础回顾
-
Nginx是什么?
- 高性能的HTTP和反向代理Web服务器,核心特点是占有内存少,并发能力强
-
Nginx可以做什么?(应用场景)
- HTTP服务器(Web服务器)
- 性能非常高,注重效率,经受高负载的考验
- 反向代理服务器
- 正向代理:在浏览器中配置代理服务器的相关信息,通过代理服务器访问目标网站,代理服务器收到目标网站的响应之后,返回给我们自己的浏览器客户端。
- 反向代理:浏览器客户端发送请求到反向代理服务器,由反向代理服务器选择原始服务器提供服务获取相应,最终再返回给客户端浏览器。浏览器不做任何配置,不可见提供服务的原始服务器。
- 负载均衡服务器
- 寻找确定合理的目标服务器(多选一)的过程就叫负载均衡,解决高负载的问题。
- 动静分离
- Nginx:静态资源 html/js/css/jpg...
- Tomcat:动态资源 jsp/servlet
- HTTP服务器(Web服务器)
-
Nginx的特点
- 跨平台
- 上手容易,配置简单
- 高并发,性能好
- 稳定性好,宕机概率低
-
Nginx安装
wget https://mirrors.huaweicloud.com/nginx/nginx-1.18.0.tar.gz yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel tar -xvf nginx-1.18.0.tar.gz cd nginx-1.18.0 ./configure make make install cd /usr/local/ cd nginx/sbin ./nginx <-- 启动判断nginx是否启动
ps -ef|grep nginx访问服务器的80端口(nginx默认监听80端口)
-
Nginx主要命令
- ./nginx 启动nginx
- ./nginx -s stop 终止nginx(也可以找到nginx进程号,使用kill -9杀掉进程)
- ./nginx -s reload
Nginx核心配置文件解读
-
全局块
-
影响nginx服务器整体的运行
# 运行用户 #user nobody; # worker进程数量,通常设置为和cpu数量相等 worker_processes 1; # 全局错误日志及pid文件位置 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid;
-
-
events块
-
影响nginx服务器与用户的网络连接
events { # 单个worker进程的最大并发连接数 worker_connections 1024; }
-
-
http块
-
虚拟主机、监听端口、请求转发、反向代理、负载均衡等等
http { # 引入mime类型定义文件 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压缩 #gzip on; # 配置虚拟主机,可以有多个,类似tomcat下host server { # 监听端口 listen 9003; # 定义使用localhost访问 server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; # 默认请求,类似tomcat下host/context 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; # } #} }
-
Nginx应用场景之反向代理
-
需求一:浏览器请求nginx,nginx将请求转发给目标服务器(tomcat)
-
部署tomcat,监听8080端口
-
修改nginx配置
location / { proxy_pass http://127.0.0.1:8080/; } -
重新加载nginx配置
./nginx -s reload
-
测试,访问 http://47.101.165.107:80/ 返回tomcat页面
-
-
需求二:浏览器请求 nginx/abc,转发给tomcat:8080; 请求 nginx/def,转发给tomcat:80801
-
部署两个tomcat,分别监听8080,8081端口
-
修改nginx配置
location /abc { proxy_pass http://127.0.0.1:8080/; } location /def { proxy_pass http://127.0.0.1:8081/; } -
测试
- 访问http://47.101.165.107:80/abc 返回tomcat8080
- 访问http://47.101.165.107:80/def 返回tomcat8081
-
location语法
location [=|~|~*|^~] /uri/ {...}
- 正则匹配 location ~ /abc {}
- 不区分大小写的正则匹配 location ~* /abc {}
- 匹配路径的前缀 location ^~ /abc {}
- 精确匹配 location = /abc {}
- 普通路径前缀匹配 location /abc {}
优先级: 4 > 3 > 2 > 1 > 5
Nginx应用场景之负载均衡
-
轮询
默认策略,每个请求按时间顺序逐一分配到不同的服务器,如果某一个服务器下线,能自动剔除
upstream carolServer{ server 127.0.0.1:8080; server 127.0.0.1:8082; } location /abc { proxy_pass http://carolServer/; } -
weight
权重,默认每个负载的服务器为1,权重越高被分配的请求越多
upstream carolServer{ server 127.0.0.1:8080 weight=1; server 127.0.0.1:8082 weight=2; } -
ip_hash
每个请求按照ip的hash结果分配,每一个客户端的请求会固定分配到同一个目标服务器处理,可以解决session问题
upstream carolServer{ ip_hash; server 127.0.0.1:8080; server 127.0.0.1:8082; }
Nginx应用场景之动静分离
-
动态资源(jsp, servlet)
Nginx反向代理到tomcat可以看到Tomcat ROOT项目的index.jsp页面
-
静态资源(html,js,css,img等等)
- 放置静态资源到nginx服务器
-
修改nginx配置
location /static/ { root static_data; }
Nginx底层进程机制剖析
- Nginx启动后,以daemon多进程方式在后台运行。包括一个Master进程和多个Worker进程
- Master进程:管理Worker进程
- 接受外界信号向各worker进程发送信号(./nginx -s reload)
- 监控worker进程的运行状态,当worker进程异常退出后master进程会自动重新自动新的worker
- Worker进程:具体处理网络请求
- 多个worker之间是对等的,同等竞争来自客户端的请求
- 各worker进程之间是独立的
- Master进程:管理Worker进程
- ./nginx -s reload 举例说明信号处理方式
- master进程对配置文件进行语法检查
- 尝试配置(比如修改了监听端口,检查是否可以使用)
- 尝试成功则使用新的配置,新建worker进程
- 新建成功,给旧的worker进程发送关闭信息
- 旧的worker收到信号后会继续服务,直到把当前进程接受到的请求处理完毕后关闭
- worker进程处理请求部分说明
- master进程创建之后,会建立好需要监听的socket,从master进程再fork出多个worker进程
- worker进程的监听描述符listenfd在新连接到来时都可读->惊群效应?
- 使用互斥锁保证只有一个worker进程能够处理请求
- nginx多进程模型好处
- 每个worker进程都是独立的,不需要加锁,节省开销
- 每个worker进程都是独立的,互不影响,一个异常其他的照样能服务
- 多进程模型为reload热部署机制提供了支撑