美文网首页
nginx 应用

nginx 应用

作者: wangw2030 | 来源:发表于2018-09-02 21:14 被阅读0次

    了解nginx

    参考文档:http://www.nginx.cn/doc/

    nginx是一款高性能的HTTP和反向代理服务器软件,也是一个IMAP/POP3/SMTP代理服务器,可以运行在Unix, GNU/Linux,BSD,MacOS x,以及Windows等操作系统中。

    Nginx与Apache的异同

    相同点:

    都是一个HTTP服务器软件。支持正、反向代理,虚拟主机,url重写,压缩传输,SSL加密传输等。

    不同点:

    Apache处理速度很慢,且占用很多内存资源,而Nginx却恰恰相反。

    nginx安装

    下载地址:http://nginx.org/en/download.html

    centos6 nginx 安装 

    https://www.cnblogs.com/yaoximing/p/6068622.html

    Mac nginx 安装

    参考地址:https://www.cnblogs.com/meng1314-shuai/p/8335140.html

    步骤:

    1、查询要安装的软件是否存在

    brew search nginx  

    2、查看nginx是否安装

    brew info nginx

    显示本地已安装nginx,版本1.15.3,未安装执行第三步。

    3、安装nginx

    brew install nginx

    4、查看nginx安装目录(是否如info所说)

    open /usr/local/etc/nginx/

    open /usr/local/Cellar/nginx     //其实这个才是nginx被安装到的目录

    5、启动nginx,终端输入如下命令:

    nginx

    没有报错即为启动成功。

    6、打开浏览器访问localhost:8080, 如出现以下界面,说明安装成功

    Nginx命令参数

    nginx -t:测试配置文件是否正确

    nginx -s reload, 作用:加载最新配置

    nginx -s stop,作用:立即停止 

    nginx -s quit,作用:优雅停止 (当前存在访问,直到访问结束才停止)

    nginx -s reopen,作用:重新打开日志

    nginx 配置

    在nginx.conf的注释符号位#

    nginx文件结构:


    1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。

    2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

    3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

    4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。

    5、location块:配置请求的路由,以及各种页面的处理情况。

    示例配置文件

    ########### 每个指令必须有分号结束。#################

    #user administrator administrators;  #配置使用用户或者组,默认为nobody nobody。

    worker_processes 2;  #允许生成的进程数,默认为1,CPU数量*核数,通常等于CPU数量或者2倍于CPU

    #pid /nginx/pid/nginx.pid;  #指定nginx进程运行文件存放地址

    error_log log/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg

    events {

        accept_mutex on;  #设置网路连接序列化,防止惊群现象发生,默认为on

        multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off

        #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport

        worker_connections  1024;    #最大连接数,默认为512

    }

    http {

        include      mime.types;  #文件扩展名与文件类型映射表

        default_type  application/octet-stream; #默认文件类型,默认为text/plain

        #access_log off; #取消服务日志   

        log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式

        access_log log/access.log myFormat;  #combined为日志格式的默认值

        sendfile on;  #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。

        sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。

        keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。

        #gzip on; #开启gzip压缩

       #charset gb2321; #设置字符编码

        upstream mysvr { 

          server 127.0.0.1:7878;

          server 192.168.10.121:3333 backup;  #热备

        }

        error_page 404 https://www.baidu.com; #错误页

        server {

            keepalive_requests 120; #单连接请求上限次数。

            listen      4545;  #监听端口

            server_name  127.0.0.1;  #监听地址     

            location  ~*^.+$ {      #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。

              #root path;  #根目录

              #index vv.txt;  #设置默认页

              proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表

              deny 127.0.0.1;  #拒绝的ip

              allow 172.18.5.54; #允许的ip         

            }

        }

    }

    日志格式设置。

    $remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;

    $remote_user:用来记录客户端用户名称;

    $time_local: 用来记录访问时间与时区;

    $request: 用来记录请求的url与http协议;

    $status: 用来记录请求状态;成功是200,

    $body_bytes_sent :记录发送给客户端文件主体内容大小;

    $http_referer:用来记录从那个页面链接访问过来的;

    $http_user_agent:记录客户浏览器的相关信息;

    nginx之location配置

    语法规则:location [=|~|~*|^~] /uri/ { … }

    = 开头表示精确匹配 

    ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。

    ~开头表示区分大小写的正则匹配。

    ~*开头表示不区分大小写的正则匹配。

    !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则。

    / 通用匹配,任何请求都会匹配到。

    多个location配置的情况下匹配顺序为:

    首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

    location = / {  

       #规则A  

    }  

    location = /login {  

       #规则B  

    }  

    location ^~ /static/ {  

       #规则C  

    }  

    location ~ \.(gif|jpg|png|js|css)$ {  

       #规则D  

    }  

    location ~* \.png$ {  

       #规则E  

    }  

    location !~ \.xhtml$ {  

       #规则F  

    }  

    location !~* \.xhtml$ {  

       #规则G  

    }  

    location / {  

       #规则H  

    }  

    那么产生的效果如下:

    访问根目录/, 比如http://localhost/ 将匹配规则A

    访问 http://localhost/login 将匹配规则B,

    http://localhost/register 则匹配规则H

    访问 http://localhost/static/a.html 将匹配规则C

    访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而 http://localhost/static/c.png 则优先匹配到 规则C

    访问 http://localhost/a.PNG 则匹配规则E, 而不会匹配规则D,因为规则E不区分大小写。

    访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。

    访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。

    location常见配置指令,alias、root、proxy_pass

    1、【alias】——别名配置,用于访问文件系统,在匹配到location配置的URL路径后,指向【alias】配置的路径。如:

    location /test/

    {

        alias/first/second/img/;

    }

    即:请求/test/1.jpg(省略了协议与域名),将会返回文件/first/second/img/1.jpg。

    2、【root】——根路径配置,用于访问文件系统,在匹配到location配置的URL路径后,指向【root】配置的路径,并把location配置路径附加到其后。如:

    location /test/

    {

        root /first/second/img/;

    }

    即:请求/test/1.jpg(省略了协议与域名),将会返回文件/first/second/img/test/1.jpg,相较于alias,使用root会把/test/附加到根目录之后。

    3、【proxy_pass】——反向代理配置,用于代理请求,适用于前后端负载分离或多台机器、服务器负载分离的场景,在匹配到location配置的URL路径后,转发请求到【proxy_pass】配置的URL,是否会附加location配置路径与【proxy_pass】配置的路径后是否有"/"有关,有"/"则不附加,如:

    location /test/

    {

        proxy_pass http://127.0.0.1:8080/;

    }

    即:请求/test/1.jpg(省略了协议与域名),将会被nginx转发请求到http://127.0.0.1:8080/1.jpg(未附加/test/路径)。

    location /test/

    {

        proxy_pass http://127.0.0.1:8080;

    }

    即:请求/test/1.jpg(省略了协议与域名),将会被nginx转发请求到http://127.0.0.1:8080/test/1.jpg(附加/test/路径)。

    location/test/

    {

        proxy_pass http://127.0.0.1:8080/img;

    }

    即:请求/test/1.jpg(省略了协议与域名),将会被nginx转发请求到http://127.0.0.1:8080/img1.jpg(未附加/test/路径,但附加了/test/之后的路径)。

    解决nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed错误 

    解决方法:

    使用nginx -c的参数指定nginx.conf文件的位置

    相关文章

      网友评论

          本文标题:nginx 应用

          本文链接:https://www.haomeiwen.com/subject/vjkrwftx.html