阿里云 CentOS 环境搭建[3] -- Nginx

作者: SongHuitang丨赛萌 | 来源:发表于2017-06-25 21:03 被阅读64次
     Note:任何形式的转载请注明原文
    

    本文指令都是按管理员权限执行,如果遇到权限问题请sudo


    Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。

    HTTP请求是80端口,但是在Linux上非root权限是无法使用1024以下端口的,并且因为安全原因,最好不要使用root权限登录服务器,所以无法直接用node.jsTomcat程序监听80端口。因此我们需要使用Nginx给我们的程序做反向代理,将80端口指向应用程序监听的端口(如node.js默认3000端口,Tomcat 默认8080端口)。


    安装Nginx

    配置Nginx源

    vim /etc/yum.repos.d/nginx.repo
    

    敲击i输入下面代码,按Esc并输入:wq!保存退出

    [nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=0
    enabled=1
    

    通过yum安装Nginx

    yum install nginx
    

    启动 / 重启 Nginx

    systemctl start nginx
    
    systemctl restart nginx
    

    修改配置文件

    样例配置

    server {
        listen       80;
        server_name  localhost;
        root   html;
        index  index.html index.htm;
        location /favicon.ico {
            root html;
        }
    }
    

    这里的 listen 指监听端口,server_name 用来指定IP或域名,多个域名对应统一规则可以空格分开,index 用于设定访问的默认首页地址,root 指令用于指定虚拟主机的网页跟目录,这个地方可以是相对地址也可以是绝对地址。

    当用户访问localhost/favicon.ico时,会寻找nginx安装目录/html/favicon.ico

    通常情况下我们可以在 nginx.conf 中配置多个server,对不同的请求进行设置。

      server {
              listen       80;
              server_name  www.a.com;
              charset utf-8;
              access_log  /home/a.com.access.log  main;
              location / {
                  proxy_pass http://127.0.0.1:3000;
              }
          }
      
       server {
              listen       80;
              server_name  www.b.com;
              charset utf-8;
              access_log  /home/b.com.access.log  main;
              location / {
                  proxy_pass http://127.0.0.1:8080;
              }
          }
    

    但是当 server 超过2个时,建议将不同对虚拟主机的配置放在另一个文件中,然后通过在主配置文件 nginx.conf 加上 include 指令包含进来。更便于管理。

    include vhosts/*.conf;
    

    location 匹配规则

    ~      波浪线表示执行一个正则匹配,区分大小写
    ~*    表示执行一个正则匹配,不区分大小写
    ^~    ^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
    =      进行普通字符精确匹配
    

    具体匹配例子

    location  = / {
      # 只匹配"/".
      [ configuration A ] 
    }
    location  / {
      # 匹配任何请求,因为所有请求都是以"/"开始
      # 但是更长字符匹配或者正则表达式匹配会优先匹配
      [ configuration B ] 
    }
    location ^~ /images/ {
      # 匹配任何以 /images/ 开始的请求,并停止匹配 其它location
      [ configuration C ] 
    }
    location ~* \.(gif|jpg|jpeg)$ {
      # 匹配以 gif, jpg, or jpeg结尾的请求. 
      # 但是所有 /images/ 目录的请求将由 [Configuration C]处理.   
      [ configuration D ] 
    }
    
    请求:
    / -> 符合configuration A
    /documents/document.html -> 符合configuration B
    /images/1.gif -> 符合configuration C
    /documents/1.jpg ->符合 configuration D
    

    静态文件映射

    访问文件的配置主要有 root 和 aliasp's 两个指令。

    alias

    alias后跟的指定目录是准确的,并且末尾必须加 /。

    location /c/ {
       alias /a/;
    }
    
    root

    root后跟的指定目录是上级目录,并且该上级目录下要含有和location后指定名称的同名目录才行。

        location /c/ {
            root /a/;
        }
    

    这时访问站点http://location/c访问的就是/a/c目录下的站点信息。
    如果你需要将这个目录展开,在这个location的末尾加上「autoindex on; 」就可以了

    转发

    这个很简单,指定IP和端口直接转发过去就可以了.譬如转发到localhost的3000端口

    location / {
        proxy_pass localhost:3000;
    }
    
    负载均衡

    我们在 upstream 中指定了一组机器,并将这个组命名为 myserver,这样在 proxypass 中只要将请求转移到 myserver 这个 upstream 中我们就实现了在四台机器的反向代理加负载均衡。其中的 ip_hash 指明了我们均衡的方式是按照用户的 ip 地址进行分配。另外还有轮询、指定权重轮询、fair、url_hash几种调度算法。

    upstream myserver; {
        ip_hash;    
        server 172.16.1.1:8001;
        server 172.16.1.2:8002;
        server 172.16.1.3;
        server 172.16.1.4;
    }
    location / {
        proxy_pass http://myserver;
    }
    

    结束语

    以上是最简单的通过 nginx 实现静态文件转发、反向代理和负载均衡的配置。在 nginx 中所有的功能都是通过模块来实现的,比如当我们配置 upstream 时是用 upstream 模块,而 server 和 location 是在 http core 模块,其他的还有流控的 limt 模块,邮件的 mail 模块,https 的 ssl 模块。他们的配置都是类似的可以再 nginx 的模块文档中找到详细的配置说明。

    相关文章

      网友评论

        本文标题:阿里云 CentOS 环境搭建[3] -- Nginx

        本文链接:https://www.haomeiwen.com/subject/sjklcxtx.html