使用Nginx部署前后端分离项目

原文地址:http://www.mambo.wang/2018/09/09/%E4%BD%BF%E7%94%A8nginx%E8%BF%9B%E8%A1%8C%E5%89%8D%E5%90%8E%E7%AB%AF%E5%88%86%E7%A6%BB%E9%83%A8%E7%BD%B2/

## 使用Nginx部署前后端分离项目

> Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler(俄文:Рамблер)使用。 其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页伺服器中表现较好.目前中国大陆使用nginx网站用户有:新浪、网易、 腾讯,另外知名的微网志Plurk也使用nginx。

### 特性

*   Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性: 
    *   作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.
    *   作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
    *   作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。

### 配置文件结构

> ... #全局块

> events { #events块 ... }

> > http #http块 {
> > 
> > > ... #http全局块 server #server块 {
> > > 
> > > >        ...       #server全局块
> > > >        location [PATTERN]   #location块
> > > >         {
> > > >             ...
> > > >         }
> > > >         location [PATTERN] 
> > > >         {
> > > >             ...
> > > >         }
> > > >     }
> > > >     server
> > > >     {
> > > >       ...
> > > >     }
> > > >     ...     #http全局块
> > > >     
> > > > 
> > > > }

1.  全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。

2.  events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

3.  http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

4.  server块:配置虚拟主机的相关参数,一个http中可以有多个server。

5.  location块:配置请求的路由,以及各种页面的处理情况。

### 常用功能

*   Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理。 Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能。Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器,只要你正则写的没问题,又有相对应的服务器解决方案,你就可以随心所欲的玩。并且Nginx对返回结果进行错误页跳转,异常判断等。如果被分发的服务器存在异常,他可以将请求重新转发给另外一台服务器,然后自动去除异常服务器。 ![反向代理][01] [01]: ./反向代理.jpg '反向代理'

''' server {  
listen 80;  
server_name localhost;  
client_max_body_size 1024M;

       location / {
           proxy_pass http://localhost:8080;
           proxy_set_header Host $host:$server_port;
       }
    }
    

'''

*   Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。扩展策略,就天马行空,只有你想不到的没有他做不到的啦,你可以参照所有的负载均衡算法,给他一一找出来做下实现。

''' upstream test { server localhost:8080; server localhost:8081; } server { listen 81;  
server_name localhost;  
client_max_body_size 1024M;

        location / {
            proxy_pass http://test;
            proxy_set_header Host $host:$server_port;
        }
    }
    

'''

*   Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,同时现在也很流行动静分离,就可以通过Nginx来实现,首先看看Nginx做静态资源服务器

''' server { listen 80;  
server_name localhost;  
client_max_body_size 1024M;

        location / {
               root   E:/wwwroot;
               index  index.html;
           }
    }
    

'''

### 本例

[作业空间前端项目][1]

'''

    server {
      listen    80;
      server_name localhost;
    
      #charset koi8-r;
      #access_log /var/log/nginx/log/host.access.log main;
      root  /usr/share/nginx/html;
      location / {
        root  /usr/share/nginx/html;
        index index.html index.htm;
      }
    
      location /athena {
        proxy_pass http://dockerhost:8883/;
        proxy_set_header Host $http_host;
      }
    }
    

''' 如果要限制post请求参数的最大长度,可以在server块中添加'client_max_body_size 100m;'。

1. 用户访问192.168.0.225时,走到'location / {...}'块中,返回index.html。

2. 之后前端发请求时的URL会携带有前缀athena,所有请求host/athena/xxx会走到location /athena {...} 代码块中,请求转发到http://dockerhost:8883/xxx。这种部署方式顺便解决了跨域问题。dockerhost是创建为了便于容器和宿主机之前的交互,创建容器时写入etc/host文件的一条记录。

### 部署过程

1.  下载官方镜像:
    
    'docker pull nginx:latest'

2.  宿主机创建/nginx/conf.d目录,创建defalut.conf文件,将上面的配置写入,nginx容器中/etc/nginx/nginx.conf只有全局块、events块和http块,我们自己写然后挂载进去的是server块。

3.  运行容器,将配置文件和前端代码挂载到容器中。注意要使用宿主机的IP+端口去把请求转发给对应的应用程序,需要在该nginx容器中将docker0的ip地址写入etc/hosts文件。
    
    ''' docker run --name=myproject_fronted -d -p 80:80 -v /nginx/conf.d:/etc/nginx/conf.d -v /nginx/www:/usr/share/nginx/html:ro --add-host dockerhost:'$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+') ' nginx '''

 [1]: http://192.168.0.225

你可能感兴趣的:(Nginx)