Nginx 安装

vim nginx-install.sh

#!/bin/bash


nginx_file="nginx-1.16.1"

nginx_tar_gz=$nginx_file".tar.gz"



echo "开始执行" 

tar -zxf $nginx_tar_gz

mv $nginx_file /usr/local/$nginx_file


cd /usr/local/$nginx_file

pwd


yum -y install gcc-c++ && yum -y install pcre pcre-devel && yum -y install zlib zlib-devel && yum -y install openssl openssl-devel

mkdir -p /var/temp/nginx

./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/usr/local/nginx/log/error.log \
--http-log-path=/usr/local/nginx/log/access.log \
--with-http_gzip_static_module \
--with-http_auth_request_module \
--with-http_ssl_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi

make && make install

echo "安装完毕"


包含nginx源码 及安装脚本
链接:https://pan.baidu.com/s/1Hdb4e666BS4e-iq5SeFdOw
提取码:96fv

域名访问配置


    upstream yapi{
        server 127.0.0.1:40001;
    }
    server {
    listen 80;
    server_name  yapi.inno-server.com;
    access_log     /var/log/nginx/yapi.example.com-access.log;
    error_log     /var/log/nginx/yapi.example.com-error.log;
    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://yapi;
    }
    }


    server {
    listen 80;
    server_name  demo.inno-server.com;
    access_log     /var/log/nginx/demo.example.com-access.log;
    error_log     /var/log/nginx/demo.example.com-error.log;
    
    location = /index.html {
            add_header Cache-Control "no-cache, no-store";
            root   /.../;
    }

    location /file/ {
         root   /usr/local/wa-direct-query;
    }

    location /api/ {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
            proxy_pass http://127.0.0.1:30012;
            proxy_redirect off;
    }
    }

location <-> proxypass 配置 (匹配问题)

原文Link

  1. proxy_pass后面 存在 / ; 则nginx不会把location中匹配的路径部分代理走;
    result -> proxy_pass +request
  2. proxy_pass后面不存在 / ; 则nginx会将location进行append
    result -> proxy_pass/location+request

在nginx中配置proxy_pass时,如果在,相当于是绝对根路径,;如果没有/,则会把匹配的路径部分给代理走。

