<服务>Nginx服务

时间:Nov. 20, 2016 分类:

目录:

Nginx

Nginx本身是一款静态web服务,支持epoll模型,具备高并发和占用内存资源少的特点。

Nginx功能

  1. web服务
  2. 负载均衡(反向代理)
  3. web cache(web缓存)

Nginx优点

  1. 支持功能多
  2. 高并发
  3. 占用资源少
  4. 可以限制IP和链接数

Nginx应用场合

  • 静态服务(视频,图片) 并发1~3w
  • 动态服务 500~1500
  • 反向代理,负载均衡 一般日pv2000w以下
  • 缓存服务

反向代理可以理解为,负载均衡服务器获取请求,再重新发送请求给目标服务器

正向代理由路由器代理请求,缓存内容在路由器

安装Nginx

编译安装nginx

[root@why-2 nginx-1.6.3]# useradd nginx -s /sbin/nologin -M
[root@why-2 yum.repos.d]# yum install -y pcre pcre-devel openssl openssl-devel
[root@why-2 ~]# wget http://nginx.org/download/nginx-1.6.3.tar.gz
nginx默认会安装绝大多数模块
[root@why-2 nginx-1.6.3]# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx1.6.3 --with-http_stub_status_module --with-http_ssl_module
[root@why-2 nginx-1.6.3]# make && make install
[root@why-2 nginx-1.6.3]# ln -s /usr/local/nginx1.6.3/ /usr/local/nginx
[root@why-2 nginx-1.6.3]# /usr/local/nginx/sbin/nginx -t    #检测语法
nginx: the configuration file /usr/local/nginx1.6.3/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx1.6.3/conf/nginx.conf test is successful
[root@why-2 nginx-1.6.3]# /usr/local/nginx/sbin/nginx       #启动nginx

检测nginx服务

[root@why-2 nginx-1.6.3]# lsof -i:80
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   10570  root    6u  IPv4 165016      0t0  TCP *:http (LISTEN)
nginx   10571 nginx    6u  IPv4 165016      0t0  TCP *:http (LISTEN)
[root@why-2 nginx-1.6.3]# ps aux | grep nginx
root     10570  0.0  0.0  45000  1044 ?        Ss   03:13   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx    10571  0.0  0.0  45428  1900 ?        S    03:13   0:00 nginx: worker process      
root     10576  0.0  0.0 103264   852 pts/0    S+   03:15   0:00 grep nginx
[root@why-2 nginx-1.6.3]# curl 192.168.0.202
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

进入IP地址

可能会遇到的问题

如果遇到error while loading shared libraries: libpcre.so

find / -name libpcre.so*

两种解决办法:把路径写入到/etc/ld.so.conf或这个软链到/lib64下,ldconfig生效

一般web服务检查方式

  1. ping 192.168.0.202 物理上通不通
  2. telnet 192.168.0.202:80 web服务没开
  3. crul 192.168.0.202

Nginx模块

核心模块

Main
Events

经典模块

Core
Access
FastCGI
Gzip        #压缩模块
Log         #日志模块
Proxy
Rewrite     #URL重写模块
Upsrtream   #负载均衡模块

缺省情况下核心模块和经典模块都会安装

文件目录

[root@why-2 nginx-1.6.3]# tree /usr/local/nginx/
/usr/local/nginx/
├── client_body_temp                #客户端内容临时文件
├── conf                            #配置
│   ├── fastcgi.conf                #配合动态文件的配置文件
│   ├── fastcgi.conf.default
│   ├── fastcgi_params              #配合动态文件的配置文件 
│   ├── fastcgi_params.default
│   ├── koi-utf
│   ├── koi-win
│   ├── mime.types
│   ├── mime.types.default
│   ├── nginx.conf                  #主配置文件
│   ├── nginx.conf.default
│   ├── scgi_params
│   ├── scgi_params.default
│   ├── uwsgi_params
│   ├── uwsgi_params.default
│   └── win-utf
├── fastcgi_temp
├── html                            #站点目录
│   ├── 50x.html
│   └── index.html
├── logs
│   ├── access.log
│   ├── error.log
│   └── nginx.pid
├── proxy_temp
├── sbin
│   └── nginx
├── scgi_temp
└── uwsgi_temp

9 directories, 21 files

配置文件

主配置文件

注:配置以;结尾

