一、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并且要能上网。配置好静态IP并且能上网之后需要先安装wget、vim和gcc。
- yum install wget
- yum install vim-enhanced
- yum install make cmake gcc gcc-c++
1、下载nginx安装包
- [root@nginx1 ~]# wget http://nginx.org/download/nginx-1.6.2.tar.gz
- --2017-04-07 01:44:55-- http://nginx.org/download/nginx-1.6.2.tar.gz
- 正在解析主机 nginx.org... 206.251.255.63, 95.211.80.227, 2606:7100:1:69::3f, ...
- 正在连接 nginx.org|206.251.255.63|:80... 已连接。
- 已发出 HTTP 请求,正在等待回应... 200 OK
- 长度:804164 (785K) [application/octet-stream]
- 正在保存至: “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库。
- yum install -y pcre pcre-devel
- yum install -y zlib zlib-devel
- yum install -y openssl openssl-devel
- [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、编译安装
- [root@nginx1 nginx-1.6.2]# make && make install
- [root@nginx1 nginx-1.6.2]# /usr/local/nginx/sbin/nginx
- [root@nginx1 nginx-1.6.2]# ps -ef | grep nginx
- root 3640 1 0 04:40 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
- nobody 3641 3640 0 04:40 ? 00:00:00 nginx: worker process
- root 3643 1368 0 04:40 pts/0 00:00:00 grep nginx
- [root@nginx1 nginx-1.6.2]#
- [root@nginx1 nginx-1.6.2]# /usr/local/nginx/sbin/nginx -s stop
- [root@nginx1 nginx-1.6.2]# /usr/local/nginx/sbin/nginx -s reload
- [root@nginx1 nginx-1.6.2]# vim /etc/sysconfig/iptables
- # Firewall configuration written by system-config-firewall
- # Manual customization of this file is not recommended.
- *filter
- :INPUT ACCEPT [0:0]
- :FORWARD ACCEPT [0:0]
- :OUTPUT ACCEPT [0:0]
- -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- -A INPUT -p icmp -j ACCEPT
- -A INPUT -i lo -j ACCEPT
- -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
- -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
- -A INPUT -j REJECT --reject-with icmp-host-prohibited
- -A FORWARD -j REJECT --reject-with icmp-host-prohibited
- COMMIT
- [root@nginx1 nginx-1.6.2]# service iptables restart
- iptables:将链设置为政策 ACCEPT:filter [确定]
- iptables:清除防火墙规则: [确定]
- iptables:正在卸载模块: [确定]
- 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就是修改该文件,如下所示。
- [root@nginx1 nginx-1.6.2]# cd /usr/local/nginx
- [root@nginx1 nginx]# ll
- 总用量 36
- drwx------. 2 nobody root 4096 4月 7 05:16 client_body_temp
- drwxr-xr-x. 2 root root 4096 4月 7 04:37 conf
- drwx------. 2 nobody root 4096 4月 7 05:16 fastcgi_temp
- drwxr-xr-x. 2 root root 4096 4月 7 04:37 html
- drwxr-xr-x. 2 root root 4096 4月 7 05:16 logs
- drwx------. 2 nobody root 4096 4月 7 05:16 proxy_temp
- drwxr-xr-x. 2 root root 4096 4月 7 04:37 sbin
- drwx------. 2 nobody root 4096 4月 7 05:16 scgi_temp
- drwx------. 2 nobody root 4096 4月 7 05:16 uwsgi_temp
- [root@nginx1 nginx]# cd conf
- [root@nginx1 conf]# ll
- 总用量 60
- -rw-r--r--. 1 root root 1034 4月 7 04:37 fastcgi.conf
- -rw-r--r--. 1 root root 1034 4月 7 04:37 fastcgi.conf.default
- -rw-r--r--. 1 root root 964 4月 7 04:37 fastcgi_params
- -rw-r--r--. 1 root root 964 4月 7 04:37 fastcgi_params.default
- -rw-r--r--. 1 root root 2837 4月 7 04:37 koi-utf
- -rw-r--r--. 1 root root 2223 4月 7 04:37 koi-win
- -rw-r--r--. 1 root root 3957 4月 7 04:37 mime.types
- -rw-r--r--. 1 root root 3957 4月 7 04:37 mime.types.default
- -rw-r--r--. 1 root root 2656 4月 7 04:37 nginx.conf
- -rw-r--r--. 1 root root 2656 4月 7 04:37 nginx.conf.default
- -rw-r--r--. 1 root root 596 4月 7 04:37 scgi_params
- -rw-r--r--. 1 root root 596 4月 7 04:37 scgi_params.default
- -rw-r--r--. 1 root root 623 4月 7 04:37 uwsgi_params
- -rw-r--r--. 1 root root 623 4月 7 04:37 uwsgi_params.default
- -rw-r--r--. 1 root root 3610 4月 7 04:37 win-utf
- [root@nginx1 conf]#
- #user nobody;
- #开启进程数 <=CPU数
- worker_processes 1;
- #错误日志保存位置
- #error_log logs/error.log;
- #error_log logs/error.log notice;
- #error_log logs/error.log info;
- #进程号保存文件
- #pid logs/nginx.pid;
- #每个进程最大连接数(最大连接=连接数x进程数)每个worker允许同时产生多少个链接,默认1024
- events {
- worker_connections 1024;
- }
- http {
- #文件扩展名与文件类型映射表
- include 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 logs/access.log main;
- #打开发送文件
- sendfile on;
- #tcp_nopush on;
- #keepalive_timeout 0;
- #连接超时时间
- keepalive_timeout 65;
- #打开gzip压缩
- #gzip on;
- server {
- #监听端口,默认是80端口
- listen 80;
- #监听域名
- server_name localhost;
- #charset koi8-r;
- #nginx访问日志放在logs/host.access.log下,并且使用main格式(还可以自定义格式)
- #access_log logs/host.access.log main;
- #如果没有location更明确的匹配访问路径的话,访问请求都会被该location处理。
- location / {
- #root指定nginx的根目录为/usr/local/nginx/html
- root html;
- #默认访问文件,欢迎页先去html目录下找index.html,如果找不到再去找index.htm
- index index.html index.htm;
- }
- #error_page 404 /404.html;
- # redirect server error pages to the static page /50x.html
- #
- #错误页面及其返回地址,错误码为500、502、503、504都会返回50.html错误页面。
- error_page 500 502 503 504 /50x.html;
- #location后面是"="的话,说明是精确匹配
- location = /50x.html {
- root html;
- }
- # proxy the PHP scripts to Apache listening on 127.0.0.1:80
- #
- #location ~ \.php$ {
- # proxy_pass http://127.0.0.1;
- #}
- # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
- #
- #location ~ \.php$ {
- # root html;
- # fastcgi_pass 127.0.0.1:9000;
- # fastcgi_index index.php;
- # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
- # include fastcgi_params;
- #}
- # deny access to .htaccess files, if Apache's document root
- # concurs with nginx's one
- #
- #location ~ /\.ht {
- # deny all;
- #}
- }
- # another virtual host using mix of IP-, name-, and port-based configuration
- #
- #server {
- # listen 8000;
- # listen somename:8080;
- # server_name somename alias another.alias;
- # location / {
- # root html;
- # index index.html index.htm;
- # }
- #}
- # HTTPS server
- #
- #server {
- # listen 443 ssl;
- # server_name localhost;
- # ssl_certificate cert.pem;
- # ssl_certificate_key cert.key;
- # ssl_session_cache shared:SSL:1m;
- # ssl_session_timeout 5m;
- # ssl_ciphers HIGH:!aNULL:!MD5;
- # ssl_prefer_server_ciphers on;
- # location / {
- # root html;
- # index index.html index.htm;
- # }
- #}
- }
- #user nobody;
- #开启进程数 <=CPU数
- worker_processes 1;
- #错误日志保存位置
- #error_log logs/error.log;
- #error_log logs/error.log notice;
- #error_log logs/error.log info;
- #进程号保存文件
- #pid logs/nginx.pid;
- #每个进程最大连接数(最大连接=连接数x进程数)每个worker允许同时产生多少个链接,默认1024
- events {
- worker_connections 1024;
- }
- http {
- #文件扩展名与文件类型映射表
- include 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 logs/access.log main;
- #打开发送文件
- sendfile on;
- #tcp_nopush on;
- #keepalive_timeout 0;
- #连接超时时间
- keepalive_timeout 65;
- #打开gzip压缩
- #gzip on;
- server {
- #监听端口
- listen 80;
- #监听域名
- server_name localhost;
- #charset koi8-r;
- #nginx访问日志放在logs/host.access.log下,并且使用main格式(还可以自定义格式)
- #access_log logs/host.access.log main;
- #如果没有location更明确的匹配访问路径的话,访问请求都会被该location处理。
- location / {
- #root指定nginx的根目录为/usr/local/nginx/html
- root html;
- #默认访问文件,欢迎页先去html目录下找index.html,如果找不到再去找index.htm
- index index.html index.htm;
- }
- #error_page 404 /404.html;
- # redirect server error pages to the static page /50x.html
- #
- #错误页面及其返回地址,错误码为500、502、503、504都会返回50.html错误页面。
- error_page 500 502 503 504 /50x.html;
- #location后面是"="的话,说明是精确匹配
- location = /50x.html {
- root html;
- }
- server {
- listen 1234;
- server_name test.com;
- location / {
- #正则表达式匹配uri方式:在/usr/local/nginx/tester下 建立一个tester111.html 然后使用正则匹配
- root tester;
- index tester111.html;
- }
- }
- }
- }
- [root@nginx1 nginx]# mkdir tester
- [root@nginx1 nginx]# ll
- 总用量 40
- drwx------. 2 nobody root 4096 4月 7 05:16 client_body_temp
- drwxr-xr-x. 2 root root 4096 4月 7 06:32 conf
- drwx------. 2 nobody root 4096 4月 7 05:16 fastcgi_temp
- drwxr-xr-x. 2 root root 4096 4月 7 04:37 html
- drwxr-xr-x. 2 root root 4096 4月 7 05:16 logs
- drwx------. 2 nobody root 4096 4月 7 05:16 proxy_temp
- drwxr-xr-x. 2 root root 4096 4月 7 04:37 sbin
- drwx------. 2 nobody root 4096 4月 7 05:16 scgi_temp
- drwxr-xr-x. 2 root root 4096 4月 7 06:37 tester
- drwx------. 2 nobody root 4096 4月 7 05:16 uwsgi_temp
- [root@nginx1 nginx]# cd tester/
- [root@nginx1 tester]# vim tester111.html
- <html>
- <body>Hello This is Nginx Test!</body>
- </html>
在防火墙配置中添加完1234端口后,我们需要重启nginx,如下所示。
- [root@nginx1 nginx]# /usr/local/nginx/sbin/nginx -s reload
- [root@nginx1 nginx]# ps -ef|grep nginx
- root 3654 1 0 05:16 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
- nobody 3870 3654 0 06:47 ? 00:00:00 nginx: worker process
- root 3872 1368 0 06:47 pts/0 00:00:00 grep nginx
- [root@nginx1 nginx]#
下面我们在地址栏输入: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则是记录当前的进程号,如下所示。
- [root@nginx1 conf]# cd /usr/local/nginx/
- [root@nginx1 nginx]# ll
- 总用量 40
- drwx------. 2 nobody root 4096 4月 7 05:16 client_body_temp
- drwxr-xr-x. 2 root root 4096 4月 7 07:00 conf
- drwx------. 2 nobody root 4096 4月 7 05:16 fastcgi_temp
- drwxr-xr-x. 2 root root 4096 4月 7 04:37 html
- drwxr-xr-x. 2 root root 4096 4月 7 05:16 logs
- drwx------. 2 nobody root 4096 4月 7 05:16 proxy_temp
- drwxr-xr-x. 2 root root 4096 4月 7 04:37 sbin
- drwx------. 2 nobody root 4096 4月 7 05:16 scgi_temp
- drwxr-xr-x. 2 root root 4096 4月 7 06:45 tester
- drwx------. 2 nobody root 4096 4月 7 05:16 uwsgi_temp
- [root@nginx1 nginx]# cd logs/
- [root@nginx1 logs]# ll
- 总用量 16
- -rw-r--r--. 1 root root 4121 4月 7 07:01 access.log
- -rw-r--r--. 1 root root 3435 4月 7 07:01 error.log
- -rw-r--r--. 1 root root 5 4月 7 05:16 nginx.pid
- [root@nginx1 logs]#
- [root@nginx1 logs]# cat nginx.pid
- 3654
- [root@nginx1 logs]# ps -ef | grep nginx
- root 3654 1 0 05:16 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
- nobody 4085 3654 0 07:01 ? 00:00:00 nginx: worker process
- root 4090 1368 0 07:23 pts/0 00:00:00 grep nginx
- [root@nginx1 logs]#
- [root@nginx1 logs]# ls
- nginx.pid
- [root@nginx1 logs]# ls
- nginx.pid
- [root@nginx1 logs]# /usr/local/nginx/sbin/nginx -s reload
- [root@nginx1 logs]# ll
- 总用量 8
- -rw-r--r--. 1 root root 0 4月 7 07:30 access.log
- -rw-r--r--. 1 root root 60 4月 7 07:30 error.log
- -rw-r--r--. 1 root root 5 4月 7 05:16 nginx.pid
- [root@nginx1 logs]#
为了不让原来log文件中的内容影响我们的结果,我们先把access.log和error.log文件删除,由于修改了配置文件并且要生成log文件,因此我们需要重启nginx,重启后,我们到/usr/local/nginx/logs/目录下查看生成的日志文件,如下所示。可以看到已经生成我说的几个日志文件了,这时候日志文件都是空的。
- [root@nginx1 conf]# /usr/local/nginx/sbin/nginx -s reload
- [root@nginx1 conf]# ps -ef | grep nginx
- root 3654 1 0 05:16 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
- nobody 4141 3654 0 08:01 ? 00:00:00 nginx: worker process
- root 4143 1368 0 08:02 pts/0 00:00:00 grep nginx
- [root@nginx1 conf]# cd /usr/local/nginx/logs/
- [root@nginx1 logs]# ll
- 总用量 8
- -rw-r--r--. 1 root root 0 4月 7 08:01 access.log
- -rw-r--r--. 1 root root 60 4月 7 08:01 error.log
- -rw-r--r--. 1 root root 5 4月 7 05:16 nginx.pid
- -rw-r--r--. 1 root root 0 4月 7 08:01 test.com.log
- [root@nginx1 logs]#
- [root@nginx1 logs]# cat test.com.log
- 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)" "-"
- [root@nginx1 logs]#
下面来说下日志切割,我们在日常生活中,对nginx日志的分析非常的重要,通常需要运维去对nginx的日志进行切割和分析处理。比如实现一个定时任务,去处理nginx日志等。为什么要进行日志拆分?这是因为对于一个访问量大的网站来说,日志的增长是非常快的,如果都放在一个文件当中,查看将非常不方便,不利于问题的解决,我们根据公司的实际情况定时对日志进行拆分,像天猫、京东这样的大型互联网站,每隔多少分钟可能就需要进行一次拆分,对于一般的公司来说,可以每小时或者每天拆分一次。
分割日志,我们肯定不能靠人工去分割,我们采用的是shell脚本来进行分割,做法就是先把日志文件移动到另一个地方并根据时间命名,然后再重新生成一个新的日志文件。由于需要定时做分割,因此我们在contab里面定时去调用shell脚本
首先我们在/usr/local/nginx/sbin/目录下创建一个log.sh的脚本,如下所示。
- [root@nginx1 sbin]# pwd
- /usr/local/nginx/sbin
- [root@nginx1 sbin]# vim log.sh
log.sh脚本内容如下:
- #基础路径:/usr/local/nginx
- BASE_DIR=/usr/local/nginx
- #原文件名称:test.com.access.log
- BASE_FILE_NAME=test.com.access.log
- #当前日志文件路径:/usr/local/nginx/logs
- CURRENT_PATH=$BASE_DIR/logs
- #备份日志文件地址:/usr/local/nginx/datalogs
- BAK_PATH=$BASE_DIR/datalogs
- #当前日志文件:/usr/local/nginx/logs/test.com.access.log
- CURRENT_FILE=$CURRENT_PATH/$BASE_FILE_NAME
- #备份今天的日志,为了方便测试我们的定时器功能,这里把时间精确到分钟,名称如:201704071720
- BAK_TIME=`/bin/date -d today +%Y%m%d%H%M`
- #备份文件:/usr/local/nginx/datalogs/201704071720-test.com.access.log
- BAK_FILE=$BAK_PATH/$BAK_TIME-$BASE_FILE_NAME
- #输出备份文件信息
- echo $BAK_FILE
- #备份之前先关闭nginx,关闭命令:/usr/local/nginx/sbin/nginx -s stop
- $BASE_DIR/sbin/nginx -s stop
- #将/usr/local/nginx/logs/test.com.access.log移动到/usr/local/nginx/datalogs/201704071720-test.com.access.log
- mv $CURRENT_FILE $BAK_FILE
- #启动nginx,命令:/usr/local/nginx/sbin/nginx,重启之后会自动再生成一个test.com.access.log文件
- $BASE_DIR/sbin/nginx
- [root@nginx1 nginx]# mkdir datalogs
- [root@nginx1 nginx]# ll
- 总用量 40
- drwx------. 2 nobody root 4096 4月 7 02:59 client_body_temp
- drwxr-xr-x. 2 root root 4096 4月 7 02:58 conf
- drwxr-xr-x. 2 root root 4096 4月 7 08:41 datalogs
- drwx------. 2 nobody root 4096 4月 7 02:59 fastcgi_temp
- drwxr-xr-x. 2 root root 4096 4月 7 02:58 html
- drwxr-xr-x. 2 root root 4096 4月 7 02:59 logs
- drwx------. 2 nobody root 4096 4月 7 02:59 proxy_temp
- drwxr-xr-x. 2 root root 4096 4月 7 02:58 sbin
- drwx------. 2 nobody root 4096 4月 7 02:59 scgi_temp
- drwx------. 2 nobody root 4096 4月 7 02:59 uwsgi_temp
- [root@nginx1 nginx]#
- [root@nginx1 sbin]# ll
- 总用量 3048
- -rw-r--r--. 1 root root 1016 4月 7 09:11 log.sh
- -rwxr-xr-x. 1 root root 3115344 4月 7 02:58 nginx
- [root@nginx1 sbin]#
我们给log.sh文件赋予所有权限,如下所示。
- [root@nginx1 sbin]# chmod 777 log.sh
- [root@nginx1 sbin]# ll
- 总用量 3048
- -rwxrwxrwx. 1 root root 1016 4月 7 10:12 log.sh
- -rwxr-xr-x. 1 root root 3115344 4月 7 02:58 nginx
- [root@nginx1 sbin]#
下面我们便使用crontab -e命令去设置定时任务,如下所示。
- #每天凌晨两点备份前一天的日志
- #* 2 * * * sh /usr/local/nginx/sbin/log.sh
- #为了测试方便,我们暂且设置成每分钟执行一次备份
- */1 * * * * sh /usr/local/nginx/sbin/log.sh
- [root@nginx1 sbin]# cd /usr/local/nginx/datalogs/
- You have new mail in /var/spool/mail/root
- [root@nginx1 datalogs]# ll
- 总用量 0
- -rw-r--r--. 1 root root 0 4月 7 10:12 201704071013-test.com.access.log
- -rw-r--r--. 1 root root 0 4月 7 10:13 201704071014-test.com.access.log
- -rw-r--r--. 1 root root 0 4月 7 10:14 201704071015-test.com.access.log
- -rw-r--r--. 1 root root 0 4月 7 10:15 201704071016-test.com.access.log
- -rw-r--r--. 1 root root 0 4月 7 10:16 201704071017-test.com.access.log
- -rw-r--r--. 1 root root 0 4月 7 10:17 201704071018-test.com.access.log
- -rw-r--r--. 1 root root 0 4月 7 10:18 201704071019-test.com.access.log
- -rw-r--r--. 1 root root 0 4月 7 10:19 201704071020-test.com.access.log
- -rw-r--r--. 1 root root 0 4月 7 10:20 201704071021-test.com.access.log
- -rw-r--r--. 1 root root 0 4月 7 10:21 201704071022-test.com.access.log
- -rw-r--r--. 1 root root 0 4月 7 10:22 201704071023-test.com.access.log
- -rw-r--r--. 1 root root 0 4月 7 10:23 201704071024-test.com.access.log
- [root@nginx1 datalogs]#
- [root@nginx1 sbin]# cd /usr/local/nginx/datalogs/
- 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开头的文件。
- server {
- listen 1234;
- server_name test.com;
- location ~ tester {
- root tester;
- index tester111.html;
- }
- access_log logs/test.com.log main;
- }
- [root@nginx1 nginx]# /usr/local/nginx/sbin/nginx -s reload
当我们在地址栏输入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错误。
- server {
- listen 1234;
- server_name test.com;
- location ~ tester {
- if ($remote_addr = 192.168.156.100) {
- return 401;
- }
- root tester;
- index tester111.html;
- }
- access_log logs/test.com.log main;
- }
- [root@nginx1 conf]# /usr/local/nginx/sbin/nginx -s reload
下面再举个if条件的例子,我们把if条件改成如下所示的样子,它的意思是访问的浏览器如果是chrome浏览器的话,不管你是什么请求都定位到chrome.html页面,然后break跳出(如果不加break的话,每次请求过来都会重新让浏览器发起重定向请求,而且永远不会结束,从而无法真正访问到chrome.html页面,导致提示404错误)。
- server {
- listen 1234;
- server_name test.com;
- location ~ tester {
- if ($http_user_agent ~* chrome) {
- rewrite ^.*$ /chrome.html;
- break;
- }
- root tester;
- index tester111.html;
- }
- access_log logs/test.com.log main;
- }
- [root@nginx1 nginx]# cd tester/
- [root@nginx1 tester]# pwd
- /usr/local/nginx/tester
- [root@nginx1 tester]# ll
- 总用量 4
- -rw-r--r--. 1 root root 57 4月 7 06:45 tester111.html
- [root@nginx1 tester]# vim chrome.html
- <html>
- <body>Chrome Page!!!!</body>
- </html>
- [root@nginx1 tester]# /usr/local/nginx/sbin/nginx -s reload
那么为何可以达到这个效果呢?我们来看看谷歌浏览器的请求日志信息,如下图所示,可以看到谷歌浏览器的请求信息中有"Chrome"信息,我们的if ($http_user_agent ~* chrome)条件判断中使用了正则表达式,* chrome可以忽略大小写,所以"Chrome"也可以匹配"chrome",既然浏览器匹配,就进入到了if条件当中,rewrite ^.*$ /chrome.html;这句话的意思是不论你要请求什么资源,都给你定向到chrome.html文件,因此我们才看到了chrome.html文件的内容。
下面再举个例子,我们在端口为1234的server当中再加一个location,匹配goods,如下所示。
- server {
- listen 1234;
- server_name test.com;
- location ~ tester {
- if ($http_user_agent ~* chrome) {
- rewrite ^.*$ /chrome.html;
- break;
- }
- root tester;
- index tester111.html;
- }
- location /goods {
- rewrite "goods-(\d{1,5})\.html" /goods-ctrl.html;
- root tester;
- index tester111.html;
- }
- access_log logs/test.com.log main;
- }
- [root@nginx1 conf]# cd /usr/local/nginx/tester/
- [root@nginx1 tester]# ll
- 总用量 8
- -rw-r--r--. 1 root root 44 4月 8 05:52 chrome.html
- -rw-r--r--. 1 root root 57 4月 7 06:45 tester111.html
- [root@nginx1 tester]# vim goods-ctrl.html
- <html>
- <body>Goods Page!!!!</body>
- </html>
- [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来处理,这是非常容易做到的事情。