Linux-Nginx简单入门

一、Nginx概念        

       Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

二、负载均衡策略

       1、使用硬件复杂均衡策略实现,如使用F5、Array等负载均衡器

       2、使用软件进行负载均衡

            2.1 使用阿里云服务器均衡负载SLB

           2.2 使用Nginx+Keepalived

            2.3 其它软件负载均衡如LVS(Linux Virtual Server)、haproxy等技术。

三、Nginx的优点

      1、Nginx 可以在大多数 UnixLinux OS 上编译运行,并有 Windows 移植版。 Nginx 的1.4.0稳定版已经于2013年4月24日发布,一般情况下,对于新建站点,建议使用最新稳定版作为生产版本,已有站点的升级急迫性不高。Nginx 的源代码使用 2-clause BSD-like license。
      2、Nginx 是一个很强大的高性能Web和反向代理服务器,它具有很多非常优越的特性:
在连接高并发的情况下,Nginx是Apache服务器不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应,感谢Nginx为我们选择了 epoll and kqueue作为开发模型。

四、Nginx安装

       如果大家是刚新建的虚拟机并且最小化安装的话,需要先配置静态IP并且要能上网,大家可以参考:http://blog.csdn.net/u012453843/article/details/52839105这篇博客进行学习,编辑文章用vi即可。配置好静态IP并且能上网之后需要先安装wget、vim和gcc。

[html] view plain copy
  1. yum install wget  
  2. yum install vim-enhanced  
  3. yum install make cmake gcc gcc-c++  

       1、下载nginx安装包

[html] view plain copy
  1. [root@nginx1 ~]# wget http://nginx.org/download/nginx-1.6.2.tar.gz  
  2. --2017-04-07 01:44:55--  http://nginx.org/download/nginx-1.6.2.tar.gz  
  3. 正在解析主机 nginx.org... 206.251.255.63, 95.211.80.227, 2606:7100:1:69::3f, ...  
  4. 正在连接 nginx.org|206.251.255.63|:80... 已连接。  
  5. 已发出 HTTP 请求,正在等待回应... 200 OK  
  6. 长度:804164 (785K) [application/octet-stream]  
  7. 正在保存至: “nginx-1.6.2.tar.gz”  

      2、安装依赖,其中pcre(perl compatible regular expressions)是一个pert库,包括perl兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库。pcre-devel是使用pcre开发的一个二次库,nginx也需要此库。zlib库提供了很多种压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。openssl是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的秘钥和证书封装管理功能及SSL协议,并提供丰富的应用程序提供测试或其它目的的使用。nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。

[html] view plain copy
  1. yum install -y pcre pcre-devel  
[html] view plain copy
  1. yum install -y zlib zlib-devel  
[html] view plain copy
  1. yum install -y openssl openssl-devel  
         3、解压nginx-1.6.2.tar.gz到/usr/local/目录下

[html] view plain copy
  1. [root@nginx1 ~]# tar -zxvf nginx-1.6.2.tar.gz -C /usr/local/  

         4、进入到/usr/local目录下,可以看到我们解压后的nginx-1.6.2文件夹了,然后我们进行configure配置,命令:cd nginx-1.6.2 && ./configure --prefix=/usr/local/nginx。可以看出,这条命令是组合命令,先进入nginx-1.6.2目录然后在执行./configure命令。如下图所示。

          5、编译安装

[html] view plain copy
  1. [root@nginx1 nginx-1.6.2]# make && make install  
          6、启动Nginx,启动完之后检查nginx是否已经正常启动,看到如下信息说明正常启动。

[html] view plain copy
  1. [root@nginx1 nginx-1.6.2]# /usr/local/nginx/sbin/nginx   
  2. [root@nginx1 nginx-1.6.2]# ps -ef | grep nginx  
  3. root       3640      1  0 04:40 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx  
  4. nobody     3641   3640  0 04:40 ?        00:00:00 nginx: worker process        
  5. root       3643   1368  0 04:40 pts/0    00:00:00 grep nginx  
  6. [root@nginx1 nginx-1.6.2]#  
          如果要关闭nginx,我们可以使用如下命令:

[html] view plain copy
  1. [root@nginx1 nginx-1.6.2]# /usr/local/nginx/sbin/nginx -s stop  
          如果想要重新热启动nginx,则使用如下命令:

[html] view plain copy
  1. [root@nginx1 nginx-1.6.2]# /usr/local/nginx/sbin/nginx -s reload  
          7、nginx默认的端口是80,我们需要在防火墙配置中添加80端口:"-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT"从而可以让外界访问80端口,否则防火墙将禁止外界访问80端口。如下所示。

[html] view plain copy
  1. [root@nginx1 nginx-1.6.2]# vim /etc/sysconfig/iptables  
  2.   
  3. # Firewall configuration written by system-config-firewall  
  4. # Manual customization of this file is not recommended.  
  5. *filter  
  6. :INPUT ACCEPT [0:0]  
  7. :FORWARD ACCEPT [0:0]  
  8. :OUTPUT ACCEPT [0:0]  
  9. -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  
  10. -A INPUT -p icmp -j ACCEPT  
  11. -A INPUT -i lo -j ACCEPT  
  12. -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT  
  13. -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT  
  14. -A INPUT -j REJECT --reject-with icmp-host-prohibited  
  15. -A FORWARD -j REJECT --reject-with icmp-host-prohibited  
  16. COMMIT  
          添加完80端口之后,我们重启防火墙,如下所示。