[root@why-2 nginx-1.6.3]# egrep -v "#|^$" /usr/local/nginx/conf/nginx.conf
worker_processes  1;    worker子进程数量,一般按着核数来,如果你设置为2,ps -ef就能看到2个worker进程
events {
    worker_connections  1024;       每个worker处理的最大请求 
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {        #url跳转
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

#user  nobody;     默认用户
#access_log  logs/access.log  main;    是否记录访问日志

fastcgi.conf

fastcgi.conf中为系统参数的调用,一般不用修改

nginx虚拟主机

基于域名

[root@why-2 nginx-1.6.3]# egrep -v "#|^$" /usr/local/nginx/conf/nginx.conf.default > /usr/local/nginx/conf/nginx.conf
service添加
    server {
        listen       80;
        server_name  www.why.cn;
        location / {
            root   html/why;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       80;
        server_name  www.why2.cn;
        location / {
            root   html/why2;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       80;
        server_name  www.why3.cn;
        location / {
            root   html/why3;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

生成根目录和主页文件

[root@why-2 nginx-1.6.3]# for n in why why2 why3 ;do mkdir /usr/local/nginx/html/$n ;done
[root@why-2 nginx-1.6.3]# for n in why why2 why3 ;do echo "www.$n.com"> /usr/local/nginx/html/$n/index.html ;done
[root@why-2 nginx-1.6.3]# for n in why why2 why3 ;do cat /usr/local/nginx/html/$n/index.html ;done
www.why.com
www.why2.com
www.why3.com
[root@why-2 nginx-1.6.3]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx1.6.3/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx1.6.3/conf/nginx.conf test is successful
[root@why-2 nginx-1.6.3]# /usr/local/nginx/sbin/nginx -s reload

配置本地hosts文件

192.168.0.202 www.why.cn www.why2.cn www.why3.cn

基于端口解析

修改server标签中的listen即可

基于IP解析

修改server标签中的listen,例如listen 192.168.0.202:80

nginx状态信息显示

主配置文件

server {
    listen       80;
    server_name  www.why4.cn;
    stub_status on;
    access_log off;
}

状态信息含义

  • Active connections #正在处理的连接数
  • server #共处理多少连接数
  • accepts #成功创建多少次握手
  • handled requests #共处理多少请求

  • Reading读取到的header数

  • Writing返回的header数
  • Waiting已经处理完正在等待下一次请求指令的驻留连接
  • 开启keep-alive情况下数值为active-(reading+write)

  • 握手次数-连接数=丢失请求数

nginx别名

通过server标签中的server_name定义,以空格分隔即可。 例如:

    server {
        listen       80;
        server_name  www.why.cn www.why5.cn;
        location / {
            root   html/why;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

301重定向

    server {
        listen       80;
        server_name  www.why6.cn;
        rewrite ^/(.*) http://www.why.cn/$1 permanent;
#   格式rewrite 正则表达式  替换目标 flag
#   /前代表域名,/后为所有请求的url $1为所有请求的url permanent301跳转
    }

一般情况下可以用于IP地址访问 url重定向到我们的域名上。 或者网站使用新的域名。

Nginx 301重定向域名http://www.cnblogs.com/benio/archive/2010/08/16/1800584.html

一般默认情况下,如果不设置的话,我们访问ip地址时url会为IP地址,默认为第一个server的空间。

解决恶意域名绑定(别人域名跳转到你的IP地址)

server {
    listen       80;
    location /  {
        deny all;         
    }
}

这样别人就会返回一个403

nginx日志功能

日志配置

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';
访问日志格式为ip地址,用户,本地时间,请求,状态,大小,referer,用户浏览器
    server {
        listen       80;
        server_name  www.why.cn;
        access_log logs/why_access.log; 
    }
 error_log logs/error.log error;

日志文件

[root@why-2 ~]# cat /usr/local/nginx/logs/why_access.log 
192.168.0.103 - - [06/Nov/2016:12:20:55 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0" "-"
192.168.0.103 - - [06/Nov/2016:12:21:14 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0" "-"
192.168.0.103 - - [06/Nov/2016:12:21:14 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0" "-"
192.168.0.103 - - [06/Nov/2016:12:21:15 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0" "-"
192.168.0.103 - - [06/Nov/2016:12:21:15 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0" "-"

但是按着官方文档http://nginx.org/en/docs/http/ngx_http_log_module.html的例子操作没有效果,写不进来日志。

Nginx一般日志轮询用定时器mv的方法

例如

mv log $(date +%F -d -1day).log
nginx -s reload

然后就可以根据日志进行分析或者是处理,例如写crontab 00 00 * * * 执行脚本 > /dev/null 2>&1

日志分析工具

awstat,syslog,rsyslog

常见的HTTP返回状态码

200 OK,成功返回网页 301 Move Permanently,请求永久跳转到新的位置 403 Forbidden,禁止访问 404 Not Fount,服务器拒绝请求 500 Internal Server Error,服务器内部错误 502 Bad Gateway,后端服务没有按照http协议返回,一般都是负载据均衡,反向代理的错误 503 Service Unavailable,超载或者停机维护 504 Gateway timeout网关超时

nginx类似apache服务的include方式进行配置

可以在nginx/conf目录下创建类似apache的extra目录,当然别的目录名也ok

原配置

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {        url跳转
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

include方式配置

主配置文件

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    include extra/why1.conf;    #这个extra相对路径是相对nginx主配置文件而言的
}

extra/why1.conf配置

    server {
        listen       80;
        server_name  localhost;
        location / {        url跳转
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }