nginx 应用

了解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 应用)