Nginx的入门及精通

Nginx在Linux系统中的安装和启动

1)下载nginx-1.14.2.tar.gz的源代码文件:wget http://nginx.org/download/nginx-1.14.2.tar.gz

2)安装前的准备

Nginx的安装需要确定Linux安装相关的几个库,否则配置和编译会出现错误, 具体的检查安装过程为:
gcc编译器是否安装
  检查是否安装:yum list installed | grep gcc
  执行安装:yum install gcc -y
openssl库是否安装
  检查是否安装:yum list installed | grep openssl
  执行安装:yum install openssl openssl-devel -y
pcre库是否安装
  检查是否安装:yum list installed | grep pcre
  执行安装:yum install pcre pcre-devel -y
zlib库是否安装
  检查是否安装:yum list installed | grep zlib
  执行安装:yum install zlib zlib-devel -y
一次性安装上面的所有软件,执行如下命令
yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y

3)正式安装

解压下载下来的nginx文件,执行命令:tar -zxvf nginx-1.14.2.tar.gz
切换至解压后的nginx主目录,执行命令:cd nginx-1.14.2
在nginx主目录nginx-1.14.2下执行命令:./configure --prefix=/usr/local/nginx (其中--prefix是指定nginx安装路径)  注意:等号左右不要有空格
执行命令进行编译:make
执行命令进行安装:make install

4)检查是否安装成,切换到/usr/local/nginx目录下,查看内容:

 

5)启动命令,切换到Nginx安装目录的sbin目录下:

(1).普通启动执行:./nginx
(2).通过配置文件启动:./nginx  -c  /usr/local/nginx/conf/nginx.conf    或者    /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf(通过配置文件启动可以在一台服务器上启动多个Nginx)
(3).检查Nginx是否启动:ps -ef | grep nginx
(4).快速关闭Nginx:
    找出nginx的进程号:ps -ef | grep nginx 
    执行 : kill -TERM   pid(其中pid是主进程号的pid)    或者 ./nginx -s stop
(5).重启Nginx:./nginx -s reload
(6).Linux上查看nginx版本:/usr/local/nginx/sbin/nginx -V
    -v (小写的v)显示 nginx 的版本
    -V (大写的V)显示 nginx 的版本、编译器版本和配置参数


配置文件说明

worker_processes 1; #配置worker进程的连接个数,也就是工作进程数目,根据硬件调整,通常等于CPU数量或者2倍于CPU数量
#配置全局错误日志及类型,[debug | info | notice | warn | error | crit],默认是error
error_log  logs/error.log; #error_log  logs/error.log  notice;  #error_log  logs/error.log  info;
pid        logs/nginx.pid;  #配置进程pid文件
events {# 事件区块开始
    worker_connections 1024; #配置每个worker进程连接数上限,取值上线65535
    #nginx支持的总连接数就等于worker_processes * worker_connections
}# 事件区块结束
 
 

http {# HTTP区块开始, # 表示一个支持http请求的http服务器
    include mime.types; # Nginx支持的媒体类型库文件,可以在conf/mime.types查看支持哪些多媒体类型
    default_type application/octet-stream;  #默认文件类型 流类型,可以理解为支持任意类型
        #如果你的文件类型在mime.types没有,以默认流的方式返回;
    #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;#配置access.log日志及存放路径,并使用上面定义的main日志格式
        #如果把这个打开,需要把上面的日志格式打开,你每访问一次http后就会以上面的格式记录一条日志  (一般不管)
    sendfile on; # 开启高效传输模式
    tcp_nopush     on;  #防止网络阻塞,上线时通常打开
    keepalive_timeout 65; # 长连接超时时间,单位是秒
    gzip  on;  #开启gzip压缩输出  无论我么是请求还是访问,都是以IO流的方式进行传递的,响应数据的时候也是以IO流的方式传递的;
               #打开这个可以减少流的大小,增加访问速度(上线一般打开)

    upstream www.myweb.com {       #   upstream是配置nginx与后端服务器负载均衡非常重要的一个模块
                server  127.0.0.1:9100 weight=3; #其中weight=1表示权重,访问比率约等于权重之比,权重越大访问机会越多
                server  127.0.0.1:9200 weight=1;
    }
    server { # 第一个Server区块开始,表示一个独立的虚拟主机站点
        listen 80; # 提供服务的端口,默认80
        server_name localhost; 
        # 提供服务的域名主机名(凡是域名为localhost的将有这个server块提供服务)
        charset koi8-r;  #配置字符集  系统默认UTF-8,所以这个不用打开
        access_log  logs/host.access.log  main;  #配置本虚拟主机的访问日志,只有访问这个server才可以进行日志输出
        location /myweb {
            proxy_pass http://www.myweb.com; #上面的“upstream”对应
        }
        location / { #配置静态资源拦截   "/"表示请求资源的根路径
            root html; #root是配置服务器的默认网站根目录位置,默认为nginx安装主目录下的html目录
            index index.html index.htm; # 默认的首页文件,多个用空格分开
                       #也就是访问“/”时它会到“html”目录下找 “index.html”或者“index.htm”文件
        }
        #error_page 500 502 503 504 /50x.html; # 配置50x错误页面,出现对应的http状态码时,使用50x.html回应客户
               #error_page  404              /404.html;  #配置404页面
               location = /50x.html {   #精确匹配
            50x.html
            root html; # 指定对应的站点目录为html
        }
    }
}
 

 配置文件中location的语法

 

