|
一、前言 最近空闲时间稍微少了点,晚上下班一般会看会书,所以更新也就没有那么快了!这不最近在看之前买的书籍(今年真的要多看点书籍):
7 h* a' @) x2 m5 N 还有音视频接口和解封装框架,我差不多快捋顺了,其实之前很多人问的接口,完全可以去ffmpeg官网查文档说明,而且上面还有很多的demo测试案例说明:# S$ F8 w* ~% c* k
差不多下周开始继续更新音视频的学习笔记; ! [ ?% @3 s D 今天这篇文章呢,主要是总结一下过年期间复习的nginx负载均衡一些配置简单的实战演示! 二、nginx的常见使用这里我主要演示nginx的源码安装以及相应的模块安装,然后讲解一下负载均衡的原理并通过实战来简单演示,还有静态资源的访问(比如说图片和视频的访问),关于什么是nginx,它是干什么用的,网上有很多介绍,这里我就不啰嗦了,我挑重点实战来分享! 1、nginx以及相关模块源码安装: 我们先进行源码所需要的模块 -- nginx-1.13.7.tar.gz -- openssl-1.1.0g.tar.gz -- pcre-8.41.tar.gz -- zlib-1.2.11.tar.gz
对应下载地址: wget http://nginx.org/download/nginx-1.13.7.tar.gz8 |& Z3 ` H! `/ X* O1 s1 V0 nwget https://www.openssl.org/source/openssl-1.1.0g.tar.gz wget http://ftp.pcre.org/pub/pcre/pcre-8.41.tar.gz wget http://www.zlib.net/zlib-1.2.11.tar.gz 7 x+ \" v& A* \' d6 [9 C; \. `+ t) j (1)解压nginx:
(2)解压openssl:
(3)解压pcre:
(4)解压zlib:
6 N# d: E T, l6 a (5)进行配置,先进入到nginx里面去,然后执行下面语句: " U. _( m* x# e( X& e; p* x
--with-http_realip_module: H. o# r; Y) F+ O0 ]7 p --with-http_addition_module x K4 c- t$ P5 O6 P2 U --with-http_gzip_static_module --with-http_secure_link_module --with-http_stub_status_module --with-stream --with-pcre=/home/txp/share/nginx/pcre-8.41 --with-zlib=/home/txp/share/nginx/zlib-1.2.11 --with-openssl=/home/txp/share/nginx/openssl-1.1.0g; L% K# \5 @# Z) | Y 9 M3 _8 v9 M1 V0 R& e* m* f 然后直接make:
然后接着再sudo make install:
最终我们可以看到在/usr/local/nginx/目录下看到安装的nginx:
现在我们可以试着来运行nginx,并进行访问(下面的访问成功):
a, {* k+ b/ O8 P
: T" ^: f2 S: j( A4 ^ 这里小结一下: 很多开源软件的安装步骤大概都差不多是下面这样的套路(比如等下我们下面要安装的模块,也是这样安装的思路,所以这里就不造轮子了) -- ./cofigure -- make --sudo make install 2、自己写conf文件在平时的开发过程中,主要我们要去配置它的conf文件夹下的nginx.conf文件 root@ubuntu:/usr/local/nginx# lsclient_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp ( d9 r# v# U: V9 i uwsgi_temp * o5 f; H% V. A; r 这个文件原本内容是: #user nobody;* O+ C' Y1 u" yworker_processes 1;3 W6 q# z3 Q/ V3 ~ #error_log logs/error.log;" ^7 g* h5 t4 m0 C #error_log logs/error.log notice;% j( c: D5 S7 X% _ A n( Z #error_log logs/error.log info;1 l( e& n/ A& G0 a #pid logs/nginx.pid; ! y; b. H2 d9 @+ j4 w* L8 ^ events {% u" Y. W' u2 h$ |, O: Z2 L$ f worker_connections 1024; } 3 @9 ?+ z( P- [% l4 {1 l% K5 i3 O" Q http { include mime.types;! w" c3 I6 U c U* y default_type application/octet-stream;: i" F; }% ^' o #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" '1 ]7 T+ r& ]6 B( L. v # '"$http_user_agent" "$http_x_forwarded_for"';5 R0 f3 p4 N' [/ e; z! K" F Q #access_log logs/access.log main;6 T1 ~8 T; f, m sendfile on;5 N" n5 u2 i, S H; Z T; D$ I1 ]+ ?# v #tcp_nopush on;* x$ S d3 g1 T6 r * V# {6 p* P _4 d4 q! D6 Q #keepalive_timeout 0; keepalive_timeout 65;* X" o5 I5 ]( y/ v5 @ f2 G/ L; B; n# G: i; V5 Y( ]# E #gzip on; server { listen 80;; \2 K5 h: H. m) [+ E2 k& v server_name localhost;# z% Z4 _5 j1 ]# `$ |. }0 n; f #charset koi8-r; & [) A# f# V* g- u8 x. ^- s0 J- P #access_log logs/host.access.log main; location / {$ }5 W- c O# } root html;* |' ~! N& J( m: H- l( C index index.html index.htm;! e4 f; {7 `! d' A! C. B } #error_page 404 /404.html; 8 \( M% C! t/ V% E4 z+ {7 M # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html;: @7 ~, ?5 u. \7 g% W location = /50x.html { root html; } i4 V8 Z! K) V) x5 v # proxy the PHP scripts to Apache listening on 127.0.0.1:80 #3 i5 x, ?& m) |& ?; x# z2 Z, D #location ~ \.php$ { # proxy_pass http://127.0.0.1;% }3 R. S* Q- A; X5 N0 m" J #}- z* @- C' I9 C" ^ V. |5 L # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 #. q& k- H& d% p0 A #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php;" T) p- m! Q1 f# p# \2 r/ T. i # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;4 F. @6 ], {7 q2 \; \ # include fastcgi_params;5 a- W' S _3 ?# Z, X+ @) b #} # deny access to .htaccess files, if Apache's document root9 V9 P a* q2 |% H g # concurs with nginx's one # #location ~ /\.ht { # deny all;% G. g+ A0 E( n# t8 z #}1 R# X1 |* m5 e. p( q( c9 ?& r" U; n( b }/ F9 P6 W7 b3 E P; q( C& Z1 {4 ? 0 [2 E6 H F% S L; e # another virtual host using mix of IP-, name-, and port-based configuration #" Y" } D; X2 q0 H #server {4 K# E: U' Y/ D # listen 8000; # listen somename:8080;) b5 A8 M( K2 q" P1 w2 Y( G/ |+ \ # server_name somename alias another.alias; # location / { # root html; b# @2 g6 p. {' u # index index.html index.htm;7 v+ a5 {) \! N+ @6 P, p, \3 q # } U. G3 G: R8 F# V #}# c) }* |1 \7 Y' F; r/ j/ k( J" I( ] % }( f! E" v* X1 n% @' d ; s# O; G" |7 {9 f2 U # HTTPS server: v/ A9 a8 e, \4 y2 i! ` #6 C6 e$ _, W* f- _0 ?- j #server {% d) W7 k3 ]1 B! `2 d # listen 443 ssl; # server_name localhost;4 G% e7 B! V( Y! h' f* ? , _8 c& t: x- I; {, Z5 ^3 V # ssl_certificate cert.pem;- R u2 b3 M/ C5 W3 f9 e # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m;+ u0 j, n% n% M# ]' j7 U0 o7 N1 v # ssl_session_timeout 5m;2 ^5 \, E' X& |! [" M 2 G5 y+ y. j- Z2 L6 e # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; 5 @8 J- ~3 ^3 z+ _5 A7 Y0 N # location / {' t0 k! A5 M; q, K. U8 K. b Z # root html; # index index.html index.htm;" l9 {% H. _2 z6 V* s3 r, L: i& G # }" N0 ], R# f& O: v* g1 T7 h #} + O5 e( X4 }6 X- g! ? }; k2 d+ S8 x0 m/ X 这里内容比较多,我们现在自己来写一个配置文件来实现nginx的访问: txp@ubuntu:/usr/local/nginx$ sudo mkdir demo_conftxp@ubuntu:/usr/local/nginx$ cd demo_conf/* f, N* R2 C3 y5 y. x* { txp@ubuntu:/usr/local/nginx$ vim demo_conf/demo.conf$ a8 v' D* x! o& x7 a4 S" f+ i5 ~. P worker_processes 4;#进程数量 : [! T4 V; r3 `# T) h9 B8 U) E events{ worker_connections 1024;#并发访问数量$ q5 j) R' g, u$ b6 h. F, | }+ z s4 V+ |3 { http{) ?; M7 U! F1 W: |1 Q8 L. ~ server { listen 8888;#监听端口2 J( C; S1 `- A9 I# Y" Y: R' U) V server_name localhost;#服务器名称0 |# H; S1 O Y4 o! L$ b client_max_body_size 100m;#访问的数量大小: ?% O. q7 V% ]& O& n# w % p z- r' \/ G3 u, B location / { root /usr/local/nginx/html/ #访问这个本地服务器里面的这个html页面" i6 W2 Q6 p$ W0 Y9 I( {9 y7 ^ 5 M- _5 h: P7 x }2 G m: u3 G. i: G } }# I' g3 [- G4 U 现在我们来看一下我们自己配置的是否成功,先把之前的nginx关闭掉: ./sbin/nginx -s stop然后再执行这个配置文件: ./sbin/nginx -c demo_conf/demo.conf' ^7 _ A, r7 t$ R- g! ?, R1 m) h
这里扩展一下基础知识点: Nginx 由配置文件中指定的指令控制的模块组成。指令分为简单指令和块指令。一个简单的指令由空格分隔的名称和参数组成,并以分号(;)结尾。块指令具有与简单指令相同的结构,但不是以分号结尾,而是以大括号({和})包围的一组附加指令结束。如果块指令可以在大括号内部有其他指令,则称为上下文(例如:events,http,server 和 location)。配置文件中放置在任何上下文之外的伪指令都被认为是主上下文。events 和 http 指令驻留在主上下文中,server 在 http 中的,而 location 在 http 块中。 3、负载均衡、反向代理和静态资源的访问演示:--反向代理原理(ReverseProxy):它是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,简单来说就是真实的服务器不能直接被外部网络访问,想要访问必须通过代理,如下图所示:
上图中有两个网关,一个是nginx应用层网关,一个路由器硬件网关,nginx和各服务器都是在同一个局域网里面;路由器它做了一个端口映射(nat)直接访问到nginx,给人的感觉nginx就在公网上面; 注意这里的服务器对外不提供服务的,通过nginx代理来向外提供服务;外面访问的是公网ip,然后通过端口映射找到nginx 现在我们用nginx做代理配置(比如说我这里用143的这台机器代理141这台机器): worker_processes 4;' y% c1 q; f7 N/ {events{ worker_connections 1024; } http{ server {% P7 S5 j/ s4 K W) | listen 8888; server_name localhost;, }" {4 l. G5 w4 G) \ client_max_body_size 100m;: W: i7 q0 S5 Q& ?/ W location / { root /usr/local/nginx/html/; proxy_pass http://192.168.29.141; } Y! s# M( q/ E } }& W4 v" W/ R$ L2 T3 e- S 注意:141的那台机器也安装nginx了,然后当我访问143这台机器的时候,其实访问的是141这台机器的内容,这就是代理的使用了:
-- 负载均衡:从负载均衡四个字来看,肯定是用来减轻服务器的访问压力的;比如说当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃(比如每年双十一活动,淘宝就使用了nginx的负载均衡的功能,不然当天那么多的用户活跃在淘宝上,服务器肯定吃不消啊!)。因此为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器(也就是我们的nginx),在让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器。如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。 下面我演示负载均衡案例: worker_processes 4;3 ^+ E$ {3 J) `) x1 g' Y, b$ w, I3 c8 e1 k! i: s events{2 V \ z1 e* r6 I* s; Z worker_connections 1024;' U# U9 X# S, w0 }8 j/ K& R9 S- F( l, p 6 O2 b8 y3 w) W2 h2 l; G2 X b0 p4 o' R! @* r3 X( T, h2 s# L0 @ }. D* O9 ^4 r; C6 u7 b http{ upstream backend{" |% ]! V4 \9 c) Z2 z server 192.168.29.142 weight=2;//weight表示权重 server 192.168.29.141 weight=1; } server {/ } R R) ?4 `! D listen 8888;, n1 t( ?! M! L( ?4 q% ? server_name localhost; client_max_body_size 100m; 8 U* B( w6 A7 G$ {$ j location / { # root /usr/local/nginx/html/; # proxy_pass http://192.168.29.141; proxy_pass http://backend; }8 j- e$ y. l& M* t3 E4 J }. s( k) D& u. Z8 L7 U } 注意:权重表示被访问的更多,这里由于我三台机器都安装了nginx,所以内容显示看不出什么不同之处来,其实142的机器被访问了2次,141的机器被访问了1次,我这里有三台机器:141、142、143:
1 }1 E1 ~' Q! O! h1 o -- 访问静态资源(图片和视频) 这里我在143的机器上放了几张图片,然后在/usr/local/nginx目录下创建了一个images文件夹,然后把143机器上的图片copy到images下面来: root@ubuntu:/usr/local/nginx# ls/ Y6 Z9 {7 B i2 ^( [client_body_temp fastcgi_temp images proxy_temp scgi_temp vip_conf conf html logs sbin uwsgi_temp6 r9 w3 V7 e/ O" S# v root@ubuntu:/usr/local/nginx# mv /home/txp/share/nginx/*.png images/ root@ubuntu:/usr/local/nginx# ls1 c2 L5 U9 y" }8 j$ a% I; r client_body_temp fastcgi_temp images proxy_temp scgi_temp vip_conf conf html logs sbin uwsgi_temp root@ubuntu:/usr/local/nginx# cd images/ root@ubuntu:/usr/local/nginx/images# ls- a- i) \$ X3 e4 @) d4 B( u9 \ 1.png 2.png 3.png. ~% {5 S6 D4 b6 b 然后进行conf文件配置: worker_processes 4;' e& ~& O- o. [. A$ q1 e+ Gevents{& G7 | l2 y' V worker_connections 1024;6 w, U" d% R. T! I; r 8 Q3 N1 U8 ]4 e0 p/ a9 U; e 3 L) d5 i2 A& P: P }" C }& Q2 C8 x' K; _" B0 ^( M$ d http{ upstream backend{ server 192.168.29.142 weight=2; server 192.168.29.141 weight=1; } server {! o" j8 U' s* g* l' b1 [ listen 8888;" }# s) v7 I9 r server_name localhost;+ v: c) |1 S) h' z; G/ ]: } 3 O# K: o( R9 F- U; E! U; v9 h client_max_body_size 100m;% O+ a7 T/ l. ^7 |4 }* L2 E$ ^6 y location / { # root /usr/local/nginx/html/; # proxy_pass http://192.168.29.141;( S! X* C8 F V. s proxy_pass http://backend; }4 J( H3 ]$ Y _- } q9 J. w location /images/ { root /usr/local/nginx/;) ^/ |. \) u! D( x5 E } } }* z8 S" p! G1 p0 W" r4 i/ z. _0 B6 x 实现结果如下:
下面我在演示一下视频访问,同样,我创建一个media目录,然后把143机器上的test.mp4copy到media目录来: root@ubuntu:/usr/local/nginx# mv /home/txp/share/nginx/test.mp4 media/' M, Z1 k3 F; J3 I' W5 Z y6 v% ]root@ubuntu:/usr/local/nginx# cd media/ root@ubuntu:/usr/local/nginx/media# ls test.mp4) `, E# F! R0 P0 _1 a conf文件配置: worker_processes 4;( c1 P( ?2 l0 B5 L events{ K, D. i' f& N- ] worker_connections 1024;7 S8 x/ Y- S y9 w. \; @ / i0 I9 m6 L+ C {+ |% F( z } http{ upstream backend{5 k) x* G/ d+ c3 f, ?! @ server 192.168.29.142 weight=2;0 Z" r& ?4 k7 { t1 P6 ^ server 192.168.29.141 weight=1; } server {4 H; O9 T+ z2 n4 z) D: M( ~ listen 8888;+ z: p& O) W; T* W2 p7 U server_name localhost;1 p5 L0 j9 }. s# @! ?; c; J client_max_body_size 100m;' U. C# N' U& Y; M i location / { # root /usr/local/nginx/html/; # proxy_pass http://192.168.29.141;! B: g; w$ c/ { proxy_pass http://backend;* K( o, b! W- p* c3 n }3 L" J0 z7 N% U; M location /images/ {4 E0 u& T% @( q2 Q! p/ ] root /usr/local/nginx/;& G6 `7 ~. s2 A- G/ L9 i- H } location ~\.(mp3|mp4) #这里利用了正则表达式 root /usr/local/nginx/media/;" C ~4 C/ @8 G8 h }9 ]7 q3 x9 X _8 P: H }- n8 ]/ h8 U* Q, x D& c8 t }" o2 q* p' G9 b- C+ m9 l, q7 `3 S4 }6 F 结果如下:
今天就暂时总结这么多吧,还有cgi和fastcgi的使用和区别,就暂时不讲了,如果哪天有用到,再来实战演示;最后如果对技术热爱的朋友,可以加我微信,进技术交流群交流学习,一起进步;一般有问题我也会及时互相交流学习的: tu18879499804: d/ A0 q+ H+ s) p- e5 n2 I. i' x站在巨人的肩膀上: https://blog.csdn.net/X1021333506/article/details/80975462?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-10.baidujs&dist_request_id=6c30ed21-fb2d-462c-a4d8-7c5581c1b504&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-10.baidujshttps://juejin.cn/post/6844903944267759624 ( _% _2 Q1 s" X8 W5 H7 U" |% X% v! K' K https://ke.qq.com/webcourse/inde ... 5285890803239999870 |
微信公众号
手机版