一、前言 最近空闲时间稍微少了点,晚上下班一般会看会书,所以更新也就没有那么快了!这不最近在看之前买的书籍(今年真的要多看点书籍): 还有音视频接口和解封装框架,我差不多快捋顺了,其实之前很多人问的接口,完全可以去ffmpeg官网查文档说明,而且上面还有很多的demo测试案例说明:2 P! ?+ j( Z+ h 差不多下周开始继续更新音视频的学习笔记; ! w9 M6 a* ]+ I! ?. {( J( W 今天这篇文章呢,主要是总结一下过年期间复习的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.gz2 A# i/ X/ u5 }" b2 ]9 a t1 Owget 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 (1)解压nginx: (2)解压openssl: (3)解压pcre: (4)解压zlib: (5)进行配置,先进入到nginx里面去,然后执行下面语句: ) S/ s5 f; t% a! M8 P N --with-http_realip_module --with-http_addition_module --with-http_gzip_static_module5 E5 S2 Q# {4 H! {$ Z2 z' |; j --with-http_secure_link_module --with-http_stub_status_module --with-stream4 F8 v) t5 n' ]# R; _ --with-pcre=/home/txp/share/nginx/pcre-8.41+ a* A, g0 @4 [) H! h, }) O --with-zlib=/home/txp/share/nginx/zlib-1.2.11 --with-openssl=/home/txp/share/nginx/openssl-1.1.0g 然后直接make:$ \1 ?0 P- f0 ^. P3 E7 R. c 然后接着再sudo make install: 最终我们可以看到在/usr/local/nginx/目录下看到安装的nginx: 现在我们可以试着来运行nginx,并进行访问(下面的访问成功): + n+ |8 B' @5 h+ n& n: u1 {. m
这里小结一下: 很多开源软件的安装步骤大概都差不多是下面这样的套路(比如等下我们下面要安装的模块,也是这样安装的思路,所以这里就不造轮子了) -- ./cofigure -- make --sudo make install 2、自己写conf文件在平时的开发过程中,主要我们要去配置它的conf文件夹下的nginx.conf文件 root@ubuntu:/usr/local/nginx# ls0 a. E0 o3 ]1 _) i+ cclient_body_temp conf fastcgi_temp & V6 v, ~( p- V html logs proxy_temp sbin scgi_temp uwsgi_temp* D/ p4 t2 r) s, z 4 a. i" m( U# h) Y) i! t 这个文件原本内容是: #user nobody;worker_processes 1; #error_log logs/error.log;/ q0 W6 W, _) o0 }, j2 s #error_log logs/error.log notice; #error_log logs/error.log info;, S& r q3 q% F) W0 S) a4 r9 T! L 3 |9 C* Q. e" p; c/ l #pid logs/nginx.pid;( G {% Z2 F/ p# o! B5 O # K9 l( W$ i5 ?0 g. x events {, u8 f* _% g; V4 _4 z; k# F4 v" m worker_connections 1024;8 H# h/ w2 u( Q6 L6 q } 6 x3 |6 G2 [2 f. h; |/ F" h( K http {$ z3 i4 c) A$ K c include mime.types; default_type application/octet-stream;& t2 ?1 `' v; B0 w #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; ) r6 C9 G9 m2 ]3 c2 e sendfile on;' P* U/ R7 n7 c6 H/ O! C6 F( \! W i #tcp_nopush on; #keepalive_timeout 0;* n, ^: d' \3 V keepalive_timeout 65; ( V5 K6 m, k) d) G8 e3 _6 z #gzip on; server {% J; \* ?5 j6 n listen 80; server_name localhost; 2 R9 P4 k$ e% @" j- _ #charset koi8-r;4 u" |% T2 O8 m# y9 ] C/ h #access_log logs/host.access.log main;- h% L( S0 Z D0 i location / {- K! i1 y3 \7 m" o* A1 ? root html; index index.html index.htm; }3 ?1 O% I) W. c! }. g" ]. ] 6 w9 J9 G9 ^8 x& J% {, h. z% ^ #error_page 404 /404.html; - Z# U* R) n+ Y8 ?8 h+ R. q # redirect server error pages to the static page /50x.html6 M7 N+ m1 i& H: S q # error_page 500 502 503 504 /50x.html;% X* Q" m- v( s location = /50x.html { root html; } 1 ^7 B) B0 x! ]2 u # proxy the PHP scripts to Apache listening on 127.0.0.1:801 i* j) u9 r$ M. @' Q5 s # #location ~ \.php$ {) J. [2 S! t9 o0 M# t& O3 G( y # proxy_pass http://127.0.0.1;5 H" m) D& G9 ]8 d- d; c, g, ~ #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000! z2 a# M- Z) a" U7 f& S # #location ~ \.php$ { # root html;/ P- a4 j( S, x8 ^5 R3 I # fastcgi_pass 127.0.0.1:9000;! q, H i3 L. I; K' c/ l # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;0 i+ O" @7 g8 j! ~% s! a # include fastcgi_params;9 x. _5 K( }; k& s1 d2 I #} 4 H. t! L" y6 t' n- W # deny access to .htaccess files, if Apache's document root4 T8 z: D9 L; b) m# j( V/ [5 c; q # concurs with nginx's one% Z# z: T4 r- e4 M3 r. A" X+ x/ k9 _: P # #location ~ /\.ht {1 t( w# h9 i; Y7 }3 D # deny all; #} }4 z3 J; x8 R; J9 v 6 p" }$ k3 z5 a/ b, e # another virtual host using mix of IP-, name-, and port-based configuration: Z) B* J* P; A% _, ^; x* a# {+ q # #server { # listen 8000;6 a F% e. V7 @; }6 ~2 k # listen somename:8080;* @9 Y& P y4 l3 J # server_name somename alias another.alias;: ?: T/ M% V: s% d; r5 A! R+ W ( v- _& N+ {; @- x, i( j% _ # location / { # root html; # index index.html index.htm; # }0 P' l2 T8 ?/ ^5 o1 p! M #} / B/ v2 A& @. L& r4 ~; c # HTTPS server& r7 a9 U2 ]3 e #& t% J2 |7 @1 ?9 d0 r+ h4 C #server { # listen 443 ssl;, q e8 u/ \3 I: ^ # server_name localhost;: S5 U: l+ F S! M2 d # ssl_certificate cert.pem; # ssl_certificate_key cert.key;1 C% ~; D) ]8 I7 h# f8 {; h8 k * ?; w2 y/ `! k0 W6 S, Y # ssl_session_cache shared:SSL:1m;9 {) ~# ]9 l/ m # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on;+ k: [7 F, e8 E! N* [/ {$ [ # location / { # root html; # index index.html index.htm; # }6 S }6 h5 [: r$ B #} ( N0 ^8 y! |+ P } 这里内容比较多,我们现在自己来写一个配置文件来实现nginx的访问: txp@ubuntu:/usr/local/nginx$ sudo mkdir demo_conftxp@ubuntu:/usr/local/nginx$ cd demo_conf/) d" x. L/ R- v$ p! e% E txp@ubuntu:/usr/local/nginx$ vim demo_conf/demo.conf+ @, a! f, H" k$ W worker_processes 4;#进程数量 2 O& f% T! \+ \" ?6 \ events{* L0 j3 m0 I6 j9 L worker_connections 1024;#并发访问数量0 i9 c v1 p% W$ F( p! h 8 X- j% V+ M; [0 B: t- v ( i) W8 `% y1 o }# A4 O% K. Q8 Q& E$ g$ ` http{ server {3 V9 x" }; m: V4 D* D. ^" ^" Z9 c. u listen 8888;#监听端口 server_name localhost;#服务器名称 client_max_body_size 100m;#访问的数量大小! O- W0 o3 x0 m- }' X 1 J: ^# ~: t5 N$ \+ X3 w) _" w) K, _ location / { root /usr/local/nginx/html/ #访问这个本地服务器里面的这个html页面 } } }5 e7 w. E/ E. O$ d3 ~ 现在我们来看一下我们自己配置的是否成功,先把之前的nginx关闭掉: ./sbin/nginx -s stop然后再执行这个配置文件: ./sbin/nginx -c demo_conf/demo.conf, Q/ |, J+ V6 `+ a- Y# m' b5 y
这里扩展一下基础知识点: 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;0 G& X8 ?) y2 E# n/ r + A$ Q4 ~1 y0 K2 L P( Z: b events{ worker_connections 1024; 7 L2 `$ `* `: J 0 i* P+ t: M& `! I" G1 J }4 Y0 i4 `4 s8 F0 y2 J* s D2 ^ http{, @1 A; x) ^+ L6 r M( |- N6 [* s server {6 _8 i% h( @% ]$ s6 p listen 8888; server_name localhost;+ V4 V$ c; h, r2 q! j client_max_body_size 100m; location / { root /usr/local/nginx/html/; proxy_pass http://192.168.29.141;2 l5 t9 P* S0 l$ v r$ r } }/ s. @. y, i! X$ W ; F. o$ B! a. N- ? } 注意:141的那台机器也安装nginx了,然后当我访问143这台机器的时候,其实访问的是141这台机器的内容,这就是代理的使用了: -- 负载均衡:从负载均衡四个字来看,肯定是用来减轻服务器的访问压力的;比如说当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃(比如每年双十一活动,淘宝就使用了nginx的负载均衡的功能,不然当天那么多的用户活跃在淘宝上,服务器肯定吃不消啊!)。因此为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器(也就是我们的nginx),在让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器。如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。 下面我演示负载均衡案例: worker_processes 4;1 s: u+ A9 e. }; d4 ?+ l events{- o5 h' j0 |9 ?, a worker_connections 1024; }4 l( o+ g4 y" j( F http{8 o9 u0 X+ J" n- ~ upstream backend{ server 192.168.29.142 weight=2;//weight表示权重 server 192.168.29.141 weight=1; } server {) W: Q- j0 D8 \- l listen 8888; }5 l$ I1 Y8 ]* r server_name localhost;* F/ U! ~$ Y S" X2 [) j: W( W! x . t9 n8 h- b3 a5 c client_max_body_size 100m;# b1 F( G! }) [/ f# G" C$ K location / { # root /usr/local/nginx/html/;0 m( |9 {" z$ _# ~" | # proxy_pass http://192.168.29.141; proxy_pass http://backend;8 _* m3 R( Z3 U }1 K* g" W; a) P; }" Y }+ |; w( ~0 J' r3 n0 \" P8 x, Z8 X }: s) b& s# q# ~6 }& N9 n1 j 注意:权重表示被访问的更多,这里由于我三台机器都安装了nginx,所以内容显示看不出什么不同之处来,其实142的机器被访问了2次,141的机器被访问了1次,我这里有三台机器:141、142、143:
-- 访问静态资源(图片和视频) 这里我在143的机器上放了几张图片,然后在/usr/local/nginx目录下创建了一个images文件夹,然后把143机器上的图片copy到images下面来: root@ubuntu:/usr/local/nginx# lsclient_body_temp fastcgi_temp images proxy_temp scgi_temp vip_conf5 c" P/ u6 a* T# Q- e4 b) g6 l6 D0 n conf html logs sbin uwsgi_temp root@ubuntu:/usr/local/nginx# mv /home/txp/share/nginx/*.png images/. ^2 K1 O! n0 m2 A root@ubuntu:/usr/local/nginx# ls! H/ V4 c" @& ]) J client_body_temp fastcgi_temp images proxy_temp scgi_temp vip_conf( E5 F* ?# m1 N& a2 ?3 U( D' j' N, f conf html logs sbin uwsgi_temp root@ubuntu:/usr/local/nginx# cd images/ root@ubuntu:/usr/local/nginx/images# ls 1.png 2.png 3.png6 I$ m7 M$ T; }. @7 W0 M6 T 然后进行conf文件配置: worker_processes 4;events{ worker_connections 1024; }( e, \8 @7 `5 ^ _, G- I http{8 B/ ] Y" B: N {: ?: `" K upstream backend{+ E: W2 u5 W: L9 }! T V9 R6 D server 192.168.29.142 weight=2; server 192.168.29.141 weight=1;/ P* ?1 |5 p/ |5 _( ?$ H, q }8 ]1 B% T5 q6 G6 M* V server {$ o0 N) [+ ]2 d' D1 I listen 8888;% ]/ ], K0 |( d7 B9 t7 h server_name localhost; client_max_body_size 100m; location / { # root /usr/local/nginx/html/; # proxy_pass http://192.168.29.141; proxy_pass http://backend; }8 }4 S1 L/ n) a V! O+ l location /images/ { root /usr/local/nginx/;& g% N& N9 n9 G1 ~' X: x }6 P- f) r7 t7 ^ , z) ?4 O. K- \% M/ h* I( _/ p3 S! q } }6 W& j! X. b$ Q, H 实现结果如下: 下面我在演示一下视频访问,同样,我创建一个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/ root@ubuntu:/usr/local/nginx/media# ls test.mp42 F6 n8 e Z( j" g8 q, N conf文件配置: worker_processes 4;5 \; {% T; |$ j4 h L5 a events{6 C% A/ I1 Q5 r2 l4 a5 s1 n worker_connections 1024;2 m9 ^; _" y! | } http{, F. f3 H+ m. Z" i% P7 w, ~ upstream backend{1 \# k: c5 W" `3 p server 192.168.29.142 weight=2;! x( W# g6 y6 u; ]$ `. f, m server 192.168.29.141 weight=1; } server {6 N- n6 N/ ^: b U8 Q3 G listen 8888;" T4 T* ]" w" \8 _9 O server_name localhost; client_max_body_size 100m;2 e2 Y& }. t- d- m! O6 C8 B 8 Q2 q" J, N2 c# g& A location / { # root /usr/local/nginx/html/;* N6 H+ p. T/ I. Q9 x # proxy_pass http://192.168.29.141;: S2 a2 A! ?! \% N. g. V) k/ W proxy_pass http://backend;3 v* d3 K, n# J& F }- I: ~1 O% f$ I' ~ location /images/ { root /usr/local/nginx/;& X4 g" n7 A8 s, _- \ } location ~\.(mp3|mp4) #这里利用了正则表达式 root /usr/local/nginx/media/;7 d" W1 [5 I: l }* j Z+ d- j; `; L# t+ W : h3 B6 h. D0 V0 y# R# d3 }+ p }5 E1 O& a( a7 f3 ]+ a/ ^ }! G! I0 Q: ^; ^ 结果如下: 今天就暂时总结这么多吧,还有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.baidujshttps://juejin.cn/post/6844903944267759624* p# A0 P3 B# d4 ? https://ke.qq.com/webcourse/inde ... 5285890803239999870) [$ s1 _7 m T$ _1 u |