nginx安装与应用

一.nginx的安装与启动:

1.安装依赖库。nginx的一些模块需要依赖其他第三方库,通常有pcre库(perl compatible regular expression,perl兼容正则表达式,支持rewrite模块)、zlib库(支持gzip模块)和openssl库(支持ssl模块)

yum install -y pcre pcre-devel zlib zlib-devel open openssl-devel

2.安装patch

如果想主动检测后端服务器状态的话,需要用yaoweibin开发的nginx_upstream_check_module。从 https://github.com/yaoweibin/nginx_upstream_check_module 下载zip包。注意,是下载

2.生成Makefile文件。将下载好的nginx-xxx.tar.gz上传到centos7中,解压,进到nginx-xxx目录中,运行./configure,结束后会打印 nginx path prefix 路径等信息

在执行./configure命令时可以添加一些常用的选项,如

--prefix=<path> 指定nginx安装目录,默认为/usr/local/nginx目录

--with-http_ssl_module 声明启用HTTP的ssl模块,这样nginx服务器就可以支持HTTPS请求了

--with-http_stub_status_module 声明启用Server Status页面,默认不启用。启用后,只需在location块中配置一个uri(如下文中的/nginx_status),访问此uri页面就可以看到一些服务器状态信息,如下

Active connections: 1

server accepts handled requests

              10          10          120

Reading: 0 Writing: 1 Waiting: 0 

--add-module=<path> 指定第三方模块的路径,多个第三方模块的话就用多个--add-module指定各自的路径。如--add-module=/home/koushengrui/app/lua-nginx-module-0.10.13 --add-module=/home/koushengrui/app/ngx_devel_kit-0.3.1rc1 --add-module=/home/koushengrui/app/nginx_upstream_check_module-master,指定编译时添加nginx-lua-module、ngx_devel_kit和nginx_upstream_check_module(下文中的 check interval=3000 rise=2 fall=5 timeout=1000 type=tcp; 就是依赖此模块而配置的)。

3.编译与安装。# make && make install。(因为涉及往/usr/local目录中写入,所以必须是root用户或者具有root权限的用户)

4.启动与关闭。切换到/usr/local/nginx目录,此目录下有conf目录、html目录、logs目录、sbin目录,其中conf目录有默认的配置文件,logs目录有日志文件(包括访问日志文件和错误日志文件),sbin目录有可执行命令

用默认配置文件启动nginx:nginx

指定配置文件启动nginx:nginx -c path/nginx.conf,其中path是绝对路径

nginx启动后,就会在logs目录中(路径可以在nginx.conf文件中配置,默认是logs目录)生成一个nginx.pid的文件,记录master process的pid。

启动后,就可以用nginx -s signal来控制nginx了,其中signal的值可以是stop、quit、reload:

stop,fast shutdown  快速关闭

quit,graceful shutdown  平滑关闭。关闭nginx后,logs目录中的nginx.pid文件会消失,下次启动后再次生成

reload,reloading the configuration file  根据之前启动时的配置文件平滑重启

如果想在重启的时候另外指定配置文件呢???

二.配置文件的location块解释

location的语法结构为:location [=|~|~*|^~] uri

其中uri是待匹配的字符串,分为两种,标准uri和正则uri。[ ]中的是可选项。

nginx首先在server的多个location块中搜索是否有标准uri和请求字符串匹配,如果有多个可以匹配,就记录匹配度最高的一个。然后,再按顺序搜索是否有正则uri和请求字符串匹配,如果有,则结束搜索,用此location块处理此请求。如果没有,则使用刚才记录的匹配度最高的location块处理请求。如果刚才标准uri匹配时所有的location块都不匹配,则此时会访问html目录下的index.html文件。

location = uri {

    xxx

}                     =后面跟标准uri,要求请求字符串与uri严格匹配。如果匹配成功,就用当前location块处理请求,而不会继续搜索了。

location uri {

    xxx            

}                    普通匹配,标准uri