# 第一种
location  /abc
    {
        proxy_pass http://106.12.74.123:83/;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
 
# 结论:会被代理到http://106.12.74.123/index.html 这个url
 
 
 
# 第二种(相对于第一种,最后少一个 /)
location  /abc
    {
        proxy_pass http://106.12.74.123:83;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
 
# 结论:会被代理到http://106.12.74.123/abc/index.html 这个url
 
 
 
第三种:
location  /abc
    {
        proxy_pass http://106.12.74.123:83/linux/;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
 
# 结论:会被代理到http://106.12.74.123/linux/index.html 这个url。
 
 
 
# 第四种(相对于第三种,最后少一个 / ):
location  /abc
    {
        proxy_pass http://106.12.74.123:83/linux;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
 
# 结论:会被代理到http://106.12.74.123/linuxindex.html 这个url

Nginx 模拟安全认证网关

 server {
        listen       80;
        server_name  localhost;


         location /wadsj/ {
             proxy_pass http://demo.inno-server.com/;
         }
 }

Nginx 配置中location root 的注意事项

在配置Nginx服务的时候,可以给不同的uri访问指向不同的位置,例如下面的配置:

server {
       listen       80;
       server_name  www.xx.com;

       location / {
          root   D:/www;      #定义默认根目录位置(windows系统)
          index index.php index.html index.htm;   #定义首页索引文件的名称
       }
 
       location /abc {
          root   D:/files/xx;      #定义其他请求的根目录位置(windows系统)
          index index.php index.html index.htm;   #定义首页索引文件的名称
       }
}

关于 location和root后面加/和不加没什么区别.默认加上就行
 这里的默认路径没有问题,而/abc这个路径要想正常访问,在“D:/files/xx”目录下还需要有一个abc目录,否则会抛出404异常

nginx的location、root、alias指令用法和区别

nginx指定文件路径有两种方式root和alias,指令的使用方法和作用域:
[root]
语法:root path
默认值:root html
配置段:http、server、location、if
[alias]
语法:alias path
配置段:location

root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。
root的处理结果是:root路径+location路径
alias的处理结果是:使用alias路径替换location路径
alias是一个目录别名的定义,root则是最上层目录的定义。
还有一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件的。。。而root则可有可无~~

root实例:

location ^~ /t/ {
     root /www/root/html/;
}
location ^~ /t/ {
     root /www/root/html/;
}

如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/t/a.html的文件。

alias实例:

location ^~ /t/ {
 alias /www/root/html/new_t/;
}
location ^~ /t/ {
 alias /www/root/html/new_t/;
}

如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/new_t/a.html的文件。注意这里是new_t,因为alias会把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。

注意:

  1. 使用alias时,目录名后面一定要加"/"。
  2. alias在使用正则匹配时,必须捕捉要匹配的内容并在指定的内容处使用。
  3. alias只能位于location块中。(root可以不放在location中)

https证书配置(腾讯云为例)

nginx 常见配置参数

关键字 描述
proxy_pass 代理

Nginx 常见用法

Nginx转发内网图片

假设原本图片地址:

http://xxx.xxx.xxx.xxx/static/v1/image/image_20191021/task/face.jpg

->

http://nginx:80/image_proxy?url=http://106.52.99.118/static/v1/image/image_20191021/task/face.jpg

nginx 转发图片

    location /image_proxy {
    if ($query_string ~*  ^(.*)url=(.*)$){
           set $imageUrl $2;
           proxy_pass $imageUrl;
      }
    }

conf详细说明明


conf配置说明原文:http://www.cnblogs.com/xiaogangqq123/archive/2011/03/02/1969006.html

#运行用户  
user www-data;      
#启动进程,通常设置成和cpu的数量相等  
worker_processes  1;  
  
#全局错误日志及PID文件  
error_log  /var/log/nginx/error.log;  
pid        /var/run/nginx.pid;  
  
#工作模式及连接数上限  
events {  
    use   epoll;             #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能  
    worker_connections  1024;#单个后台worker process进程的最大并发链接数  
    # multi_accept on;   
}  
  
#设定http服务器,利用它的反向代理功能提供负载均衡支持  
http {  
     #设定mime类型,类型由mime.type文件定义  
    include       /etc/nginx/mime.types;  
    default_type  application/octet-stream;  
    #设定日志格式  
    access_log    /var/log/nginx/access.log;  
  
    #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,  
    #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.  
    sendfile        on;  
    #tcp_nopush     on;  
  
    #连接超时时间  
    #keepalive_timeout  0;  
    keepalive_timeout  65;  
    tcp_nodelay        on;  
      
    #开启gzip压缩  
    gzip  on;  
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";  
  
    #设定请求缓冲  
    client_header_buffer_size    1k;  
    large_client_header_buffers  4 4k;  
  
    include /etc/nginx/conf.d/*.conf;  
    include /etc/nginx/sites-enabled/*;  
  
    #设定负载均衡的服务器列表  
     upstream mysvr {  
    #weigth参数表示权值,权值越高被分配到的几率越大  
    #本机上的Squid开启3128端口  
    server 192.168.8.1:3128 weight=5;  
    server 192.168.8.2:80  weight=1;  
    server 192.168.8.3:80  weight=6;  
    }  
  
  
   server {  
    #侦听80端口  
        listen       80;  
        #定义使用www.xx.com访问  
        server_name  www.xx.com;  
  
        #设定本虚拟主机的访问日志  
        access_log  logs/www.xx.com.access.log  main;  
  
    #默认请求  
    location / {  
          root   /root;      #定义服务器的默认网站根目录位置  
          index index.php index.html index.htm;   #定义首页索引文件的名称  
  
          fastcgi_pass  www.xx.com;  
         fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;   
          include /etc/nginx/fastcgi_params;  
        }  
  
    # 定义错误提示页面  
    error_page   500 502 503 504 /50x.html;    
        location = /50x.html {  
        root   /root;  
    }  
  
    #静态文件,nginx自己处理  
    location ~ ^/(images|javascript|js|css|flash|media|static)/ {  
        root /var/www/virtual/htdocs;  
        #过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。  
        expires 30d;  
    }  
    #PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.  
    location ~ \.php$ {  
        root /root;  
        fastcgi_pass 127.0.0.1:9000;  
        fastcgi_index index.php;  
        fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name;  
        include fastcgi_params;  
    }  
    #设定查看Nginx状态的地址  
    location /NginxStatus {  
        stub_status            on;  
        access_log              on;  
        auth_basic              "NginxStatus";  
        auth_basic_user_file  conf/htpasswd; 
 
        deny all;  
    }  
       
     }  
}  

以上是一些基本的配置,使用Nginx最大的好处就是负载均衡

如果要使用负载均衡的话,可以修改配置http节点如下:

#设定http服务器,利用它的反向代理功能提供负载均衡支持  
http {  
     #设定mime类型,类型由mime.type文件定义  
    include       /etc/nginx/mime.types;  
    default_type  application/octet-stream;  
    #设定日志格式  
    access_log    /var/log/nginx/access.log;  
  
    #省略上文有的一些配置节点  
  
    #。。。。。。。。。。  
  
    #设定负载均衡的服务器列表  
     upstream mysvr {  
    #weigth参数表示权值,权值越高被分配到的几率越大  
    server 192.168.8.1x:3128 weight=5;#本机上的Squid开启3128端口  
    server 192.168.8.2x:80  weight=1;  
    server 192.168.8.3x:80  weight=6;  
    }  
  
   upstream mysvr2 {  
    #weigth参数表示权值,权值越高被分配到的几率越大  
  
    server 192.168.8.x:80  weight=1;  
    server 192.168.8.x:80  weight=6;  
    }  
  
   #第一个虚拟服务器  
   server {  
    #侦听192.168.8.x的80端口  
        listen       80;  
        server_name  192.168.8.x;  
  
      #对aspx后缀的进行负载均衡请求  
    location ~ .*\.aspx$ {  
  
         root   /root;      #定义服务器的默认网站根目录位置  
          index index.php index.html index.htm;   #定义首页索引文件的名称  
  
          proxy_pass  http://mysvr ;#请求转向mysvr 定义的服务器列表  
  
          #以下是一些反向代理的配置可删除.  
  
          proxy_redirect off;  
  
          #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP  
          proxy_set_header Host $host;  
          proxy_set_header X-Real-IP $remote_addr;  
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
          client_max_body_size 10m;    #允许客户端请求的最大单文件字节数  
          client_body_buffer_size 128k;  #缓冲区代理缓冲用户端请求的最大字节数,  
          proxy_connect_timeout 90;  #nginx跟后端服务器连接超时时间(代理连接超时)  
          proxy_send_timeout 90;        #后端服务器数据回传时间(代理发送超时)  
          proxy_read_timeout 90;         #连接成功后,后端服务器响应时间(代理接收超时)  
          proxy_buffer_size 4k;             #设置代理服务器(nginx)保存用户头信息的缓冲区大小  
          proxy_buffers 4 32k;               #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置  
          proxy_busy_buffers_size 64k;    #高负荷下缓冲大小(proxy_buffers*2)  
          proxy_temp_file_write_size 64k;  #设定缓存文件夹大小,大于这个值,将从upstream服务器传  
  
       }  
  
     }  
}  

##关于负载均衡

拓展:

1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例如:
upstream bakend {
server 192.168.159.10 weight=10;
server 192.168.159.11 weight=10;
}

3、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
例如:
upstream resinserver{
ip_hash;
server 192.168.159.10:8080;
server 192.168.159.11:8080;
}


4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream resinserver{
server server1;
server server2;
fair;
}


5、url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

upstream resinserver{
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}

tips:

upstream resinserver{#定义负载均衡设备的Ip及设备状态
ip_hash;
server 127.0.0.1:8000 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6801;
server 127.0.0.1:6802 backup;
}

在需要使用负载均衡的server中增加
proxy_pass http://resinserver/;


每个设备的状态设置为:
1.down 表示单前的server暂时不参与负载
2.weight 默认为1.weight越大,负载的权重就越大。
3.max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
4.fail_timeout:max_fails次失败后,暂停的时间。
5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

nginx支持同时设置多组的负载均衡,用来给不用的server来使用。

client_body_in_file_only 设置为On 可以讲client post过来的数据记录到文件中用来做debug
client_body_temp_path 设置记录文件的目录 可以设置最多3层目录
location 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡

##nginx配置ssl证书,微信小程序服务器

server {
    server_name 192.168.1.100; # 客户端直接用IP来访问
    # 这是默认的SSL端口,可以修改为其它端口,浏览器用https访问url时,默认就是用这个端口,
    # 如果下面listen修改成其它端口,那浏览器用https访问时,就要指定端口了。
    listen 443; 
    ssl on;
    #地址
    ssl_certificate /home/xiaobai/server_cert.crt;
    #使用无密码私钥
    ssl_certificate_key /usr/xiaobai/private.key;
}

详细 有针对性配置:http://www.cnblogs.com/ajianbeyourself/p/3898911.html

腾讯云Nginx证书配置

2. Nginx 证书部署

2.1 获取证书

Nginx文件夹内获得SSL证书文件 1_www.domain.com_bundle.crt 和私钥文件 2_www.domain.com.key,
1_www.domain.com_bundle.crt 文件包括两段证书代码 “-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”,
2_www.domain.com.key 文件包括一段私钥代码“-----BEGIN RSA PRIVATE KEY-----”和“-----END RSA PRIVATE KEY-----”。

2.2 证书安装

将域名 www.domain.com 的证书文件1_www.domain.com_bundle.crt 、私钥文件2_www.domain.com.key保存到同一个目录,例如/usr/local/nginx/conf目录下。
更新Nginx根目录下 conf/nginx.conf 文件如下:

server {
        listen 443;
        server_name www.domain.com; #填写绑定证书的域名
        ssl on;
        ssl_certificate 1_www.domain.com_bundle.crt;
        ssl_certificate_key 2_www.domain.com.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
        ssl_prefer_server_ciphers on;
        location / {
            root   html; #站点目录
            index  index.html index.htm;
        }
    }
配置完成后,先用bin/nginx –t来测试下配置是否有误,正确无误的话,重启nginx。就可以使 https://www.domain.com 来访问了。

注:

配置文件参数	说明
listen 443	SSL访问端口号为443
ssl on	启用SSL功能
ssl_certificate	证书文件
ssl_certificate_key	私钥文件
ssl_protocols	使用的协议
ssl_ciphers	配置加密套件,写法遵循openssl标准
2.3 使用全站加密,http自动跳转https(可选)

对于用户不知道网站可以进行https访问的情况下,让服务器自动把http的请求重定向到https。
在服务器这边的话配置的话,可以在页面里加js脚本,也可以在后端程序里写重定向,当然也可以在web服务器来实现跳转。Nginx是支持rewrite的(只要在编译的时候没有去掉pcre)
在http的server里增加rewrite ^(.*) https://$host$1 permanent;
在80端口上 添加 rewrite     ^   https://$server_name:443$request_uri? permanent;


 server {
        listen       80;
        server_name  localhost;
        rewrite     ^   https://$server_name:443$request_uri? permanent;
        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }




这样就可以实现80进来的请求,重定向为https了。

关于Nginx的配置

location配置

location 匹配完毕后会将 url全部拼接到 root

alias 则不会匹配