[html] view plain copy
  1. [root@nginx1 nginx-1.6.2]# service iptables restart  
  2. iptables:将链设置为政策 ACCEPT:filter                    [确定]  
  3. iptables:清除防火墙规则:                                 [确定]  
  4. iptables:正在卸载模块:                                   [确定]  
  5. iptables:应用防火墙规则:                                 [确定]  

          8、通过浏览器访问nginx欢迎页,我们在地址栏输入:http://192.168.156.11/(80端口不用输也可以)或http://192.168.156.11:80/,如下图所示。


五、学习nginx配置

       1、当启动过nginx之后,我们到/usr/local/nginx目录下,可以看到有conf、html、logs、sbin四个文件这四个文件是刚解压后就有的,是nginx重要的文件,还可以看到几个_temp结尾的文件,这些都是启动后生成的文件,我们暂且不用去管它们。我们使用cd conf命令进入conf目录,该目录下有个nginx.conf文件,这是nginx最重要的文件,我们修改nginx就是修改该文件,如下所示。

[html] view plain copy
  1. [root@nginx1 nginx-1.6.2]# cd /usr/local/nginx  
  2. [root@nginx1 nginx]# ll  
  3. 总用量 36  
  4. drwx------. 2 nobody root 4096 4月   7 05:16 client_body_temp  
  5. drwxr-xr-x. 2 root   root 4096 4月   7 04:37 conf  
  6. drwx------. 2 nobody root 4096 4月   7 05:16 fastcgi_temp  
  7. drwxr-xr-x. 2 root   root 4096 4月   7 04:37 html  
  8. drwxr-xr-x. 2 root   root 4096 4月   7 05:16 logs  
  9. drwx------. 2 nobody root 4096 4月   7 05:16 proxy_temp  
  10. drwxr-xr-x. 2 root   root 4096 4月   7 04:37 sbin  
  11. drwx------. 2 nobody root 4096 4月   7 05:16 scgi_temp  
  12. drwx------. 2 nobody root 4096 4月   7 05:16 uwsgi_temp  
  13. [root@nginx1 nginx]# cd conf  
  14. [root@nginx1 conf]# ll  
  15. 总用量 60  
  16. -rw-r--r--. 1 root root 1034 4月   7 04:37 fastcgi.conf  
  17. -rw-r--r--. 1 root root 1034 4月   7 04:37 fastcgi.conf.default  
  18. -rw-r--r--. 1 root root  964 4月   7 04:37 fastcgi_params  
  19. -rw-r--r--. 1 root root  964 4月   7 04:37 fastcgi_params.default  
  20. -rw-r--r--. 1 root root 2837 4月   7 04:37 koi-utf  
  21. -rw-r--r--. 1 root root 2223 4月   7 04:37 koi-win  
  22. -rw-r--r--. 1 root root 3957 4月   7 04:37 mime.types  
  23. -rw-r--r--. 1 root root 3957 4月   7 04:37 mime.types.default  
  24. -rw-r--r--. 1 root root 2656 4月   7 04:37 nginx.conf  
  25. -rw-r--r--. 1 root root 2656 4月   7 04:37 nginx.conf.default  
  26. -rw-r--r--. 1 root root  596 4月   7 04:37 scgi_params  
  27. -rw-r--r--. 1 root root  596 4月   7 04:37 scgi_params.default  
  28. -rw-r--r--. 1 root root  623 4月   7 04:37 uwsgi_params  
  29. -rw-r--r--. 1 root root  623 4月   7 04:37 uwsgi_params.default  
  30. -rw-r--r--. 1 root root 3610 4月   7 04:37 win-utf  
  31. [root@nginx1 conf]#   
         nginx.conf文件的内容如下(注:我把注释给加上了):

