|
|
|
|
公众号矩阵

Nginx之静态资源访问和负载均衡的使用!

今天这篇文章呢,主要是总结一下过年期间复习的nginx负载均衡一些配置简单的实战演示!

作者: txp 来源: txp玩Linu|2021-03-01 06:15

本文转载自微信公众号「txp玩Linux」,作者txp。转载本文请联系txp玩Linux公众号。 

一、前言

最近空闲时间稍微少了点,晚上下班一般会看会书,所以更新也就没有那么快了!

还有音视频接口和解封装框架,我差不多快捋顺了,其实之前很多人问的接口,完全可以去ffmpeg官网查文档说明,而且上面还有很多的demo测试案例说明:

差不多下周开始继续更新音视频的学习笔记;

今天这篇文章呢,主要是总结一下过年期间复习的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

对应下载地址:

  1. wget http://nginx.org/download/nginx-1.13.7.tar.gz 
  2. wget https://www.openssl.org/source/openssl-1.1.0g.tar.gz 
  3. wget http://ftp.pcre.org/pub/pcre/pcre-8.41.tar.gz 
  4. wget http://www.zlib.net/zlib-1.2.11.tar.gz 

(1)解压nginx:

(2)解压openssl:

(3)解压pcre:

(4)解压zlib:

(5)进行配置,先进入到nginx里面去,然后执行下面语句:

  1. ./configure --prefix=/usr/local/nginx  
  2. --with-http_realip_module 
  3. --with-http_addition_module 
  4. --with-http_gzip_static_module 
  5. --with-http_secure_link_module  
  6. --with-http_stub_status_module 
  7. --with-stream 
  8. --with-pcre=/home/txp/share/nginx/pcre-8.41 
  9. --with-zlib=/home/txp/share/nginx/zlib-1.2.11  
  10. --with-openssl=/home/txp/share/nginx/openssl-1.1.0g 

然后直接make:

然后接着再sudo make install:

最终我们可以看到在/usr/local/nginx/目录下看到安装的nginx:

现在我们可以试着来运行nginx,并进行访问(下面的访问成功):

这里小结一下:

很多开源软件的安装步骤大概都差不多是下面这样的套路(比如等下我们下面要安装的模块,也是这样安装的思路,所以这里就不造轮子了)

  • -- ./cofigure
  • -- make
  • --sudo make install

2、自己写conf文件

在平时的开发过程中,主要我们要去配置它的conf文件夹下的nginx.conf文件

  1. root@ubuntu:/usr/local/nginx# ls 
  2. client_body_temp  conf  fastcgi_temp  
  3. html  logs  proxy_temp  sbin  scgi_temp  
  4. uwsgi_temp 