Location 配置演示
(1).=精确匹配:location = / { #规则 }    
    则匹配到 `http://www.example.com/` 这种请求。
(2).~大小写敏感:location ~ /Example/ { #规则 }   
    请求示例:
        http://www.example.com/Example/ [成功]
        http://www.example.com/example/ [失败]
(3).~*大小写忽略:location ~* /Example/ { #规则 } :
    则会忽略 uri 部分的大小写
        http://www.example.com/Example/ [成功]
        http://www.example.com/example/ [成功]
(4).^~只匹配以 uri 开头:location ^~ /img/ { #规则 } 
    以 /img/ 开头的请求,都会匹配上
        http://www.example.com/img/a.jpg [成功]
        http://www.example.com/img/b.mp4 [成功]
(5).@nginx内部跳转location /img/ { error_page 404 @img_err; } location @img_err { # 规则 } 
    以 /img/ 开头的请求,如果链接的状态为 404。则会匹配到 @img_err 这条规则上。
location语法中的proxy_pass带不带斜杠的问题:
(1).对于不带斜杠的URI方式,nginx将会保留location中路径部分,比如:
    location /api1/ {
       proxy_pass http://localhost:8080;
    }
    在访问http://localhost/api1/xxx时,会代理到http://localhost:8080/api1/xxx
(2).对于带斜杠的URI方式
    location /api2/ {
       proxy_pass http://localhost:8080/;
    }
    当访问http://localhost/api2/xxx时,http://localhost/api2/被替换成了http://localhost:8080/,然后再加上剩下的xxx,于是变成了http://localhost:8080/xxx。
    location /api5/ {
       proxy_pass http://localhost:8080/haha;
    }
    当访问http://localhost/api5/xxx时,http://localhost/api5/被替换成了http://localhost:8080/haha,请注意这里haha后面没有/,然后再加上剩下的xxx,即http://localhost:8080/haha+xxx=http://localhost:8080/hahaxxx;

 

Nginx限制IP/浏览器访问和精确匹配/set设置变量的示例:
location  /admin.html {#nginx 没有if else,故可以多设置几个if
   if ( $remote_addr !~* "192.168.1.*|x.x.x.x") {
       return 403;
   }
   if ( $remote_addr ~* "192.168.1.*|1x.x.x.x") {
       root  /xx/xxx/xx/;
   }
   if ($remote_addr = 192.168.9.115) {# 如果访问的ip地址为192.168.9.115,则返回403
       return 403;
   }
   if ($http_user_agent ~ Chrome) {# 不允许谷歌浏览器访问 如果是谷歌浏览器返回500
       return 500;
   }
   if ($http_user_agent ~ (125LA|WinHttpRequest|360Spider)) {
       return 444;
   }
   if ($http_referer ~* "filter=author&orderby=dateline") {
       return 444;
   }
   if ($host = 'bbs.gitlib.com') {
       rewrite ^/$ http://bbs1.gitlib.com permanent;
   }
}
location / { #set设置变量的值
   if ( $host ~* (.*)\.yzz\.cn) {
       set $domain $1;
   }
   root /www/website/www/gitlib/$domain/;
   # set语法 :set variable value;
}
示例:
server {
   listen       80;
   server_name  localhost;
   location /api1/ {
           proxy_pass http://localhost:8080;
        }
   # http://localhost/api1/xxx -> http://localhost:8080/api1/xxx
   location /api2/ {
           proxy_pass http://localhost:8080/;
        }
   # http://localhost/api2/xxx -> http://localhost:8080/xxx
   location /api3 {
           proxy_pass http://localhost:8080;
        }
   # http://localhost/api3/xxx -> http://localhost:8080/api3/xxx
   location /api4 {
           proxy_pass http://localhost:8080/;
        }
   # http://localhost/api4/xxx -> http://localhost:8080//xxx,请注意这里的双斜线,好好分析一下。
   location /api5/ {
           proxy_pass http://localhost:8080/haha;
        }
   # http://localhost/api5/xxx -> http://localhost:8080/hahaxxx,请注意这里的haha和xxx之间没有斜杠,分析一下原因。
   location /api6/ {
           proxy_pass http://localhost:8080/haha/;
        }
   # http://localhost/api6/xxx -> http://localhost:8080/haha/xxx
   location /api7 {
           proxy_pass http://localhost:8080/haha;
        }
   # http://localhost/api7/xxx -> http://localhost:8080/haha/xxx
   location /api8 {
           proxy_pass http://localhost:8080/haha/;
        }
  # http://localhost/api8/xxx -> http://localhost:8080/haha//xxx,请注意这里的双斜杠。
}
 

用户的请求来到Nginx,Nginx可以从请求中获取到的变量

$host: 请求的主机头         举例:$proxy_set_header Host $host;
$remote_addr: 客户端IP地址
$remote_port: 客户端端口号
$remote_user: 已经经过Auth Basic Module验证的用户名
$http_referer: 请求引用地址
$http_user_agent: 客户端代理信息(UA)
$http_x_forwarded_for: 相当于网络访问路径
$body_bytes_sent: 页面传送的字节数
$time_local: 服务器时间
$request: 客户端请求
$request_uri: 请求的URI,带参数, 不包含主机名
$request_filename: 请求的文件路径
$request_method: 请求的方法,如GET、POST
$args: 客户端请求中的参数
$query_string: 等同于$args, 客户端请求的参数
$nginx_version: 当前nginx版本
$status: 服务器响应状态码
$server_addr: 服务器地址
$server_port: 请求到达的服务器端口号
$server_protocol: 请求的协议版本
$content_type: HTTP请求信息里的Content-Type字段
$content_length: HTTP请求信息里的Content-Length字段
$uri: 请求中的当前URI(不带请求参数,参数位于$args)
$document_root: 当前请求在root指令中指定的值
$document_uri: 与$uri相同
Nginx代理给网关的时候,会丢失请求的host信息的案例:
http {
   include       mime.types;
   default_type  application/octet-stream;
   client_max_body_size 1024m;
   sendfile        on;
   keepalive_timeout  65;
   upstream gulimall{
       server 192.168.56.1:88  #网关的地址
   }
   server {
       listen       80; #访问时不带端口默认访问 80
       server_name  gulimall.com;  
       location / {  # /  所有访问gulimall.com的都交给我
           proxy_set_header Host $host     #Nginx代理给网关的时候,会丢失请求的host信息,所以得带上
           #不仅会丢失host信息,还会丢失其他的信息:  见官方网站
           proxy_pass http://gulimall;   
        }
   }                                                            
}

Nginx对文件上传大小限制

http {
    include       mime.types;
    default_type  application/octet-stream;
    client_max_body_size 1024m;  #Nginx对文件大小的限制
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    .......
}

Nginx的几种负载均衡策略(轮询,权重,ip_hash,最小连接,fair等)

默认轮询:这里的轮询并不是每个请求轮流分配到不同的后端服务器,与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。如果后端服务器down掉,将自动剔除;
 
http {
    upstream backserver {       #   upstream是配置nginx与后端服务器负载均衡非常重要的一个模块
                server  127.0.0.1:9100 weight=3; #其中weight=1表示权重,权重越大访问机会越多
                server  127.0.0.1:9200 weight=1;
    }
    upstream backserver {
        #每个请求按访问ip的hash值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决会话Session丢失的问题
        #可能导致大量的求情访问一个服务器,致使服务器压力过大
        ip_hash;
        server 127.0.0.1:8080;
        server 127.0.0.1:9090;
    }
    upstream backserver {
        least_conn;#web请求会被转发到连接数最少的服务器上
        server 127.0.0.1:8080;
        server 127.0.0.1:9090;
    }
    upstream backserver {
        server 127.0.0.1:8080;
        server 127.0.0.1:9090;
        fair;按后端服务器的响应时间来分配请求,响应时间短的优先分配。
    }
    upstream backserver {
        server 127.0.0.1:9100;
        #其它所有的非backup机器down的时候,才请求backup机器
        server 127.0.0.1:9200 backup;
    }
    upstream backserver { 
        server 127.0.0.1:9100;
        #down表示当前的server是down状态,不参与负载均衡
        server 127.0.0.1:9200 down; 
    } 
    server { # 第一个Server区块开始,表示一个独立的虚拟主机站点
        listen 80; # 提供服务的端口,默认80
        server_name localhost; # 提供服务的域名主机名
        charset koi8-r;  #配置字符集  系统默认UTF-8,所以这个不用打开
        access_log  logs/host.access.log  main;  #配置本虚拟主机的访问日志,只有访问这个server才可以进行日志输出
        location /myweb {
            proxy_pass http://backserver; #上面的“upstream”对应
        }
        location / { #配置静态资源拦截   "/"表示请求资源的根路径
            root html; #root是配置服务器的默认网站根目录位置,默认为nginx安装主目录下的html目录
            index index.html index.htm; # 默认的首页文件,多个用空格分开
            #也就是访问“/”时它会到“html”目录下找 “index.html”或者“index.htm”文件
        }
        #error_page 500 502 503 504 /50x.html; # 配置50x错误页面,出现对应的http状态码时,使用50x.html回应客户
        #error_page  404              /404.html;  #配置404页面
        location = /50x.html {   #精确匹配
            50x.html
            root html; # 指定对应的站点目录为html
        }
    }
}

Nginx中虚拟主机的理解(基于端口的虚拟主机--了解即可,基于域名的虚拟主机--重点掌握)

1.虚拟主机,就是把一台物理服务器划分成多个“虚拟”的服务器,这样我们的一台装有Nginx的物理服务器就可以当做多个服务器来使用,从而可以配置多个网站。【一台计算机(一个ip地址)配置多个域名】
2.Nginx提供虚拟主机的功能,就是为了让我们不需要安装多个Nginx,就可以运行多个域名不同的网站。
3.Nginx下,一个server标签就是一个虚拟主机。nginx的虚拟主机就是通过nginx.conf中server节点指定的,想要设置多个虚拟主机,配置多个server节点即可;

案例:比如一个公司有多个二级域名,没有必要为每个二级域名都提供一台Nginx服务器,就可以使用虚拟主机技术,在一台nginx服务器上,模拟多个虚拟服务器。

执行流程举例:浏览器输入“www.beijing.myweb.com”就会被本地的DNS映射到Nginx服务器,nginx接收一个请求后,首先由listen和server_name指令匹配server模块,再匹配server模块里的location,location就是实际地址;(server_name配置的就是域名地址;)

#Nginx中的配置

#配置worker进程运行用户 nobody也是一个linux用户,一般用于启动程序,没有密码
worker_processes  1;
error_log  logs/error.log;
pid        logs/nginx.pid;  #配置进程pid文件
###====================================================
events {
    worker_connections  1024;  #配置每个worker进程连接数上限,取值上线65535
}
###===================================================
    http {
        include       mime.types;  #引入支持的文件类型
        default_type  application/octet-stream;   #如果你的文件类型在mime.types没有,以默认流的方式返回;
        upstream beijing.myweb.com {
                    server  127.0.0.1:8001;                 
        }
        upstream nanjing.myweb.com {
                    server  127.0.0.1:8002;                 
        }
        upstream tianjin.myweb.com {
                    server  127.0.0.1:8003;                 
        }
        sendfile        on;  #开启高效文件传输模式
        keepalive_timeout  65;  #长连接超时时间,单位是秒
        ###----------------------------------------------
        server {
            listen       80;
            server_name  beijing.myweb.com;
                location / {
                    proxy_pass http://www.beijing.myweb.com;
            }
        }
        server {
            listen       80;
            server_name  nanjing.myweb.com;  
            #当访问这个名字的域名和端口后将进入到这个server里面来
            location / {
                proxy_pass http://www.nanjing.myweb.com;
            }
        }
        server {
            listen       80;
            server_name  tianjin.myweb.com;
            location / {
            proxy_pass http://www.tianjin.myweb.com;
        }
    }
本地DNS映射:需要修改一下本地的hosts文件
在hosts文件配置:
    192.168.208.128    www.tianjin.myweb.com
    192.168.208.128    www.nanjing.myweb.com
    192.168.208.128    www.beijing.myweb.com 

静态代理案例

在nginx.conf的location中配置静态资源所在目录实现
    例如:当访问静态资源,则从linux服务器/opt/static目录下获取
        location ~ .*/(css|js|img|images) {    .*:表示任意字符;
                    root   /opt/static;
        }
          
我们将静态资源放入 /opt/static 目录下,然后用户访问时由nginx返回这些静态资源;

静态代理的案例 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值