[html] view plain copy
  1. #user  nobody;  
  2.   
  3. #开启进程数 <=CPU数   
  4. worker_processes  1;  
  5.   
  6. #错误日志保存位置  
  7. #error_log  logs/error.log;  
  8. #error_log  logs/error.log  notice;  
  9. #error_log  logs/error.log  info;  
  10.   
  11. #进程号保存文件  
  12. #pid        logs/nginx.pid;  
  13.   
  14. #每个进程最大连接数(最大连接=连接数x进程数)每个worker允许同时产生多少个链接,默认1024  
  15. events {  
  16.     worker_connections  1024;  
  17. }  
  18.   
  19.   
  20. http {  
  21.     #文件扩展名与文件类型映射表  
  22.     include       mime.types;  
  23.     #默认文件类型  
  24.     default_type  application/octet-stream;  
  25.   
  26.     #日志文件输出格式 这个位置相于全局设置  
  27.     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '  
  28.     #                  '$status $body_bytes_sent "$http_referer" '  
  29.     #                  '"$http_user_agent" "$http_x_forwarded_for"';  
  30.   
  31.     #请求日志保存位置  
  32.     #access_log  logs/access.log  main;  
  33.       
  34.     #打开发送文件  
  35.     sendfile        on;  
  36.     #tcp_nopush     on;  
  37.   
  38.     #keepalive_timeout  0;  
  39.     #连接超时时间  
  40.     keepalive_timeout  65;  
  41.   
  42.     #打开gzip压缩  
  43.     #gzip  on;  
  44.       
  45.     server {  
  46.         #监听端口,默认是80端口  
  47.         listen       80;  
  48.         #监听域名  
  49.         server_name  localhost;  
  50.   
  51.         #charset koi8-r;  
  52.           
  53.         #nginx访问日志放在logs/host.access.log下,并且使用main格式(还可以自定义格式)  
  54.         #access_log  logs/host.access.log  main;  
  55.   
  56.         #如果没有location更明确的匹配访问路径的话,访问请求都会被该location处理。  
  57.         location / {  
  58.             #root指定nginx的根目录为/usr/local/nginx/html  
  59.             root   html;  
  60.             #默认访问文件,欢迎页先去html目录下找index.html,如果找不到再去找index.htm  
  61.             index  index.html index.htm;  
  62.         }  
  63.           
  64.         #error_page  404              /404.html;  
  65.         # redirect server error pages to the static page /50x.html  
  66.         #  
  67.           
  68.         #错误页面及其返回地址,错误码为500、502、503、504都会返回50.html错误页面。  
  69.         error_page   500 502 503 504  /50x.html;  
  70.         #location后面是"="的话,说明是精确匹配  
  71.         location = /50x.html {  
  72.             root   html;  
  73.         }  
  74.   
  75.         # proxy the PHP scripts to Apache listening on 127.0.0.1:80  
  76.         #  
  77.         #location ~ \.php$ {  
  78.         #    proxy_pass   http://127.0.0.1;  
  79.         #}  
  80.   
  81.         # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000  
  82.         #  
  83.         #location ~ \.php$ {  
  84.         #    root           html;  
  85.         #    fastcgi_pass   127.0.0.1:9000;  
  86.         #    fastcgi_index  index.php;  
  87.         #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  
  88.         #    include        fastcgi_params;  
  89.         #}  
  90.   
  91.         # deny access to .htaccess files, if Apache's document root  
  92.         # concurs with nginx's one  
  93.         #  
  94.         #location ~ /\.ht {  
  95.         #    deny  all;  
  96.         #}  
  97.     }  
  98.       
  99.   
  100.     # another virtual host using mix of IP-, name-, and port-based configuration  
  101.     #  
  102.     #server {  
  103.     #    listen       8000;  
  104.     #    listen       somename:8080;  
  105.     #    server_name  somename  alias  another.alias;  
  106.   
  107.     #    location / {  
  108.     #        root   html;  
  109.     #        index  index.html index.htm;  
  110.     #    }  
  111.     #}  
  112.   
  113.   
  114.     # HTTPS server  
  115.     #  
  116.     #server {  
  117.     #    listen       443 ssl;  
  118.     #    server_name  localhost;  
  119.   
  120.     #    ssl_certificate      cert.pem;  
  121.     #    ssl_certificate_key  cert.key;  
  122.   
  123.     #    ssl_session_cache    shared:SSL:1m;  
  124.     #    ssl_session_timeout  5m;  
  125.   
  126.     #    ssl_ciphers  HIGH:!aNULL:!MD5;  
  127.     #    ssl_prefer_server_ciphers  on;  
  128.   
  129.     #    location / {  
  130.     #        root   html;  
  131.     #        index  index.html index.htm;  
  132.     #    }  
  133.     #}  
  134.   
  135. }  
       其实那些注释掉的信息我们都可以删掉,这样看起来就会很简洁明了了。配置文件里可以添加多个server,server监听的端口不同,我们可以根据需要让nginx代理多个端口,当访问某个端口的时候,指定去做某些事情。我这里添加了一个server,这个server监听的端口为1234,server_name我指定为了test.com,也就是域名为test.com,当访问1234端口时会自动导航到/usr/local/nginx/tester/tester111.html页面,如下所示。

