最新消息: 关于Git&GitHub 版本控制你了解多少?
您现在的位置是:群英 > 服务器 > 系统运维 >
Nginx入门级教程分享
CSDN发表于 2020-09-14 16:38 次浏览

 

本章作为实战篇,将从实际的命令行出发,通过安装,启动,配置nginx来逐渐认识和使用Nginx,并能够自己实现一些简单的反向代理,负载均衡的配置。nginx本身作为一个完成度非常高的负载均衡框架,和很多成熟的开源框架一样,大多数功能都可以通过修改配置文件来完成,使用者只需要简单修改一下nginx配置文件,便可以非常轻松的实现比如反向代理,负载均衡这些常用的功能。

1. 概述

1.1 什么是Nginx?

Nginx(engine x)是一个异步框架的 Web服务器,也可以用作反向代理,负载平衡器和HTTP缓存。

讲反向代理之前,先讲一个概念,什么是正向代理(Forward proxy)。如果没有特殊说明,我们所说的代理就是指正向代理。正向代理过程,隐藏了真实请求的客户端,服务端不知道真正的客户端是谁,客户端的请求都是被代理服务器代替来请求的。比如某些用来上网的工具(访问Google等站点)就是一个正向代理,正常浏览器访问http://google.com肯定是无法访问的,如果存在一个国外的服务器,当你访问google时,替你向google发了一次请求,并且把结果传给你,这时候你在浏览器浏览器的表象就是你可以访问google了,但是谷歌服务器并不知道真正访问的客户端是你的浏览器,也就是说正向代理是代理客户端,对服务器而言隐藏了真实的客户端。

反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。看概念好像跟正向代理差不多,但其实可以看到最直观的一点区别,正向代理你浏览器访问的额是目标地址,而反向代理浏览器访问的是代理服务器。举个例子,当我们访问http://baidu.com时,我们都知道百度有成千上万台服务器在工作,所以真正响应你请求的服务器是未知的,但其实我们也不关心到底哪台服务器为我们工作了,我们只需要知道反向代理服务器,就能获取服务。浏览器并不知道真正访问的服务端是哪个,也就是说反向代理是代理服务器,对于浏览器而言隐藏了真实的服务端。

2. Nginx的安装和使用

本文所使用的服务器操作系统是Centos,Nginx的安装方式可以有两种,一种是源码包安装、另一种是yum安装。yum安装比较简单,不容易出错。源码包安装是先将Nginx的源码下载下来,在自己的系统里编译生成可执行文件,然后执行,因为是在自己的系统上编译的,在性能上也许更好,这里投个懒,就不使用源码包这种方式了,有兴趣的同学可以去了解一下。

2.1 安装

yum -y install nginx

-y表示安装过程中自动键入Y继续安装,安装成功后Nginx目录如下:

  1. /usr/sbin:Nginx指令路径,文件夹下有一个nginx文件,可以通过nginx启动、暂停、重启Nginx服务
  2. /etc/nginx:Nnginx配置文件地址,默认配置文件为nginx.conf,并且默认配置文件中还定义了一个配置文件夹,路径为/etc/nginx/con.d,该文件夹下所有的.conf文件都是Nginx的配置文件
  3. /var/log/nginx:Nginx默认配置文件定义的默认log地址,Nginx运行后,会生成两个日志文件,access.log访问日志及error.log错误日志

2.2 使用


  1.  
    nginx -s stop 快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。
  2.  
    nginx -s quit 平稳关闭Nginx,保存相关信息,有安排的结束web服务。
  3.  
    nginx -s reload 因改变了Nginx相关配置,需要重新加载配置而重载。
  4.  
    nginx -s reopen 重新打开日志文件。
  5.  
    nginx -c filename 为 Nginx 指定一个配置文件,来代替缺省的。
  6.  
    nginx -t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
  7.  
    nginx -v 显示 nginx 的版本。
  8.  
    nginx -V 显示 nginx 的版本,编译器版本和配置参数。

3. Nginx应用

3.1 http反向代理配置


  1.  
    server {
  2.  
    listen 80;
  3.  
    server_name localhost;
  4.  
    client_max_body_size 1024M;
  5.  
     
  6.  
    location / {
  7.  
    proxy_pass http://localhost:8080;
  8.  
    proxy_set_header Host $host:$server_port;
  9.  
    }
  10.  
    }

保存配置文件后重启Nginx,当访问localhost的时候,就相当于访问localhost:8080了

3.2 负载均衡配置

