一、前言 最近空闲时间稍微少了点,晚上下班一般会看会书,所以更新也就没有那么快了!这不最近在看之前买的书籍(今年真的要多看点书籍): 还有音视频接口和解封装框架,我差不多快捋顺了,其实之前很多人问的接口,完全可以去ffmpeg官网查文档说明,而且上面还有很多的demo测试案例说明:. y3 r! ]! o+ l0 l' D4 j 差不多下周开始继续更新音视频的学习笔记; ' x; H4 Z% Z5 z) m' y 今天这篇文章呢,主要是总结一下过年期间复习的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.gz% L$ j- B; u) c0 A- I0 |wget 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: A2 a( q$ A! v2 P5 w* B0 Z- u9 c* b 3 n' k" X& T2 b (1)解压nginx: (2)解压openssl: (3)解压pcre: (4)解压zlib: 7 O a3 P0 C* S0 m (5)进行配置,先进入到nginx里面去,然后执行下面语句: * k' u3 G) y& a" |# d5 O/ H --with-http_realip_module6 C: a' b7 v9 J$ f1 B5 B --with-http_addition_module" {8 r1 L7 x* t --with-http_gzip_static_module; Y3 n7 n/ a( d7 |# a, _ --with-http_secure_link_module --with-http_stub_status_module --with-stream( u! p6 |7 C& u" a7 V. `( b4 u --with-pcre=/home/txp/share/nginx/pcre-8.418 q9 C) U+ z: \ --with-zlib=/home/txp/share/nginx/zlib-1.2.11 --with-openssl=/home/txp/share/nginx/openssl-1.1.0g1 h! F, {" B2 b g8 v 然后直接make:: C; R: N$ c# a 然后接着再sudo make install: 最终我们可以看到在/usr/local/nginx/目录下看到安装的nginx: 现在我们可以试着来运行nginx,并进行访问(下面的访问成功): + i: v' y T. H: I - Z# @$ w; t5 G a
这里小结一下: 很多开源软件的安装步骤大概都差不多是下面这样的套路(比如等下我们下面要安装的模块,也是这样安装的思路,所以这里就不造轮子了) -- ./cofigure -- make --sudo make install 2、自己写conf文件在平时的开发过程中,主要我们要去配置它的conf文件夹下的nginx.conf文件 root@ubuntu:/usr/local/nginx# ls. C* ]9 k! }8 j% Q: z5 F0 X' L/ Eclient_body_temp conf fastcgi_temp 2 u F9 \* e9 [ html logs proxy_temp sbin scgi_temp % X$ x) c; K! s3 J& N uwsgi_temp* `; t$ o+ \# ]2 }9 k2 g! Y" n( a " N9 g/ \6 q2 I4 h6 a5 g 这个文件原本内容是: #user nobody;worker_processes 1;/ t% t* r0 r+ \8 q2 U' B5 {/ T( {; @ #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;$ m& O Z3 d: s% E$ X }0 x3 e0 B- } |6 W : `9 A+ b/ K& s5 p) E, U W . M% X; @, H' z+ e: d( n http {. R8 t/ S& o. L) A2 n1 {1 J include mime.types;" p+ G5 O# a' B! F, I N0 D- _ default_type application/octet-stream;9 S- z7 t K3 z) N8 C) ?1 U ! Z+ d$ t- \2 W; N #log_format main '$remote_addr - $remote_user [$time_local] "$request" '3 N9 r1 U) V, H! g # '$status $body_bytes_sent "$http_referer" '. v& z2 H) H6 [; u4 J # '"$http_user_agent" "$http_x_forwarded_for"';8 W! E) G) ?' m% Z0 h 1 R3 Y/ y B( V4 E9 b% m4 h/ m #access_log logs/access.log main;- g' Y0 s7 S2 h sendfile on;: B! @3 s* ?" e; h) C% f #tcp_nopush on; ; L( y0 `9 U) c, V: c #keepalive_timeout 0;+ H- E7 f9 ?; t- Y keepalive_timeout 65; #gzip on; / Y+ L4 M/ [ q+ A6 Q7 b7 l server { listen 80; server_name localhost;$ g% f) ?( r2 y% y j - i y) k* h# c1 _# V9 e #charset koi8-r; ! r4 N6 F! R! \ Q: D #access_log logs/host.access.log main;4 L( U& ]0 s3 g3 X7 C8 o2 t location / {; \6 [" ^# Z( R' l) V' x1 j root html; index index.html index.htm; }: ?0 R! j) b0 y5 L % T% i4 K2 h* u5 w2 ~8 e #error_page 404 /404.html; ( G6 P X& Q7 N( M" ~ # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } + ?2 c6 }( t" w+ f3 N # proxy the PHP scripts to Apache listening on 127.0.0.1:801 Q' V0 ?& C8 l! T: h # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #}1 {+ {$ [ a1 D0 B& ^2 ? # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000/ H! [4 F+ C$ M& U) ~# e #/ X! d$ Z" ~: S3 f: m" o9 X #location ~ \.php$ {1 a6 D- @4 t% F1 K) D2 V # root html; # fastcgi_pass 127.0.0.1:9000;- I% T1 T- U: J" S u" m3 _ # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #}' ?2 }1 j% p) g$ C4 i$ i- w # deny access to .htaccess files, if Apache's document root* I! v5 l- t4 t+ p0 g3 f& |8 U# S& p # concurs with nginx's one" ~: P; V; k Z: X ## }7 r6 s+ s& I #location ~ /\.ht { # deny all;7 F) n9 M) U! q4 ^ #} }( p9 Y( q7 f0 i6 C7 M9 {: d6 y 7 P: V. ?& K% }5 W $ N' t G& n- B # another virtual host using mix of IP-, name-, and port-based configuration # #server {1 [( m0 N. j: F5 I: ~ # listen 8000; # listen somename:8080;: N) g8 J* P( F" K" e2 L3 \* t+ Y* k' n1 ~ # server_name somename alias another.alias; : K: t. f7 x/ g M8 _! \ # location / {" f9 U7 q6 \4 N5 l # root html;: A3 Q7 o0 Q$ b3 J9 q3 i # index index.html index.htm;& v) q, _: [& k6 ^' W3 B& K$ @ # } #} / s7 L4 V- g. @! E8 d 7 O+ s3 M K+ h3 D/ l( l+ I% d( R # HTTPS server" `6 B9 X) ]2 O) R #, X+ a1 q1 i( K #server {# V6 d0 b9 ~, E" E9 C2 L+ _+ j n # listen 443 ssl;: H- n1 U) g2 a- P # server_name localhost;6 O0 m/ t/ t6 g# o; L ) a* V! T. d8 {1 t% u$ V # ssl_certificate cert.pem; # ssl_certificate_key cert.key;7 Q9 J u2 w: \! a4 q2 ^2 \ , w0 E9 [# n2 U4 A! S # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; c1 t( p" Q' k/ O, u. p : S* U. T8 N# p/ V% \1 U" C # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; 4 {7 F* t: W- @' N0 j3 o # location / { # root html; # index index.html index.htm; # } #}2 j/ U& }; }/ r+ h4 j$ W & z. j4 B- o3 U2 a! \ }7 Z# v0 P' \* T" L. B# {8 E* U 这里内容比较多,我们现在自己来写一个配置文件来实现nginx的访问: txp@ubuntu:/usr/local/nginx$ sudo mkdir demo_conftxp@ubuntu:/usr/local/nginx$ cd demo_conf/ txp@ubuntu:/usr/local/nginx$ vim demo_conf/demo.conf worker_processes 4;#进程数量 5 x+ G3 r: n# u * T& f" H) r' m$ E- } events{ worker_connections 1024;#并发访问数量! O) z6 }9 e, M: S6 n% Y1 k) c7 f( v . Q1 e0 F. H9 X9 e- f6 @ 0 g% ]. i. w9 b( }6 @. N; p, u } http{ server {+ n: ^& l; U$ `! \( R- B. ~* p% R listen 8888;#监听端口* l6 C/ J! d& |: b, a+ i server_name localhost;#服务器名称5 n( h+ Z% r0 p# j+ c& b 6 X' K9 y' ?. e8 h( e c% D; I: h" ] client_max_body_size 100m;#访问的数量大小* e- h: Q" V. v0 l1 ]) W * }+ P- ]5 P- A/ ~3 F location / { root /usr/local/nginx/html/ #访问这个本地服务器里面的这个html页面 5 D% O7 a* `9 _/ J3 ]9 c }1 \$ P/ U$ t# e- m0 N9 m, c. n: d }* u8 b& v/ Y- _ 9 v* J5 B' N$ s) L } 现在我们来看一下我们自己配置的是否成功,先把之前的nginx关闭掉: ./sbin/nginx -s stop, u H7 [# S s: K6 h. r2 u然后再执行这个配置文件: ./sbin/nginx -c demo_conf/demo.conf0 L a4 P' S2 C/ c( F
这里扩展一下基础知识点: 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;, X% @& h; m5 v0 f! ?1 _ events{; F& k- H. Q5 y worker_connections 1024;" q; o: ^& [" G5 \( W' r3 j& { 5 [6 f/ F1 H6 l# e. U; O } http{, a! }: z; ~. J0 A- V8 c7 n) C V# Q server {( i; ]' S2 \- o5 `# _* B* R listen 8888;! D* ~0 r7 I5 ^# v server_name localhost; $ {2 P5 J1 h6 M; O+ I+ z3 } client_max_body_size 100m; - a. v( h: @0 {% ~9 G# O2 I location / {2 I- m, f+ K, c1 ^6 I) \ root /usr/local/nginx/html/; proxy_pass http://192.168.29.141; }" I) x9 w; X# c8 t" _- d } * C7 u/ k+ w( p; G }, f2 Q% Y# K/ y' e, q, a: X2 R 注意:141的那台机器也安装nginx了,然后当我访问143这台机器的时候,其实访问的是141这台机器的内容,这就是代理的使用了: -- 负载均衡:从负载均衡四个字来看,肯定是用来减轻服务器的访问压力的;比如说当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃(比如每年双十一活动,淘宝就使用了nginx的负载均衡的功能,不然当天那么多的用户活跃在淘宝上,服务器肯定吃不消啊!)。因此为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器(也就是我们的nginx),在让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器。如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。 下面我演示负载均衡案例: worker_processes 4;- m% j! g* @* ~! e0 a, v0 C6 k: c0 L% v5 S F( s6 P2 Z ( g9 s( Q# y: K2 ` events{8 F( U# ^0 I! S) d( y worker_connections 1024; ) O4 q# K! C# W2 U* {" O7 x; s. ^/ d 9 ~ D. N( M7 m- H$ f } http{ upstream backend{% }- D/ H& J' ^5 F server 192.168.29.142 weight=2;//weight表示权重5 F5 m# l$ Q R( X2 _ server 192.168.29.141 weight=1; }$ F# D* E7 N" W1 g+ ~. r6 ?+ i/ x server {1 r( _/ E- |# I3 B. k' W, [ listen 8888; server_name localhost;1 s8 p* P# J T/ h+ G4 S client_max_body_size 100m;4 A" Q2 O0 x/ { location / {+ ^9 m: m/ s: i # root /usr/local/nginx/html/;! V$ I, `3 _3 A$ I8 m( S0 W% t # proxy_pass http://192.168.29.141; proxy_pass http://backend; }( l# c4 a0 c% {* b0 I( H/ S }% Z, |+ p: w( s8 L; B r, r 8 E$ I3 q3 C( T, @! G( h }. g) o; r7 Q2 J- I& G- p6 y, U% ] 注意:权重表示被访问的更多,这里由于我三台机器都安装了nginx,所以内容显示看不出什么不同之处来,其实142的机器被访问了2次,141的机器被访问了1次,我这里有三台机器:141、142、143:
+ o- ~" O. ]- G6 |& W T K -- 访问静态资源(图片和视频) 这里我在143的机器上放了几张图片,然后在/usr/local/nginx目录下创建了一个images文件夹,然后把143机器上的图片copy到images下面来: root@ubuntu:/usr/local/nginx# ls2 A1 i* h& _+ ?; d% nclient_body_temp fastcgi_temp images proxy_temp scgi_temp vip_conf4 G8 Q) n( U6 x1 v7 W conf html logs sbin uwsgi_temp# ]$ d: e) i' y6 ` root@ubuntu:/usr/local/nginx# mv /home/txp/share/nginx/*.png images/ root@ubuntu:/usr/local/nginx# ls5 Q8 j; I- d$ Y+ X client_body_temp fastcgi_temp images proxy_temp scgi_temp vip_conf. V& p: t! A: M3 f7 o6 A$ s v conf html logs sbin uwsgi_temp1 F$ j. J1 a' q- w5 m root@ubuntu:/usr/local/nginx# cd images/ root@ubuntu:/usr/local/nginx/images# ls. D7 Y1 Y9 @( L0 @& c$ h& p0 I+ n0 Z0 L 1.png 2.png 3.png 然后进行conf文件配置: worker_processes 4;0 J$ X! Y3 E2 p; n/ f0 t' ?9 b* e/ P1 {' }" n( x9 ] events{& L% g! K6 H' G. G! x) p9 ~ worker_connections 1024; 7 W# i1 y: q$ @ }" D$ C! r2 h4 L% e/ P+ S http{+ J" n0 J( F; _$ |2 |+ _ upstream backend{ server 192.168.29.142 weight=2; server 192.168.29.141 weight=1;) f5 f0 J: M) n0 p+ U; u }# y7 o6 g! N- A' ` server { listen 8888; server_name localhost;# J* ~! o. l/ v6 D4 z! V client_max_body_size 100m;' c, L% ^% ?5 Q4 C! O0 T location / { # root /usr/local/nginx/html/;$ ?* W0 i+ a1 D0 T4 r7 |' H # proxy_pass http://192.168.29.141;, U! Z/ S; E% y/ @' j" ?% m proxy_pass http://backend;4 R9 x" d9 x" C! W, i+ O ^ } location /images/ { root /usr/local/nginx/; }! R( {) l0 p$ O( c1 x0 B 5 _5 B. d: D) _- h; i) v; } }( Y' H) c) I, Q5 ^% G# R } 实现结果如下: 下面我在演示一下视频访问,同样,我创建一个media目录,然后把143机器上的test.mp4copy到media目录来: root@ubuntu:/usr/local/nginx# mv /home/txp/share/nginx/test.mp4 media/& T+ q8 Y1 V0 f5 V2 droot@ubuntu:/usr/local/nginx# cd media/ root@ubuntu:/usr/local/nginx/media# ls$ J) y. `. ~* m test.mp4 conf文件配置: worker_processes 4;& b! f3 W/ ^2 z( r4 K events{* c9 ?: q; k) `! o0 O worker_connections 1024;8 g' u; r! B5 C) @0 v+ b, u. y5 K } http{7 d' B) s4 p7 I) H5 w2 `$ p upstream backend{) N4 J$ u6 Z1 ^. \ server 192.168.29.142 weight=2;' m( u9 w' M) _) p server 192.168.29.141 weight=1; }) j" z7 q4 F0 {6 O' W+ c f+ b server { listen 8888;; l9 E2 Q& b b+ \& y server_name localhost;) d7 C3 a: Z" x7 x client_max_body_size 100m; ) H+ V5 `% D$ G$ l3 n, a location / {% g# D* C' g3 h% C* j9 I # root /usr/local/nginx/html/; e" b9 T5 \! \ # proxy_pass http://192.168.29.141;8 W( _, }) ]6 n1 L- | proxy_pass http://backend;6 ]6 m" j2 F6 `1 w* V4 ? }# m! I' d/ _4 I B K location /images/ {2 ]1 x1 L7 n5 O& f, A root /usr/local/nginx/;4 S6 e" e9 A$ J/ S }. R. w4 p+ Z) s% l3 a location ~\.(mp3|mp4) #这里利用了正则表达式2 g4 D/ I0 y4 z% R root /usr/local/nginx/media/; } 8 _3 V$ ]6 o. U$ d: ] }% s$ {4 m; t u5 @* ^ }1 C G- P5 T* Q4 i* n1 L" ^6 a# h 结果如下: 今天就暂时总结这么多吧,还有cgi和fastcgi的使用和区别,就暂时不讲了,如果哪天有用到,再来实战演示;最后如果对技术热爱的朋友,可以加我微信,进技术交流群交流学习,一起进步;一般有问题我也会及时互相交流学习的: tu18879499804* T, t6 U. k1 e站在巨人的肩膀上: 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.baidujs5 y$ d: @1 k6 C4 _& v3 f0 p https://juejin.cn/post/68449039442677596241 K! R$ h7 w: ~: U/ {- m/ l https://ke.qq.com/webcourse/inde ... 52858908032399998707 J1 C& R- k. h! M% [ |