[html] view plain copy
  1. #user  nobody;  
  2.   
  3. #开启进程数 <=CPU数   
  4. worker_processes  1;  
  5.   
  6. #错误日志保存位置  
  7. #error_log  logs/error.log;  
  8. #error_log  logs/error.log  notice;  
  9. #error_log  logs/error.log  info;  
  10.   
  11. #进程号保存文件  
  12. #pid        logs/nginx.pid;  
  13.   
  14. #每个进程最大连接数(最大连接=连接数x进程数)每个worker允许同时产生多少个链接,默认1024  
  15. events {  
  16.     worker_connections  1024;  
  17. }  
  18.   
  19.   
  20. http {  
  21.     #文件扩展名与文件类型映射表  
  22.     include       mime.types;  
  23.     #默认文件类型  
  24.     default_type  application/octet-stream;  
  25.   
  26.     #日志文件输出格式 这个位置相于全局设置  
  27.     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '  
  28.     #                  '$status $body_bytes_sent "$http_referer" '  
  29.     #                  '"$http_user_agent" "$http_x_forwarded_for"';  
  30.   
  31.     #请求日志保存位置  
  32.     #access_log  logs/access.log  main;  
  33.       
  34.     #打开发送文件  
  35.     sendfile        on;  
  36.     #tcp_nopush     on;  
  37.   
  38.     #keepalive_timeout  0;  
  39.     #连接超时时间  
  40.     keepalive_timeout  65;  
  41.   
  42.     #打开gzip压缩  
  43.     #gzip  on;  
  44.       
  45.     server {  
  46.         #监听端口  
  47.         listen       80;  
  48.         #监听域名  
  49.         server_name  localhost;  
  50.   
  51.         #charset koi8-r;  
  52.           
  53.         #nginx访问日志放在logs/host.access.log下,并且使用main格式(还可以自定义格式)  
  54.         #access_log  logs/host.access.log  main;  
  55.   
  56.         #如果没有location更明确的匹配访问路径的话,访问请求都会被该location处理。  
  57.         location / {  
  58.             #root指定nginx的根目录为/usr/local/nginx/html  
  59.             root   html;  
  60.             #默认访问文件,欢迎页先去html目录下找index.html,如果找不到再去找index.htm  
  61.             index  index.html index.htm;  
  62.         }  
  63.           
  64.         #error_page  404              /404.html;  
  65.         # redirect server error pages to the static page /50x.html  
  66.         #  
  67.           
  68.         #错误页面及其返回地址,错误码为500、502、503、504都会返回50.html错误页面。  
  69.         error_page   500 502 503 504  /50x.html;  
  70.         #location后面是"="的话,说明是精确匹配  
  71.         location = /50x.html {  
  72.             root   html;  
  73.         }  
  74.   
  75.         server {  
  76.             listen 1234;  
  77.             server_name test.com;  
  78.             location / {  
  79.                 #正则表达式匹配uri方式:在/usr/local/nginx/tester下 建立一个tester111.html 然后使用正则匹配  
  80.                 root tester;  
  81.                 index tester111.html;  
  82.             }  
  83.         }  
  84.     }  
  85. }  
       我们需要在/usr/local/nginx/目录下新建tester目录,在tester目录下新建一个tester111.html文件,在文件中随便写段html代码主要是为了判断是否访问的是我们写的html页面。如下所示。

[html] view plain copy
  1. [root@nginx1 nginx]# mkdir tester  
  2. [root@nginx1 nginx]# ll  
  3. 总用量 40  
  4. drwx------. 2 nobody root 4096 4月   7 05:16 client_body_temp  
  5. drwxr-xr-x. 2 root   root 4096 4月   7 06:32 conf  
  6. drwx------. 2 nobody root 4096 4月   7 05:16 fastcgi_temp  
  7. drwxr-xr-x. 2 root   root 4096 4月   7 04:37 html  
  8. drwxr-xr-x. 2 root   root 4096 4月   7 05:16 logs  
  9. drwx------. 2 nobody root 4096 4月   7 05:16 proxy_temp  
  10. drwxr-xr-x. 2 root   root 4096 4月   7 04:37 sbin  
  11. drwx------. 2 nobody root 4096 4月   7 05:16 scgi_temp  
  12. drwxr-xr-x. 2 root   root 4096 4月   7 06:37 tester  
  13. drwx------. 2 nobody root 4096 4月   7 05:16 uwsgi_temp  
  14. [root@nginx1 nginx]# cd tester/  
  15. [root@nginx1 tester]# vim tester111.html  
  16.   
  17. <html>  
  18.    <body>Hello This is Nginx Test!</body>  
  19. </html>  
         下面我们需要在防火墙中添加1234端口从而让浏览器可以访问1234端口,这个步骤在上面写的清楚了,这里就不再啰嗦了。

         在防火墙配置中添加完1234端口后,我们需要重启nginx,如下所示。

[html] view plain copy
  1. [root@nginx1 nginx]# /usr/local/nginx/sbin/nginx -s reload  
  2. [root@nginx1 nginx]# ps -ef|grep nginx  
  3. root       3654      1  0 05:16 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx  
  4. nobody     3870   3654  0 06:47 ?        00:00:00 nginx: worker process        
  5. root       3872   1368  0 06:47 pts/0    00:00:00 grep nginx  
  6. [root@nginx1 nginx]#   
          由于我们在配置文件中配置的域名test.com并不是真实存在的,我们要想让windows系统识别该“域名”,我们需要修改下HOST文件,如下图所示。


          下面我们在地址栏输入:http://test.com:1234/便可以访问到我们创建的tester111.html文件的内容了,如下图所示,这说明我们配置的server是生效的。



          2.下面我们再来说下logs,nginx的log文件存在的目录为/usr/local/nginx/logs目录下,在logs目录下有三个文件,分别是access.log,error.log,nginx.pid,access.log很明显,就是记录浏览器访问的记录,error.log就是记录错误日志,nginx.pid则是记录当前的进程号,如下所示。