location ~ uri {

   xxx

}                     ~后面跟正则uri,匹配时区分大小写

location ~* uri {

   xxx

}                      ~*后面跟正则uri,匹配时不区分大小写

location ^~ uri {

   xxx

}                      ^~后面跟标准uri,匹配以uri开头的请求。如果匹配的话,直接用此location块处理请求,不再去搜索正则uri

示例:

修改默认的nginx.conf配置文件server块如下:

server{
        listen        80;
        server_name   aliecs1;

        location /index {
                root   first;
                index  index.html;
        }
        #严格匹配
        location = /index {
                root  /second;
                index index.html;
        }

        location ^~ /index1 {
                root  third;
                index index.html;
        }
}

root可以指定相对路径,也可以是绝对路径。相对路径是相对nginx的根路径(/usr/local/nginx/),写法是前面不加/。绝对路径以/开始。请求地址被某个location匹配并处理后,最终访问路径是root指定的路径+请求字符串去掉ip和端口的剩余部分。

如果请求地址是192.168.153.128/index.html,则会用location /index {}处理,最终访问/usr/local/nginx/first/index.html。

如果请求地址是192.168.153.128/index1.html,则会用location ^~ /index1 {}处理,最终访问/usr/local/nginx/third/index1.html。

如果请求地址是192.168.153.128/index2.html,还是会用location /index {}处理,最终访问/usr/local/nginx/first/index2.html。

如果请求地址是192.168.153.128/index,则会用location = /index {}处理,最终访问/second/index。

三.rewrite功能,字面意思是重写,实际上就是重定向redirect

主要有if指令、break指令、return指令、rewrite指令、set指令:

if指令:可以在server块、location块中配置,使用if做条件判断时需要注意两点:if与后面括号一定要有空格;判断等于是用=,而不再是==;表达式中的字符串不用加引号。示例:

 server {
        listen       80;
        server_name  192.168.153.136;
        location / {
                if ($http_user_agent ~ Trident) {
                        root /home/koushengrui/html;
                }
        }
}

以上配置表示如果发起请求的浏览器是IE或Edge浏览器的话,则首页会是/home/koushengrui/html下的index.html文件,否则是/usr/local/nginx/html下的index.html文件。

注意,没有else指令,没有else指令,在if块中不能使用index指令。

return指令:用于直接向客户端返回响应状态码及重定向地址。return指令可以在server块、location块、if块中使用,用法为:return code url。配置示例:

server {
    listen       80;
    server_name  192.168.153.136;

    location / {
        return 301 http://192.168.153.136:10000/image/example.png;
        root /home/koushengrui/html;
        index welcome.htm;
    }
}

如果请求地址是http://192.168.153.136/*** 的话,则此请求会被重定向至http://192.168.153.136:10000/image/example.png。

301是永久移动,302是临时移动。

rewrite指令:通过正则表达式的使用来改变URI。这里需要大量的正则表达式的知识,现在了解的还不透彻。包括域名跳转、防盗链的功能都是用rewrite指令来做的。

四.反向代理与负载均衡

什么是反向代理?

负载均衡

内置策略有3种,轮询、加权轮询、IP hash:

1.轮询,顾名思义,就是服务器将每个前端请求按顺序(时间顺序或者排列次序)逐一分配到不同的后端节点上,对于出现问题的后端节点自动去除;

2.加权轮询,在基本的轮询策略基础上考虑各后端节点接受请求的权重,指定各后端节点被轮询到的几率,主要用于后端节点性能不均的情况下;

3.IP hash,是将前端的访问IP进行hash操作,然后根据hash结果将请求分配给不同的后端节点。这样会使得每个前端访问IP会固定访问一个后端节点,好处是前端用户的session只在一个后端节点上,不必考虑一个session存在多台节点上而出现的session共享问题。

扩展策略有2种,url hash、fair:

4.url hash,将前端请求的url地址进行hash操作,根据hash结果将请求分配到不同的后端节点上;

