nginx静态资源配置

本文参考:

一、准备工作

1、nginx配置文件

Nginx文件查找:sudo nginx -t

找到配置文件nginx.conf所在目录,进入目录

进入文件:vi nginx.conf

修改文件:先按insert,修改完后按esc,输入“:wq”(保存退出),不保存退出(“:q”)

nginx重启:service nginx restart

如果重启出现:nginx: [emerg] invalid parameter "server" in /etc/nginx/nginx.conf:37

nginx: configuration file /etc/nginx/nginx.conf test failed

表示配置文件第37行有错误,返回检查修改。

2、配置文件目录结构

见文首链接,如果新手实际操作,一定要打开这个链接进行对照思考。

 

3、情景设置

有两台服务器A、B,有4个应用分别是一个前端资源a,一个消息系统b,两个相同的应用c1、c2。

现在考虑a、b应用性能消耗很小,部署情况是A(a、b、c1),B(c2)。目标是实现同一入口访问,计划用nginx实现对a的静态资源部署,对b的反向代理,对c1、c2进行负载均衡配置。

 

二、框架结构设计

使用nginx在A上搭建3台虚拟主机x,y,z,x做总调度+负载均衡(c1、c2),y做a静态资源部署,z做b消息系统部署。

对公共参数部分我们不做任何修改。

初始状态下,http内部应该已经存在一个server,默认监听80端口。我们暂时不去动它,后面做负载均衡把它改造成一个总调度。

server {
    listen    80;
    server_name localhost;}

 

1、静态资源设置

在http内部新建一个server,与默认的server同级,内容如下,分别设置html页面和其他静态资源的路径。

注意:如果网页显示不出来,那一定是路径的问题。

#虚拟主机2——静态资源
   server {
       listen    8081;
       server_name localhost_2;

        # 配置Nginx动静分离(html)
        location ~ .*\.(html|htm)$
       {
          root /etc/staticSource/resources/templates/;
       }

        # 配置Nginx动静分离(static)
        location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
       {
          root /etc/staticSource/resources/;
          #expires定义用户浏览器缓存的时间为7天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力
          expires 7d;
       }
     }

 

2、反向代理

反向代理的作用是可以实现请求转发,负载均衡也是在这个基础上实现的。这里为了作为区分,把反向代理认为是两台主机之间固定的连接通信,用户请求到达A,被虚拟主机x接受,然后转发y处理。同样是新建一个server并配置。

#虚拟主机3——消息系统
     server {
         listen    8082;
         server_name localhost_3;
         location / {
                proxy_pass        http://localhost:8083;             
         }
     }

3、负载均衡

剩下应用c1、c2做负载均衡。首先需要在http内部做一个upstream的服务器池,把c1、c2所在服务器配置进去。

#负载均衡池
        upstream  serverPool  {
             server   47.93.232.xxx:8080  weight=1;
            server   123.207.231.xxx:8081 weight=5 max_fails=2 fail_timeout=30s ;
       }

接下来把负载均衡配置进server1,顺便把它改造成总调度。请求转发依靠资源路径匹配(location),它对配置的顺序有要求。思路是按照静态资源配置、特殊动态资源配置、通用动态资源配置的顺序,虚拟主机收到请求后按照上述顺序对资源进行转发。因此我们将配置如下:先配置静态资源a,然后配置消息系统b,最后配置c1、c2并做负载均衡配置。

#虚拟主机1——总调度
server {
    listen    8079;
    server_name localhost_1;
     #调度对象1:虚拟主机2——静态资源
     location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
     {
      proxy_pass http://localhost:8081;
     }
     #调度对象2:虚拟主机3——消息系统
     location /highway/
     {
      proxy_pass http://localhost:8082;
     }
      #调度对象3——负载均衡
     location / {
     proxy_pass        http://serverPool;
     # 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
#            proxy_set_header  Host  $host;
#            proxy_set_header  X-Real-IP  $remote_addr;
#            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
#            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
 
        }
}

 

三、总结

nginx的http是http服务器,server是虚拟主机,可以在http中配置多个server监听不同的端口。Server内部的location是资源路径匹配,可以把磁盘资源和服务器资源无差别对待,只不过内部一个用root表示,一个用proxy_pass表示。一个server中如果有多个资源,应该按照后缀匹配、特殊匹配和其余匹配的顺序进行配置。

本文算是对nginx几大功能的一个实践性配置,关于性能的更多配置还需要请教有经验的人和自己摸索。

完整配置:

#全局配置
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}
#http服务器
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    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  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
    include /etc/nginx/conf.d/*.conf;
 #负载均衡服务器池
    upstream  serverPool  {
             server   47.93.232.XXX:8080  weight=1;
             server   123.207.231.XXX:8081 weight=5 max_fails=2 fail_timeout=30s ;
     }
#虚拟主机1——总调度
 server {
    listen    8079;
    server_name localhost_1;
     #调度对象1:虚拟主机2——静态资源
     location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
     {
      proxy_pass http://localhost:8081;
     }
     #调度对象2:虚拟主机3——消息系统
     location /highway/
     {
      proxy_pass http://localhost:8082;
     }
      #调度对象3——负载均衡
     location / {
     proxy_pass        http://serverPool;
     # 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
#            proxy_set_header  Host  $host;#            proxy_set_header  X-Real-IP  $remote_addr;
#            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
#            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;


        }
}
#虚拟主机2——静态资源
   server {
       listen    8081;
       server_name localhost_2;
        # 配置Nginx动静分离(html)
        location ~ .*\.(html|htm)$
       {
          root /etc/staticSource/resources/templates/;
       }
        # 配置Nginx动静分离(static)
        location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
       {
          root /etc/staticSource/resources/;
       }
        # 配置Nginx动静分离(缓存)        location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
          root /etc/staticSource/resources/;
           #expires定义用户浏览器缓存的时间为7天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力
          expires 7d;
       }
     }
#虚拟主机3——消息系统
     server {
         listen    8082;
         server_name localhost_3;
         location / {
                proxy_pass        http://localhost:8083;
#                proxy_redirect off;
#                # 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
#                proxy_set_header  Host  $host;
#                proxy_set_header  X-Real-IP  $remote_addr;
#                proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
#                proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
         }
     }
}