[html] view plain copy
  1. [root@nginx1 conf]# cd /usr/local/nginx/  
  2. [root@nginx1 nginx]# ll  
  3. 总用量 40  
  4. drwx------. 2 nobody root 4096 4月   7 05:16 client_body_temp  
  5. drwxr-xr-x. 2 root   root 4096 4月   7 07:00 conf  
  6. drwx------. 2 nobody root 4096 4月   7 05:16 fastcgi_temp  
  7. drwxr-xr-x. 2 root   root 4096 4月   7 04:37 html  
  8. drwxr-xr-x. 2 root   root 4096 4月   7 05:16 logs  
  9. drwx------. 2 nobody root 4096 4月   7 05:16 proxy_temp  
  10. drwxr-xr-x. 2 root   root 4096 4月   7 04:37 sbin  
  11. drwx------. 2 nobody root 4096 4月   7 05:16 scgi_temp  
  12. drwxr-xr-x. 2 root   root 4096 4月   7 06:45 tester  
  13. drwx------. 2 nobody root 4096 4月   7 05:16 uwsgi_temp  
  14. [root@nginx1 nginx]# cd logs/  
  15. [root@nginx1 logs]# ll  
  16. 总用量 16  
  17. -rw-r--r--. 1 root root 4121 4月   7 07:01 access.log  
  18. -rw-r--r--. 1 root root 3435 4月   7 07:01 error.log  
  19. -rw-r--r--. 1 root root    5 4月   7 05:16 nginx.pid  
  20. [root@nginx1 logs]#   
          我们可以查看下nginx.pid文件的内容,然后再查看当前nginx的进程,发现两个进程号都是3654。这个文件的一个用处就是当需要杀掉当前nginx进程的时候,可以使用shell脚本去nginx.pid文件中获取到该进程号然后再使用kill -9 pid进程号命令杀掉nginx。

[html] view plain copy
  1. [root@nginx1 logs]# cat nginx.pid  
  2. 3654  
  3. [root@nginx1 logs]# ps -ef | grep nginx  
  4. root       3654      1  0 05:16 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx  
  5. nobody     4085   3654  0 07:01 ?        00:00:00 nginx: worker process        
  6. root       4090   1368  0 07:23 pts/0    00:00:00 grep nginx  
  7. [root@nginx1 logs]#   
          logs目录下的access.log和error.log两个文件都是在nginx启动的时候自动生成的,我们不能删掉nginx.pid否则启动nginx会报错!!如果你人为删掉access.log和error.log文件,需要重启nginx才能重新生成,访问页面是无法生成这两个文件的。
[html] view plain copy
  1. [root@nginx1 logs]# ls  
  2. nginx.pid  
  3. [root@nginx1 logs]# ls  
  4. nginx.pid  
  5. [root@nginx1 logs]# /usr/local/nginx/sbin/nginx -s reload  
  6. [root@nginx1 logs]# ll  
  7. 总用量 8  
  8. -rw-r--r--. 1 root root  0 4月   7 07:30 access.log  
  9. -rw-r--r--. 1 root root 60 4月   7 07:30 error.log  
  10. -rw-r--r--. 1 root root  5 4月   7 05:16 nginx.pid  
  11. [root@nginx1 logs]#   
        我们可以在不同的server配置不同的log文件,我在80端口所在的server还是使用默认的这个access.log,在1234端口所在的server使用test.com.log。如下图所示。



       为了不让原来log文件中的内容影响我们的结果,我们先把access.log和error.log文件删除,由于修改了配置文件并且要生成log文件,因此我们需要重启nginx,重启后,我们到/usr/local/nginx/logs/目录下查看生成的日志文件,如下所示。可以看到已经生成我说的几个日志文件了,这时候日志文件都是空的。

[html] view plain copy
  1. [root@nginx1 conf]# /usr/local/nginx/sbin/nginx -s reload  
  2. [root@nginx1 conf]# ps -ef | grep nginx  
  3. root       3654      1  0 05:16 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx  
  4. nobody     4141   3654  0 08:01 ?        00:00:00 nginx: worker process        
  5. root       4143   1368  0 08:02 pts/0    00:00:00 grep nginx  
  6. [root@nginx1 conf]# cd /usr/local/nginx/logs/  
  7. [root@nginx1 logs]# ll  
  8. 总用量 8  
  9. -rw-r--r--. 1 root root  0 4月   7 08:01 access.log  
  10. -rw-r--r--. 1 root root 60 4月   7 08:01 error.log  
  11. -rw-r--r--. 1 root root  5 4月   7 05:16 nginx.pid  
  12. -rw-r--r--. 1 root root  0 4月   7 08:01 test.com.log  
  13. [root@nginx1 logs]#   
         我们可以在浏览器访问一下1234端口对应的server,访问之后,我们查看test.com.log文件,可以看到一条访问记录,提示IP为192.168.156.100(我本机配置与虚拟机同一网段的IP)访问了一次该服务。