5.fair,将前端请求转发到负载最小的后端节点上。Nginx通过后端节点对请求的响应时间来判断负载情况,响应时间最短的节点负载就相对较轻,Nginx就会将前端请求转发到此后端节点上。

五.gzib模块

gzib on;#默认情况下是off,要想启动gzip功能,得设置为on

gzip_min_length 1024;#当文件的长度大于1024字节时才压缩,否则不压缩,避免越压越大

gzip_buffers 32 4k;#或者gzip_buffers 16 8k;设置gzip压缩文件使用缓存空间的大小,第一个数是nginx服务器向系统申请缓存空间的个数,第二个数是每个缓存空间的大小

gzip_comp_level 6;#设置gzip的压缩程度,级别从1到9,1表示压缩程度最低,效率最高,9表示压缩程度最高,效率最低

gzip_types text/plain application/javascript text/css text/xml;#根据相应文件的MIME类型选择性地开启gzip压缩功能,text/plain对应txt文件,application/javascript(或者text/javascript)对应js文件,text/css对应css文件,text/xml对应xml文件。这其中没有写html文件对应的MIME类型,是因为只要开启了gzip功能,html文件、htm文件是默认压缩的,写的话会报错。通常来说,只建议html/htm、css、js、xml文件进行压缩,而图片、音视频文件不建议压缩,因为压缩效果很小。

六.expires缓存优化

一般对图片进行expires配置

location ~* ^.+.(png|jpg|jpeg|gif|ico|bmp|psd)$ {yyyy-MM-dd HH:mm:ss
       expires 1d;#y表示年,M表示月,d表示天,h表示小时,m表示分钟,s表示秒
}

七.限速

location /download {
       if ($http_user_agent ~ Chrome){
                limit_rate_after 100M;
       }
       limit_rate         200k;
       root               /home/koushengrui;     
}

limit_rate_after表示多少大小之后才开始限速,上例从100M开始限速,也就是说一个文件下载时前100M是不限速的,100M之后才限速

limit_rate表示限速多少,上例中限速200k/s

八.跨域

需添加如下配置:(参考链接 https://enable-cors.org/server_nginx.html,实测有效)

#
# Wide-open CORS config for nginx
#
location / {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
        add_header 'Access-Control-Expose-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
}

zeb系统生产上某一台nginx服务器(有很多台)配置如下:

user wls81 wls;
worker_processes  5;

error_log  /wls/apache/applogs/error.log;
pid        /wls/apache/applogs/nginx.pid;

events {
    use epoll;
    worker_connections  200000;
}

http {
#   include       mime.types;
    default_type  application/octet-stream;
    server_tokens off; # 不返回nginx版本号

    sendfile        on;
    keepalive_timeout  65;

    log_format access '$remote_addr - $remote_user [$time_local] "$request"' '$status $body_bytes_sent "$http_referer"' '"$http_user_agent" $http_x_forwarded_for';

    upstream ng_zeb {
        ip_hash;
        server 192.168.56.100:8080;
        server 192.168.56.101:8080;
server 192.168.56.102:8080; keepalive 32; check interval=3000 rise=2 fall=5 timeout=1000 type=tcp; } server { listen 0.0.0.0:31023; listen 0.0.0.0:31024 ssl; ssl_certificate /wls/apache/ssl/xxx.crt; ssl_certificate_key /wls/apache/ssl/xxx.key; access_log /wls/apache/applogs/host.access.log access; rewrite ^/f5monweb(.*) /monitor_ng/$1;

location / { proxy_set_header Host $http_host; proxy_set_header Origin $http_origin; proxy_pass http://ng_zeb; index index.html; } location /monitor_ng { root /wls/apache; index f5check.htm f5check.jsp; } location /nginx_status { stub_status on; access_log off; allow 192.168.56.1; deny all; } } } 
原文地址:https://www.cnblogs.com/koushr/p/5873380.html