一、前言 最近空闲时间稍微少了点,晚上下班一般会看会书,所以更新也就没有那么快了!这不最近在看之前买的书籍(今年真的要多看点书籍): 4 s( D/ i( @, _. i# X 还有音视频接口和解封装框架,我差不多快捋顺了,其实之前很多人问的接口,完全可以去ffmpeg官网查文档说明,而且上面还有很多的demo测试案例说明:% h V; ~, x1 i& t$ A- Y: W+ l 差不多下周开始继续更新音视频的学习笔记; 今天这篇文章呢,主要是总结一下过年期间复习的nginx负载均衡一些配置简单的实战演示! 二、nginx的常见使用这里我主要演示nginx的源码安装以及相应的模块安装,然后讲解一下负载均衡的原理并通过实战来简单演示,还有静态资源的访问(比如说图片和视频的访问),关于什么是nginx,它是干什么用的,网上有很多介绍,这里我就不啰嗦了,我挑重点实战来分享! 1、nginx以及相关模块源码安装: 我们先进行源码所需要的模块& I4 n2 U3 y- r' J" U' n -- nginx-1.13.7.tar.gz -- openssl-1.1.0g.tar.gz -- pcre-8.41.tar.gz -- zlib-1.2.11.tar.gz 对应下载地址:- M! }& B6 d# F" Q* i wget http://nginx.org/download/nginx-1.13.7.tar.gzwget https://www.openssl.org/source/openssl-1.1.0g.tar.gz wget http://ftp.pcre.org/pub/pcre/pcre-8.41.tar.gz$ r4 f7 w% J: z/ ^1 f$ W wget http://www.zlib.net/zlib-1.2.11.tar.gz' `% J | S* }; P; j9 E (1)解压nginx: (2)解压openssl: (3)解压pcre: (4)解压zlib: . u% _8 X6 O7 B* k (5)进行配置,先进入到nginx里面去,然后执行下面语句: --with-http_realip_module --with-http_addition_module* h. o' K+ i0 `3 N3 H --with-http_gzip_static_module --with-http_secure_link_module 1 l/ W, ]. ~3 Z3 \# ? --with-http_stub_status_module- g4 `& @ ]8 b! h --with-stream x r% j g$ _) K; [0 v2 r# h --with-pcre=/home/txp/share/nginx/pcre-8.41 --with-zlib=/home/txp/share/nginx/zlib-1.2.11 9 q9 r3 R9 y; ~5 q. i; b --with-openssl=/home/txp/share/nginx/openssl-1.1.0g ! k( s4 z4 r" ~+ j; n# t7 X 然后直接make: 4 h# d- W* T; B 然后接着再sudo make install: 最终我们可以看到在/usr/local/nginx/目录下看到安装的nginx: 现在我们可以试着来运行nginx,并进行访问(下面的访问成功): " `& z" ]* {: E! q " x. C* V) V6 M( |, C2 G" x
这里小结一下: 很多开源软件的安装步骤大概都差不多是下面这样的套路(比如等下我们下面要安装的模块,也是这样安装的思路,所以这里就不造轮子了) -- ./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 % [4 J2 M! j9 [0 ` uwsgi_temp / a0 Z j' i4 o& n" ]) z- s 这个文件原本内容是: #user nobody;worker_processes 1; * D$ h3 k: }' v9 D7 V #error_log logs/error.log; #error_log logs/error.log notice;0 @, |/ e4 d. [) ? #error_log logs/error.log info;8 d/ d; F: c6 {7 A7 z #pid logs/nginx.pid;5 ?0 W4 A' L7 X& ] ; L" Y+ g$ P1 m6 M" E/ c* M: N events {3 _* p1 M2 Y/ ]" D worker_connections 1024;" r/ v- ^$ }: L0 r( O }$ K U" l% h* G- I1 Z1 D * m! m+ W! }/ P http {3 p( r& v# R6 I( O% p include mime.types; default_type application/octet-stream;4 L! o( z$ ]( m2 E2 O, V( Y! J$ H5 C8 T #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; # W( O1 x# z6 T. W9 s& I #access_log logs/access.log main;+ G$ X. P! ~. K' U- l5 ^ : x3 Y0 j' B9 X. J: ?( q6 }! E sendfile on; #tcp_nopush on;% ]% B( k7 K& } / Z; `- q1 w3 `/ P% c/ i #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; : p0 L: V2 ?) F% J5 C$ U7 t: H #access_log logs/host.access.log main; " q# x+ k- ] U! E8 [9 A location / { root html;) ]; P* z# t! l2 q- I ? index index.html index.htm;: [3 r5 Q, @- o& }3 U3 b/ n8 Z) z( g } #error_page 404 /404.html;6 J& ~4 n1 S6 O8 c* F% J, C6 F 1 T6 d0 {' _' s7 p # redirect server error pages to the static page /50x.html8 O, Y2 ?1 a. ]1 Q, M; M* z4 j #2 J& ^* X7 o4 \ f3 o. `! n; p7 _0 b error_page 500 502 503 504 /50x.html;1 K8 ~4 L% j0 w! ], ` location = /50x.html {5 `# }9 @ E4 i0 W! V! ~" x root html; } q5 d s1 p3 a' }; I 9 U/ C$ f% t3 r+ }2 `4 {9 U# b # proxy the PHP scripts to Apache listening on 127.0.0.1:80 #) C: K/ Y9 N% d' f7 H #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000& _7 @- |8 J4 `4 ?' F9 Q #) e9 x( ]. ?8 @' o! Q #location ~ \.php$ {/ m- j, k, k' Y Q # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;( s$ r9 `4 |- k" b # include fastcgi_params; #} - y$ w) H) p4 ] # deny access to .htaccess files, if Apache's document root # concurs with nginx's one #! D( v! I8 M- U' k8 _ #location ~ /\.ht { # deny all; #} }( n% f+ T! X& e) M - x4 g4 W* o% i; P x2 a # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000;2 E) B9 V3 d% I# S" B# _ # listen somename:8080; # server_name somename alias another.alias;- h9 z: I1 X7 l# \( g1 [+ x # location / {9 n ]1 x7 h( y' T, d" I7 w # root html;/ T) C4 v8 @9 Y4 V/ n. ^( w6 C3 T0 R6 a # index index.html index.htm;8 \2 j( L( L& o/ b9 M$ O5 J, l # }! m1 x f' \/ d; m! O: l- Y1 A: T; ^ #}; u2 W3 }) F: Z 1 J6 @3 o7 S% C $ Y( R) M4 W0 {9 T, ]( { # HTTPS server( v# |4 J8 n9 y& z/ ~ #) l/ X" y& D+ o* }( N #server {1 z0 h; [" I! M: D( B. `9 ~$ N: g # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem;) U, B5 S) ?1 }. ] # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m;& h* U* L3 ^* Q1 a8 D # ssl_session_timeout 5m;0 S; ^- ~; @0 U4 |( i8 Z # ssl_ciphers HIGH:!aNULL:!MD5;2 J6 Q- T; h+ H7 U # ssl_prefer_server_ciphers on; * u4 z& `4 r" t; p4 E, S+ n6 _ # location / { # root html; # index index.html index.htm; # }: b$ C8 W6 G2 Q& m: u6 a* m #} } 这里内容比较多,我们现在自己来写一个配置文件来实现nginx的访问: txp@ubuntu:/usr/local/nginx$ sudo mkdir demo_conftxp@ubuntu:/usr/local/nginx$ cd demo_conf/' K; z$ P6 S" r" `8 |( h/ d txp@ubuntu:/usr/local/nginx$ vim demo_conf/demo.conf# s8 I y4 f( O% u2 H% i worker_processes 4;#进程数量4 E2 a" r! b3 c& C6 Q# U, K, r 8 y* [( b% z( T 6 {: T: ]8 L4 g, f events{% u+ J+ d1 A! v1 _6 Q worker_connections 1024;#并发访问数量 7 ~5 n4 _9 N5 _# x" v2 X8 b }- c' \% A* Q" D1 o http{+ F' C2 g5 h* c+ z0 W4 [ server {6 @2 Q% H6 g9 C3 ]! d3 U8 a- L listen 8888;#监听端口; j) a$ b) j7 r4 U server_name localhost;#服务器名称- \+ u0 R8 D! o3 U7 F ' T% C7 j/ D4 \! B1 M( o) V client_max_body_size 100m;#访问的数量大小3 F Y q, g o8 T( E. I$ N 1 N, {1 L/ Z, l location / { root /usr/local/nginx/html/ #访问这个本地服务器里面的这个html页面5 Y- T' O" n Q' U, `% g/ v }# X; w2 H+ g) D } }$ K* c6 y* k r8 N9 z 现在我们来看一下我们自己配置的是否成功,先把之前的nginx关闭掉: ./sbin/nginx -s stop然后再执行这个配置文件: ./sbin/nginx -c demo_conf/demo.conf
这里扩展一下基础知识点: 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;* M8 c' q/ [% n9 ]" z) K. z' g- A! V1 c, A( p5 I events{1 D T4 u5 L8 p/ i# s worker_connections 1024; }9 z( u+ N8 }: V3 ` http{4 q- f5 J9 n5 k/ y0 T. l server { listen 8888;0 r( Z2 K: x/ G/ J server_name localhost; client_max_body_size 100m;0 G2 |$ x" O* e. g; [/ u6 ?) B6 u( } ' s, J% l3 J N7 M# s location / {# O9 D" {) |" o% ]4 h+ }6 { root /usr/local/nginx/html/; proxy_pass http://192.168.29.141;+ R2 N9 h) N! u7 `5 k }8 a6 N4 v% L, N$ o6 E9 p }& s/ {. t3 Q! K" C% v) [5 B 4 _5 Z2 O/ F+ [ J# M }: d6 {, H8 B5 O& w( x9 v 注意:141的那台机器也安装nginx了,然后当我访问143这台机器的时候,其实访问的是141这台机器的内容,这就是代理的使用了: -- 负载均衡:从负载均衡四个字来看,肯定是用来减轻服务器的访问压力的;比如说当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃(比如每年双十一活动,淘宝就使用了nginx的负载均衡的功能,不然当天那么多的用户活跃在淘宝上,服务器肯定吃不消啊!)。因此为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器(也就是我们的nginx),在让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器。如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。 下面我演示负载均衡案例: worker_processes 4;( B" _ M5 ?& D/ u. {! r* W% A" E events{2 \% I- E% r) M+ K9 U worker_connections 1024; 5 a* u4 y0 ]. |) }; h } http{ upstream backend{ server 192.168.29.142 weight=2;//weight表示权重. y" m# o0 ?9 r* ^ M6 J/ } server 192.168.29.141 weight=1; } server {5 p: X4 P6 i$ o* b, O" x listen 8888;6 \0 j3 r3 d% M server_name localhost;6 C, m* P4 a9 e 5 ~2 @* B* v* I% F$ q% }3 S client_max_body_size 100m;4 |3 c9 {2 _( N, V/ [6 N! o! I location / {. @6 j# X9 |. p e; x$ U# ] # root /usr/local/nginx/html/;3 G! }# ^7 {& Z& A V$ ^. t # proxy_pass http://192.168.29.141;4 m$ C' D5 x4 n3 v6 D& i proxy_pass http://backend; } } } 注意:权重表示被访问的更多,这里由于我三台机器都安装了nginx,所以内容显示看不出什么不同之处来,其实142的机器被访问了2次,141的机器被访问了1次,我这里有三台机器:141、142、143:
, }8 t, N- F8 s+ y1 F. Y+ k -- 访问静态资源(图片和视频) 这里我在143的机器上放了几张图片,然后在/usr/local/nginx目录下创建了一个images文件夹,然后把143机器上的图片copy到images下面来: root@ubuntu:/usr/local/nginx# ls* b8 X) I; i1 k- O% ] `) j! iclient_body_temp fastcgi_temp images proxy_temp scgi_temp vip_conf7 A8 ]7 W7 _& m1 o! O6 N; h- c conf html logs sbin uwsgi_temp; a6 ?2 ?5 j* O5 p5 E& R root@ubuntu:/usr/local/nginx# mv /home/txp/share/nginx/*.png images/ root@ubuntu:/usr/local/nginx# ls1 H8 {) _9 y0 j4 J4 Q! i5 _ X* n client_body_temp fastcgi_temp images proxy_temp scgi_temp vip_conf0 i+ V4 j" n. l2 @8 w conf html logs sbin uwsgi_temp8 y3 j+ n. s+ }" k1 X root@ubuntu:/usr/local/nginx# cd images/ root@ubuntu:/usr/local/nginx/images# ls) K. s, O: x& c' g) ?1 ~ 1.png 2.png 3.png9 z' p0 L; Z4 q, Z 然后进行conf文件配置: worker_processes 4;: Y' m1 ^% q' `# {( \( u6 ^events{ worker_connections 1024; $ }- t# M$ |: U0 P2 [+ ?% N } http{ upstream backend{ server 192.168.29.142 weight=2; server 192.168.29.141 weight=1;# V: ?, S* t6 L( L5 `8 W }1 t+ m; f+ O" J9 n0 J& o2 K, m+ C: s server {7 f! D* W) x# q2 y( D listen 8888;* H# u K! m- a% [' Z server_name localhost; client_max_body_size 100m;( W6 N9 }. A V' R3 c7 P1 r location / { # root /usr/local/nginx/html/; # proxy_pass http://192.168.29.141;$ N: v: \0 l/ j& W proxy_pass http://backend; } location /images/ {6 n- A: i% B( D6 O4 [ root /usr/local/nginx/;; L. |2 l% d) G }; I/ |; b2 {: v# @% D4 m } }4 H! v) ^3 `7 S, u, y 实现结果如下: 下面我在演示一下视频访问,同样,我创建一个media目录,然后把143机器上的test.mp4copy到media目录来: root@ubuntu:/usr/local/nginx# mv /home/txp/share/nginx/test.mp4 media/root@ubuntu:/usr/local/nginx# cd media/- t7 z6 U8 B- A( f# n8 b I/ H5 d0 Q root@ubuntu:/usr/local/nginx/media# ls5 c- V0 X3 M6 A3 D8 L# u test.mp4# o' {( {1 f, T# T+ [ conf文件配置: worker_processes 4;F' Z7 h. [) k+ @ P ) M5 t5 m6 v1 Y- R6 \ events{% ?0 l) e. V: t! c* f$ J worker_connections 1024;, p; c% |- F+ r0 ^7 c3 k }. C @ U6 r" Q http{4 o% W. z3 z* l2 n$ V- T1 o: U upstream backend{ server 192.168.29.142 weight=2;7 Y% c1 N7 k/ I% i: c1 u( q server 192.168.29.141 weight=1;' Y+ K4 Y# J7 t- z9 c } server { listen 8888;: A0 s" F* ?0 b. g, e( I6 P server_name localhost; * e# S0 _0 O1 j; r client_max_body_size 100m;; _+ s- ]: G |' [ location / {4 G' T# X1 }7 o& P4 i! z% S # root /usr/local/nginx/html/; # proxy_pass http://192.168.29.141;- V- f0 Q* w+ `! I4 I proxy_pass http://backend; } location /images/ {! l% i6 G7 X- t2 o9 r, H. M root /usr/local/nginx/;+ h) j; I$ }1 W5 e. O& Y }! D8 z J, T4 ^! n3 h location ~\.(mp3|mp4) #这里利用了正则表达式9 I- j, U% e( }! F0 a root /usr/local/nginx/media/; } 2 o2 C9 A) P! l. C0 _' M( n% V }) D- U. n1 e8 E8 ^# p* f9 d }0 H4 w% E% c5 Y; @* |; a0 j# B 结果如下: 今天就暂时总结这么多吧,还有cgi和fastcgi的使用和区别,就暂时不讲了,如果哪天有用到,再来实战演示;最后如果对技术热爱的朋友,可以加我微信,进技术交流群交流学习,一起进步;一般有问题我也会及时互相交流学习的: tu18879499804站在巨人的肩膀上: 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.baidujs* o; }* |9 ] C) p1 H6 `5 y4 @) c7 f1 A https://juejin.cn/post/6844903944267759624* |, S C; n7 ?" \0 @. m https://ke.qq.com/webcourse/inde ... 5285890803239999870 |