[html] view plain copy
  1. [root@nginx1 logs]# cat test.com.log   
  2. 192.168.156.100 - - [07/Apr/2017:08:04:23 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; LCTE)" "-"  
  3. [root@nginx1 logs]#   
         我们再访问下80端口服务,然后查看access.log文件,如下图所示,也查看到了我们的访问记录。由于浏览器有缓存,当我们第二次或更多次刷新页面的时候日志不会累加。想要每次刷新页面都有日志信息的话,可以设置让浏览器不保存缓存信息,大家可以参考http://blog.csdn.net/u012453843/article/details/69499563这篇博客进行设置。


         下面来说下日志切割,我们在日常生活中,对nginx日志的分析非常的重要,通常需要运维去对nginx的日志进行切割和分析处理。比如实现一个定时任务,去处理nginx日志等。为什么要进行日志拆分?这是因为对于一个访问量大的网站来说,日志的增长是非常快的,如果都放在一个文件当中,查看将非常不方便,不利于问题的解决,我们根据公司的实际情况定时对日志进行拆分,像天猫、京东这样的大型互联网站,每隔多少分钟可能就需要进行一次拆分,对于一般的公司来说,可以每小时或者每天拆分一次。

          分割日志,我们肯定不能靠人工去分割,我们采用的是shell脚本来进行分割,做法就是先把日志文件移动到另一个地方并根据时间命名,然后再重新生成一个新的日志文件。由于需要定时做分割,因此我们在contab里面定时去调用shell脚本

          首先我们在/usr/local/nginx/sbin/目录下创建一个log.sh的脚本,如下所示。

[html] view plain copy
  1. [root@nginx1 sbin]# pwd  
  2. /usr/local/nginx/sbin  
  3. [root@nginx1 sbin]# vim log.sh  

           log.sh脚本内容如下:

[html] view plain copy
  1. #基础路径:/usr/local/nginx  
  2. BASE_DIR=/usr/local/nginx  
  3. #原文件名称:test.com.access.log  
  4. BASE_FILE_NAME=test.com.access.log  
  5.   
  6. #当前日志文件路径:/usr/local/nginx/logs  
  7. CURRENT_PATH=$BASE_DIR/logs  
  8. #备份日志文件地址:/usr/local/nginx/datalogs  
  9. BAK_PATH=$BASE_DIR/datalogs  
  10.   
  11. #当前日志文件:/usr/local/nginx/logs/test.com.access.log  
  12. CURRENT_FILE=$CURRENT_PATH/$BASE_FILE_NAME  
  13. #备份今天的日志,为了方便测试我们的定时器功能,这里把时间精确到分钟,名称如:201704071720  
  14. BAK_TIME=`/bin/date -d today +%Y%m%d%H%M`  
  15. #备份文件:/usr/local/nginx/datalogs/201704071720-test.com.access.log  
  16. BAK_FILE=$BAK_PATH/$BAK_TIME-$BASE_FILE_NAME  
  17. #输出备份文件信息  
  18. echo $BAK_FILE  
  19.   
  20. #备份之前先关闭nginx,关闭命令:/usr/local/nginx/sbin/nginx -s stop  
  21. $BASE_DIR/sbin/nginx -s stop  
  22.   
  23. #将/usr/local/nginx/logs/test.com.access.log移动到/usr/local/nginx/datalogs/201704071720-test.com.access.log  
  24. mv $CURRENT_FILE $BAK_FILE  
  25. #启动nginx,命令:/usr/local/nginx/sbin/nginx,重启之后会自动再生成一个test.com.access.log文件  
  26. $BASE_DIR/sbin/nginx  
       由于我们在脚本中设置了日志备份目录datalogs,而该目录目前还没有创建,因此我们需要创建该目录,如下所示。

[html] view plain copy
  1. [root@nginx1 nginx]# mkdir datalogs  
  2. [root@nginx1 nginx]# ll  
  3. 总用量 40  
  4. drwx------. 2 nobody root 4096 4月   7 02:59 client_body_temp  
  5. drwxr-xr-x. 2 root   root 4096 4月   7 02:58 conf  
  6. drwxr-xr-x. 2 root   root 4096 4月   7 08:41 datalogs  
  7. drwx------. 2 nobody root 4096 4月   7 02:59 fastcgi_temp  
  8. drwxr-xr-x. 2 root   root 4096 4月   7 02:58 html  
  9. drwxr-xr-x. 2 root   root 4096 4月   7 02:59 logs  
  10. drwx------. 2 nobody root 4096 4月   7 02:59 proxy_temp  
  11. drwxr-xr-x. 2 root   root 4096 4月   7 02:58 sbin  
  12. drwx------. 2 nobody root 4096 4月   7 02:59 scgi_temp  
  13. drwx------. 2 nobody root 4096 4月   7 02:59 uwsgi_temp  
  14. [root@nginx1 nginx]#   
         在定时调用log.sh脚本文件之前,我们需要给予该脚本文件执行权限,我们先看看我们创建的log.sh默认是什么权限,如下所示,可以卡到,只有读的权限。

[html] view plain copy
  1. [root@nginx1 sbin]# ll  
  2. 总用量 3048  
  3. -rw-r--r--. 1 root root    1016 4月   7 09:11 log.sh  
  4. -rwxr-xr-x. 1 root root 3115344 4月   7 02:58 nginx  
  5. [root@nginx1 sbin]#   

        我们给log.sh文件赋予所有权限,如下所示。

[html] view plain copy
  1. [root@nginx1 sbin]# chmod 777 log.sh   
  2. [root@nginx1 sbin]# ll  
  3. 总用量 3048  
  4. -rwxrwxrwx. 1 root root    1016 4月   7 10:12 log.sh  
  5. -rwxr-xr-x. 1 root root 3115344 4月   7 02:58 nginx  
  6. [root@nginx1 sbin]#   
 

       下面我们便使用crontab -e命令去设置定时任务,如下所示。