负载均衡是Nginx常用的一个功能,意思是讲请求分摊到多个服务单元上进行执行,例如Web服务器、FTP服务器等,从而共同完成工作任务。简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略。

3.2.1 RR

这是Nginx的默认策略,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。


  1.  
    upstream test {
  2.  
    server localhost:8080;
  3.  
    server localhost:8081;
  4.  
    }
  5.  
    server {
  6.  
    listen 80;
  7.  
    server_name localhost;
  8.  
    client_max_body_size 1024M;
  9.  
     
  10.  
    location / {
  11.  
    proxy_pass http://test;
  12.  
    proxy_set_header Host $host:$server_port;
  13.  
    }
  14.  
    }

假如upstream中其中一个服务8080挂掉了,访问http://localhost 的时候,也不会有问题,会默认跳转到http://localhost:8081,。因为Nginx会自动判断服务器的状态,如果服务器处于不能访问,就不会跳转到这台服务器,所以也避免了一台服务器挂了影响使用的情况,这就是Nginx的默认策略RR。

3.2.2 权重

指定每个服务的轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。


  1.  
    upstream test {
  2.  
    server localhost:8080 weight=9;
  3.  
    server localhost:8081 weight=1;
  4.  
    }
  5.  
    server {
  6.  
    listen 80;
  7.  
    server_name localhost;
  8.  
    client_max_body_size 1024M;
  9.  
     
  10.  
    location / {
  11.  
    proxy_pass http://test;
  12.  
    proxy_set_header Host $host:$server_port;
  13.  
    }
  14.  
    }

假如有10次请求,很有可能8081服务被访问1次,8080被访问10次。

3.2.3 ip_hash

上面两种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当程序不是无状态的时候(比如服务端采用session保存数据),这时候就有一个很大的很问题。比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用ip_hash了,ip_hash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。


  1.  
    upstream test {
  2.  
    ip_hash;
  3.  
    server localhost:8080;
  4.  
    server localhost:8081;
  5.  
    }
  6.  
    server {
  7.  
    listen 80;
  8.  
    server_name localhost;
  9.  
    client_max_body_size 1024M;
  10.  
     
  11.  
    location / {
  12.  
    proxy_pass http://test;
  13.  
    proxy_set_header Host $host:$server_port;
  14.  
    }
  15.  
    }

3.2.4 fair

这是一个第三方策略,按后端服务器的响应时间来分配请求,响应时间短的优先分配。


  1.  
    upstream test {
  2.  
    fair;
  3.  
    server localhost:8080;
  4.  
    server localhost:8081;
  5.  
    }
  6.  
    server {
  7.  
    listen 80;
  8.  
    server_name localhost;
  9.  
    client_max_body_size 1024M;
  10.  
     
  11.  
    location / {
  12.  
    proxy_pass http://test;
  13.  
    proxy_set_header Host $host:$server_port;
  14.  
    }
  15.  
    }

3.2.5 url_hash

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,这种策略比较适合后端服务器存在缓存的情况,在upstream中加入hash语句即可。


  1. upstream test {
  2. hash $request_uri;
  3. hash_method crc32;
  4. server localhost:8080;
  5. server localhost:8081;
  6. }
  7. server {
  8. listen 80;
  9. server_name localhost;
  10. client_max_body_size 1024M;
  11.  
     
  12. location / {
  13. proxy_pass http://test;
  14. proxy_set_header Host $host:$server_port;
  15. }
  16. }

3.3 https反向代理配置

一些对安全性要求比较高的站点,可能会使用 HTTPS(一种使用 ssl 通信标准的安全 HTTP 协议),https反向代理配置与http反向代理配置基本上是相似的,但需要知道几点:

  • https的固定端口号是 443,不同于http的80端口
  • SSL标准需要引入安全证书,所以在Nginx配置文件中需要指定证书和它对应的key

  1. server {
  2. #监听443端口。443为知名端口号,主要用于HTTPS协议
  3. listen 443 ssl;
  4.  
     
  5. server_name localhost;
  6.  
     
  7. #ssl证书文件位置(常见证书文件格式为:crt/pem)
  8. ssl_certificate cert.pem;
  9. #ssl证书key位置
  10. ssl_certificate_key cert.key;
  11.  
     
  12. #ssl配置参数(选择性配置)
  13. ssl_session_cache shared:SSL:1m;
  14. ssl_session_timeout 5m;
  15. #数字签名,此处使用MD5
  16. ssl_ciphers HIGH:!aNULL:!MD5;
  17. ssl_prefer_server_ciphers on;
  18.  
     
  19. location / {
  20. proxy_pass http://localhost:8080;
  21. }
  22. }