这个文件原本内容是:

  1. #user  nobody; 
  2. worker_processes  1; 
  3.  
  4. #error_log  logs/error.log; 
  5. #error_log  logs/error.log  notice; 
  6. #error_log  logs/error.log  info; 
  7.  
  8. #pid        logs/nginx.pid; 
  9.  
  10.  
  11. events { 
  12.     worker_connections  1024; 
  13.  
  14.  
  15. http { 
  16.     include       mime.types; 
  17.     default_type  application/octet-stream; 
  18.  
  19.     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ' 
  20.     #                  '$status $body_bytes_sent "$http_referer" ' 
  21.     #                  '"$http_user_agent" "$http_x_forwarded_for"'
  22.  
  23.     #access_log  logs/access.log  main; 
  24.  
  25.     sendfile        on
  26.     #tcp_nopush     on
  27.  
  28.     #keepalive_timeout  0; 
  29.     keepalive_timeout  65; 
  30.  
  31.     #gzip  on
  32.  
  33.     server { 
  34.         listen       80; 
  35.         server_name  localhost; 
  36.  
  37.         #charset koi8-r; 
  38.  
  39.         #access_log  logs/host.access.log  main; 
  40.  
  41.         location / { 
  42.             root   html; 
  43.             index  index.html index.htm; 
  44.         } 
  45.  
  46.         #error_page  404              /404.html; 
  47.  
  48.         # redirect server error pages to the static page /50x.html 
  49.         # 
  50.         error_page   500 502 503 504  /50x.html; 
  51.         location = /50x.html { 
  52.             root   html; 
  53.         } 
  54.  
  55.         # proxy the PHP scripts to Apache listening on 127.0.0.1:80 
  56.         # 
  57.         #location ~ \.php$ { 
  58.         #    proxy_pass   http://127.0.0.1; 
  59.         #} 
  60.  
  61.         # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 
  62.         # 
  63.         #location ~ \.php$ { 
  64.         #    root           html; 
  65.         #    fastcgi_pass   127.0.0.1:9000; 
  66.         #    fastcgi_index  index.php; 
  67.         #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name; 
  68.         #    include        fastcgi_params; 
  69.         #} 
  70.  
  71.         # deny access to .htaccess files, if Apache's document root 
  72.         # concurs with nginx's one 
  73.         # 
  74.         #location ~ /\.ht { 
  75.         #    deny  all
  76.         #} 
  77.     } 
  78.  
  79.  
  80.     # another virtual host using mix of IP-, name-, and port-based configuration 
  81.     # 
  82.     #server { 
  83.     #    listen       8000; 
  84.     #    listen       somename:8080; 
  85.     #    server_name  somename  alias  another.alias; 
  86.  
  87.     #    location / { 
  88.     #        root   html; 
  89.     #        index  index.html index.htm; 
  90.     #    } 
  91.     #} 
  92.  
  93.  
  94.     # HTTPS server 
  95.     # 
  96.     #server { 
  97.     #    listen       443 ssl; 
  98.     #    server_name  localhost; 
  99.  
  100.     #    ssl_certificate      cert.pem; 
  101.     #    ssl_certificate_key  cert.key
  102.  
  103.     #    ssl_session_cache    shared:SSL:1m; 
  104.     #    ssl_session_timeout  5m; 
  105.  
  106.     #    ssl_ciphers  HIGH:!aNULL:!MD5; 
  107.     #    ssl_prefer_server_ciphers  on
  108.  
  109.     #    location / { 
  110.     #        root   html; 
  111.     #        index  index.html index.htm; 
  112.     #    } 
  113.     #} 
  114.  

这里内容比较多,我们现在自己来写一个配置文件来实现nginx的访问:

  1. txp@ubuntu:/usr/local/nginx$ sudo mkdir demo_conf 
  2. txp@ubuntu:/usr/local/nginx$ cd demo_conf/ 
  3. txp@ubuntu:/usr/local/nginx$ vim demo_conf/demo.conf 
  1. worker_processes 4;#进程数量 
  2.  
  3.  
  4. events{ 
  5.         worker_connections 1024;#并发访问数量 
  6.  
  7.  
  8. http{ 
  9.         server { 
  10.                 listen 8888;#监听端口 
  11.                 server_name localhost;#服务器名称 
  12.  
  13.                 client_max_body_size 100m;#访问的数量大小 
  14.  
  15.                 location / { 
  16.                 root /usr/local/nginx/html/ #访问这个本地服务器里面的这个html页面 
  17.  
  18.                 } 
  19.         } 
  20.  

现在我们来看一下我们自己配置的是否成功,先把之前的nginx关闭掉:

  1. ./sbin/nginx -s stop 

然后再执行这个配置文件:

  1. ./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这台机器):

  1. worker_processes 4; 
  2.  
  3.  
  4. events{ 
  5.         worker_connections 1024; 
  6.  
  7.  
  8. http{ 
  9.         server { 
  10.                 listen 8888; 
  11.                 server_name localhost; 
  12.  
  13.                 client_max_body_size 100m; 
  14.  
  15.                 location / { 
  16.                 root /usr/local/nginx/html/; 
  17.                 proxy_pass http://192.168.29.141; 
  18.                 } 
  19.         } 
  20.  

注意:141的那台机器也安装nginx了,然后当我访问143这台机器的时候,其实访问的是141这台机器的内容,这就是代理的使用了:

-- 负载均衡:从负载均衡四个字来看,肯定是用来减轻服务器的访问压力的;比如说当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃(比如每年双十一活动,淘宝就使用了nginx的负载均衡的功能,不然当天那么多的用户活跃在淘宝上,服务器肯定吃不消啊!)。因此为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器(也就是我们的nginx),在让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器。如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。

下面我演示负载均衡案例:

  1. worker_processes 4; 
  2.  
  3.  
  4. events{ 
  5.         worker_connections 1024; 
  6.  
  7.  
  8. http{ 
  9.         upstream backend{ 
  10.                 server 192.168.29.142 weight=2;//weight表示权重 
  11.                 server 192.168.29.141 weight=1; 
  12.         } 
  13.         server { 
  14.                 listen 8888; 
  15.                 server_name localhost; 
  16.  
  17.                 client_max_body_size 100m; 
  18.  
  19.                 location / { 
  20.              #   root /usr/local/nginx/html/; 
  21.         #       proxy_pass http://192.168.29.141; 
  22.                 proxy_pass http://backend; 
  23.                 } 
  24.         } 
  25.  

注意:权重表示被访问的更多,这里由于我三台机器都安装了nginx,所以内容显示看不出什么不同之处来,其实142的机器被访问了2次,141的机器被访问了1次,我这里有三台机器:141、142、143:

-- 访问静态资源(图片和视频)

这里我在143的机器上放了几张图片,然后在/usr/local/nginx目录下创建了一个images文件夹,然后把143机器上的图片copy到images下面来:

  1. root@ubuntu:/usr/local/nginx# ls 
  2. client_body_temp  fastcgi_temp  images  proxy_temp  scgi_temp   vip_conf 
  3. conf              html          logs    sbin        uwsgi_temp 
  4.  
  5. root@ubuntu:/usr/local/nginx# mv /home/txp/share/nginx/*.png images/ 
  6. root@ubuntu:/usr/local/nginx# ls 
  7. client_body_temp  fastcgi_temp  images  proxy_temp  scgi_temp   vip_conf 
  8. conf              html          logs    sbin        uwsgi_temp 
  9. root@ubuntu:/usr/local/nginx# cd images/ 
  10. root@ubuntu:/usr/local/nginx/images# ls 
  11. 1.png  2.png  3.png 

然后进行conf文件配置:

  1. worker_processes 4; 
  2.  
  3.  
  4. events{ 
  5.         worker_connections 1024; 
  6.  
  7.  
  8. http{ 
  9.         upstream backend{ 
  10.                 server 192.168.29.142 weight=2; 
  11.                 server 192.168.29.141 weight=1; 
  12.         } 
  13.         server { 
  14.                 listen 8888; 
  15.                 server_name localhost; 
  16.  
  17.                 client_max_body_size 100m; 
  18.  
  19.                 location / { 
  20.              #   root /usr/local/nginx/html/; 
  21.         #       proxy_pass http://192.168.29.141; 
  22.                 proxy_pass http://backend; 
  23.                 } 
  24.                 location /images/ { 
  25.                 root /usr/local/nginx/; 
  26.                 } 
  27.  
  28.         } 

实现结果如下:

下面我在演示一下视频访问,同样,我创建一个media目录,然后把143机器上的test.mp4copy到media目录来:

  1. root@ubuntu:/usr/local/nginx# mv /home/txp/share/nginx/test.mp4  media/ 
  2. root@ubuntu:/usr/local/nginx# cd media/ 
  3. root@ubuntu:/usr/local/nginx/media# ls 
  4. test.mp4 

conf文件配置:

  1. worker_processes 4; 
  2.  
  3.  
  4. events{ 
  5.         worker_connections 1024; 
  6.  
  7.  
  8. http{ 
  9.         upstream backend{ 
  10.                 server 192.168.29.142 weight=2; 
  11.                 server 192.168.29.141 weight=1; 
  12.         } 
  13.         server { 
  14.                 listen 8888; 
  15.                 server_name localhost; 
  16.  
  17.                 client_max_body_size 100m; 
  18.  
  19.                 location / { 
  20.              #   root /usr/local/nginx/html/; 
  21.         #       proxy_pass http://192.168.29.141; 
  22.                 proxy_pass http://backend; 
  23.                 } 
  24.                 location /images/ { 
  25.                         root /usr/local/nginx/; 
  26.                 } 
  27.                 location ~\.(mp3|mp4) #这里利用了正则表达式 
  28.                         root /usr/local/nginx/media/; 
  29.                 } 
  30.  
  31.         } 

结果如下:

三、总结

今天就暂时总结这么多吧,还有cgi和fastcgi的使用和区别,就暂时不讲了,如果哪天有用到,再来实战演示;最后如果对技术热爱的朋友,可以加我微信,进技术交流群交流学习,一起进步;一般有问题我也会及时互相交流学习的:

  1. tu18879499804 

站在巨人的肩膀上:

  1. 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 
  2.  
  3. https://juejin.cn/post/6844903944267759624 
  4.  
  5. https://ke.qq.com/webcourse/index.html#cid=420945&term_id=102189254&taid=8498121076534353&vid=5285890803239999870 

【编辑推荐】

  1. nginx反向代理和负载均衡
  2. nginx应用管理实践
  3. Nginx下配置HTTPS证书服务视频课程
  4. Nginx实战课堂
  5. 牛皮!几张图就把Nginx剖析的明明白白
【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

数据湖与数据仓库的分析实践攻略

数据湖与数据仓库的分析实践攻略

助力现代化数据管理:数据湖与数据仓库的分析实践攻略
共3章 | 创世达人

6人订阅学习

云原生架构实践

云原生架构实践

新技术引领移动互联网进入急速赛道
共3章 | KaliArch

35人订阅学习

数据中心和VPDN网络建设案例

数据中心和VPDN网络建设案例

漫画+案例
共20章 | 捷哥CCIE

222人订阅学习

视频课程+更多

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO官微