[html] view plain copy
  1. #每天凌晨两点备份前一天的日志  
  2. #* 2 * * * sh /usr/local/nginx/sbin/log.sh  
  3. #为了测试方便,我们暂且设置成每分钟执行一次备份  
  4. */1 * * * * sh /usr/local/nginx/sbin/log.sh  
         设置好定时任务之后,保存退出,这样每隔一分钟便会执行一次log.sh脚本,同时会生成一个备份文件,我们到/usr/local/nginx/datalogs目录下进行查看,如下所示,可以看到,每隔一分钟便会有一个备份文件产生,命名规则与我们设置的完全一致。

[html] view plain copy
  1. [root@nginx1 sbin]# cd /usr/local/nginx/datalogs/  
  2. You have new mail in /var/spool/mail/root  
  3. [root@nginx1 datalogs]# ll  
  4. 总用量 0  
  5. -rw-r--r--. 1 root root 0 4月   7 10:12 201704071013-test.com.access.log  
  6. -rw-r--r--. 1 root root 0 4月   7 10:13 201704071014-test.com.access.log  
  7. -rw-r--r--. 1 root root 0 4月   7 10:14 201704071015-test.com.access.log  
  8. -rw-r--r--. 1 root root 0 4月   7 10:15 201704071016-test.com.access.log  
  9. -rw-r--r--. 1 root root 0 4月   7 10:16 201704071017-test.com.access.log  
  10. -rw-r--r--. 1 root root 0 4月   7 10:17 201704071018-test.com.access.log  
  11. -rw-r--r--. 1 root root 0 4月   7 10:18 201704071019-test.com.access.log  
  12. -rw-r--r--. 1 root root 0 4月   7 10:19 201704071020-test.com.access.log  
  13. -rw-r--r--. 1 root root 0 4月   7 10:20 201704071021-test.com.access.log  
  14. -rw-r--r--. 1 root root 0 4月   7 10:21 201704071022-test.com.access.log  
  15. -rw-r--r--. 1 root root 0 4月   7 10:22 201704071023-test.com.access.log  
  16. -rw-r--r--. 1 root root 0 4月   7 10:23 201704071024-test.com.access.log  
  17. [root@nginx1 datalogs]#   
          如果发现没有备份文件产生,那肯定是有错误了,那么怎么看错误信息呢?其实系统已经告诉我们了,如下所示,提示我们去/var/spool/mail/root文件中进行查看。