3.4 静态站点配置

有时候,我们需要配置静态站点(只包含html 文件和一堆静态资源)。比如所有的静态资源都放在了/app/dist目录下,我们只需要在Nginx配置文件中指定首页以及这个站点的host即可。


  1. http {
  2. include mime.types;
  3. default_type application/octet-stream;
  4. sendfile on;
  5. keepalive_timeout 65;
  6.  
     
  7. gzip on;
  8. gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/javascript image/jpeg image/gif image/png;
  9. gzip_vary on;
  10.  
     
  11. server {
  12. listen 80;
  13. server_name localhost;
  14.  
  15. location / {
  16. root /app/dist;
  17. index index.html;
  18. #转发任何请求到 index.html
  19. }
  20. }
  21. }

3.5 兼容http与https配置

当我们升级http服务为https服务时,为了兼顾一些访问者还是通过http访问的方式,我们通常采用两种方式。

  • http可以访问,https也可以访问
  • http 访问时,重定向到https

3.5.1 兼容方式


  1. server {
  2. listen 80;
  3. listen 443 ssl;
  4.  
    server_name xxxx.com;
  5. charset urf-8;
  6. #ssl on; #保持关闭,或者注释
  7. ssl_certificate /etc/nginx/conf.d/xxxx.crt;
  8. ssl_certificate_key /etc/nginx/conf.d/xxxx.key;
  9. ssl_session_timeout 10m;
  10. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  11. ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
  12. ssl_prefer_server_ciphers on;
  13. root /usr/share/nginx/html;
  14.  
     
  15. }

3.5.2 重定向方式


  1. server {
  2. listen 80;
  3. server_name www.xxx.com;
  4. #告诉浏览器有效期内只准用 https 访问
  5. add_header Strict-Transport-Security max-age=15768000;
  6. #永久重定向到 https 站点
  7. return 301 https://$server_name$request_uri;
  8. }

3.6 网站动静分离配置

动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。


  1. http {
  2. upstream test{
  3. server localhost:8080;
  4. server localhost:8081;
  5. }
  6.  
     
  7. server {
  8. listen 80;
  9. server_name localhost;
  10.  
     
  11. location / {
  12. root /app/dist;
  13. index index.html;
  14. }
  15.  
     
  16. # 所有静态请求都由nginx处理
  17. location ~ \.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
  18. root root /app/dist;
  19. }
  20.  
     
  21. # 所有动态请求都转发给tomcat处理
  22. location /api/ {
  23. proxy_pass http://test;
  24. }
  25.  
     
  26. #error_page 500 502 503 504 /50x.html;
  27. location = /50x.html {
  28. root /app/dist;
  29. }
  30. }
  31. }

这样我们就可以吧HTML以及图片和css以及js放到/app/dist目录下,而tomcat只负责处理后台处理,例如当我们后缀为gif的时候,Nginx默认会从/app/dist获取到当前请求的动态图文件返回。这里的静态文件跟Nginx是同一台服务器,我们也可以在另外一台服务器,并通过proxy_pass属性指定。

3.7 跨域解决方案

web开发领域中,经常采用前后端分离模式。这种模式下,前端和后端分别是独立的web应用程序,比如后端是Java 程序,前端是React或Vue应用。各自独立的web app在互相访问时,势必存在跨域问题。解决跨域问题一般有两种思路:

  • CORS:在后端服务器设置HTTP响应头,把你需要运行访问的域名加入加入Access-Control-Allow-Origin中。
  • jsonp:把后端根据请求,构造json数据,并返回,前端用jsonp跨域。

Nginx针对CORS提供了一种跨域解决方案,比如前端后端存在跨域时,前端和后端如果使用http进行交互,请求会被拒绝。这时候可以通过设置后台服务响应头方式解决。


  1. server {
  2. listen 80;
  3.  
     
  4. server_name ***.***.com;
  5.  
     
  6. location /api/ {
  7.  
     
  8. add_header 'Access-Control-Allow-Origin' '$http_origin';
  9. add_header 'Access-Control-Allow-Credentials' 'true';
  10. add_header 'Access-Control-Allow-Methods' 'POST, GET, OPTIONS, DELETE, PUT';
  11. add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
  12.  
     
  13. #跨域OPTIONS请求,set response header后直接204返回
  14. if ($request_method = 'OPTIONS') {
  15. return 204;
  16. }
  17.  
  18. proxy_set_header X-Real-IP $remote_addr;
  19. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  20.  
     
  21. proxy_pass http://api_server;
  22. }
  23.  
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
相关信息推荐