[html] view plain copy
  1. [root@nginx1 sbin]# cd /usr/local/nginx/datalogs/  
  2. You have new mail in /var/spool/mail/root  

          比如我在刚开始的时候把获取日期的那行的`搞成'了,可以看到,该文件中明确告诉我们是日期那行出了错误。

          

      3.nginx配置实现动静分离

       对于nginx来说,实现动静分离是件非常容易的事,我们只需要配置多个location便可以达到这个目的。location的基础语法有三种:

1.location = pattern {}精确匹配

2.location pattern {} 一般匹配

3.location ~ pattern {} 正则匹配

        下面我们就使用正则表达式举个例子,我们打开nginx.conf配置文件,并修改端口为1234的server的location,如下所示,用来匹配以tester开头的文件。

[html] view plain copy
  1. server {  
  2.         listen 1234;  
  3.         server_name test.com;  
  4.         location ~ tester {  
  5.             root tester;  
  6.             index tester111.html;  
  7.         }  
  8.         access_log  logs/test.com.log  main;  
  9.     }  
       修改完之后,我们重启nginx。

[html] view plain copy
  1. [root@nginx1 nginx]# /usr/local/nginx/sbin/nginx -s reload  
       重启nginx之后,我们这时再访问http://test.com:1234的话,将不能访问到tester111.html了,而是访问到index.html(即nginx欢迎页了),如下图所示。出现这种情况的原因就是我们输入http://test.com:1234后,它会去匹配location /{},结果发现在端口为1234的server当中没有location /{},于是便会去试着找其它有location /{}的server,发现80端口可以匹配成功,因此便去访问80端口所对应的欢迎页了。      

           当我们在地址栏输入http://test.com:1234/tester111.html时,页面如下图所示。这时之所以可以访问到/usr/local/nginx/tester目录下的tester111.thtml,就是因为我们在端口为1234的server当中设置了正则表达式即:location ~ tester {},它可以匹配以tester开头的请求,而且必须注意的是,访问的文件必须真实存在,比如访问tester111.html文件可以,这是因为在tester目录下确实有该文件,如果访问tester123.html就会报404,因为找不到这么一个文件。那么为什么这时不去访问80端口的欢迎页了呢?这是因为此时地址栏输入的请求信息是要具体访问某个文件了,不适合再导向欢迎页。


      下面再说下在nginx中if条件的使用,if(条件为:=~~*)、return、break、rewrite。-f是否为文件、-d是否为目录、-e是否存在。我们就举个if条件的例子,我们在nginx.conf文件的1234所对应的server的location当中添加if条件,如下所示,添加的判断是如果发起请求的IP地址是192.168.156.100(我本地的IP地址)的话,就返回401错误。

[html] view plain copy
  1. server {  
  2.         listen 1234;  
  3.         server_name test.com;  
  4.         location ~ tester {  
  5.             if ($remote_addr = 192.168.156.100) {  
  6.                return 401;  
  7.             }  
  8.             root tester;  
  9.             index tester111.html;  
  10.         }  
  11.         access_log  logs/test.com.log  main;  
  12.     }  
       修改完配置文件,我们重启nginx

[html] view plain copy
  1. [root@nginx1 conf]# /usr/local/nginx/sbin/nginx -s reload  
       重启完nginx之后,我们再访问http://test.com:1234/tester111.html这个地址就会出现如下图所示的结果。这说明我们配置的拦截条件生效了。

       下面再举个if条件的例子,我们把if条件改成如下所示的样子,它的意思是访问的浏览器如果是chrome浏览器的话,不管你是什么请求都定位到chrome.html页面,然后break跳出(如果不加break的话,每次请求过来都会重新让浏览器发起重定向请求,而且永远不会结束,从而无法真正访问到chrome.html页面,导致提示404错误)。

[html] view plain copy
  1. server {  
  2.         listen 1234;  
  3.         server_name test.com;  
  4.         location ~ tester {  
  5.             if ($http_user_agent ~* chrome) {  
  6.                rewrite ^.*$ /chrome.html;  
  7.                break;  
  8.             }  
  9.             root tester;  
  10.             index tester111.html;  
  11.         }  
  12.         access_log  logs/test.com.log  main;  
  13.     }  
       既然要重定向到chrome.html页面,那么我们便需要先创建该文件,如下所示。

[html] view plain copy
  1. [root@nginx1 nginx]# cd tester/  
  2. [root@nginx1 tester]# pwd  
  3. /usr/local/nginx/tester  
  4. [root@nginx1 tester]# ll  
  5. 总用量 4  
  6. -rw-r--r--. 1 root root 57 4月   7 06:45 tester111.html  
  7. [root@nginx1 tester]# vim chrome.html  
  8.   
  9. <html>  
  10. <body>Chrome Page!!!!</body>  
  11. </html>  
       既然修改了nginx.conf文件,我们便需要重启nginx

[html] view plain copy
  1. [root@nginx1 tester]# /usr/local/nginx/sbin/nginx -s reload  
      重启之后,我们再访问http://test.com:1234/tester111.html,这时访问结果如下图所示,可以看到请求被成功重定向到chrome.html页面了。


      那么为何可以达到这个效果呢?我们来看看谷歌浏览器的请求日志信息,如下图所示,可以看到谷歌浏览器的请求信息中有"Chrome"信息,我们的if ($http_user_agent ~* chrome)条件判断中使用了正则表达式,* chrome可以忽略大小写,所以"Chrome"也可以匹配"chrome",既然浏览器匹配,就进入到了if条件当中,rewrite ^.*$ /chrome.html;这句话的意思是不论你要请求什么资源,都给你定向到chrome.html文件,因此我们才看到了chrome.html文件的内容。


      下面再举个例子,我们在端口为1234的server当中再加一个location,匹配goods,如下所示。

[html] view plain copy
  1. server {  
  2.         listen 1234;  
  3.         server_name test.com;  
  4.         location ~ tester {  
  5.             if ($http_user_agent ~* chrome) {  
  6.                rewrite ^.*$ /chrome.html;  
  7.                break;  
  8.             }  
  9.             root tester;  
  10.             index tester111.html;  
  11.         }  
  12.   
  13.         location /goods {  
  14.              rewrite "goods-(\d{1,5})\.html" /goods-ctrl.html;  
  15.              root tester;  
  16.              index tester111.html;  
  17.          }  
  18.         access_log  logs/test.com.log  main;  
  19.     }  
       我们还是得在/usr/local/nginx/tester目录下创建一下goods-ctrl.html文件,如下所示。

[html] view plain copy
  1. [root@nginx1 conf]# cd /usr/local/nginx/tester/  
  2. [root@nginx1 tester]# ll  
  3. 总用量 8  
  4. -rw-r--r--. 1 root root 44 4月   8 05:52 chrome.html  
  5. -rw-r--r--. 1 root root 57 4月   7 06:45 tester111.html  
  6. [root@nginx1 tester]# vim goods-ctrl.html  
  7.   
  8. <html>  
  9.   <body>Goods Page!!!!</body>  
  10. </html>  
         由于修改了nginx.conf文件,因此需要重启nginx

[html] view plain copy
  1. [root@nginx1 tester]# /usr/local/nginx/sbin/nginx -s reload  

         重启之后,我们在浏览器输入goods-后面跟0到5位的数字然后是.html,这样才能匹配重定向条件,会被重定向到goods-ctrl.html页面。这个例子在真实项目中是非常常见的,Rewrite最主要的作用就是对URL进行重写,即重定向。举个简单的例子,我们用电脑打开淘宝显示出的页面与手机打开显示出的页面,或者是IE与Chrome浏览器打开的页面,有着特别大的差别,这就是使用了Rewrite模块,为用户提供最合适的页面。


      nginx还可以对数据进行压缩,对一些图片、html、css、js等文件进行缓存、从而实现动静分离等等优化功能,在网站做优化的时候非常的有用。

      所谓的动静分离,通过上面的例子,我们完全可以将动态的请求都交给tomcat处理,静态的请求都交给nginx来处理,这是非常容易做到的事情。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章