nginx 技术文档

nginx 介绍

Nginx ("engine x") 是一个开源的,支持高性能、高并发的 Web 服务和代理服务软件。

反向代理

反向代理就是当请求访问你的代理服务器时,代理服务器会对你的请求进行转发,可以转发到静态的资源路径上去,也可以转发到动态的服务接口上去。

  1. 静态代理

    静态代理就是将请求代理到不同的静态资源路径上去(前端的项目用 nginx 做静态代理)

  2. 动态代理

    动态代理就是把代理服务器的请求转发到另一个服务上去(把请求转到后台)

  3. 图示

    nginx_第1张图片

nginx 安装

Linux 下 nginx 安装

  1. 确认系统中安装了 gcc pcre-devel zlib-devel openssl openssl-devel 软件包

    #安装命令
    yum -y install gcc pcre-devel zlib-devel openssl openssl-devel
  2. 下载 nginx 安装包(nginx-1.9.0.tar.gz)

    网址:https://nginx.org/download/

  3. 安装

    # 将安装包移动到安装目录下
    mv nginx-1.9.0.tar.gz /usr/local/nginx
    # 解压
    tar -zxvf nginx-1.9.0.tar.gz
    
    # 配置
    cd nginx-1.9.0
    # Configure是一个可执行脚本有很多选项,在待安装的源码路径下使用命令
    # ./configure–help输出详细的选项列表 
    ./configure --prefix=/usr/local/nginx #--prefix选项是配置安装的路径
    
    # 安装
    make #编译
    make install #安装
    
  4. 测试是否安装成功,配置开机自启

    #测试是否安装成功
    cd /usr/loca/nginx/
    ./sbin/nginx -t
    #配置开机自启
    vim /etc/rc.d/rc.local
    #重启 nginx
    /usr/local/nginx/sbin/nginx -s reload

    nginx

    nginx_第2张图片

Docker 下 nginx 安装

  1. 下载 nginx 镜像

    docker pull nginx:1.10
  2. copy 容器中 nginx 配置

    # 先运行一次容器(为了拷贝配置文件)
    docker run -p 80:80 --name nginx \
    -v /mydata/nginx/html:/usr/share/nginx/html \
    -v /mydata/nginx/logs:/var/log/nginx  \
    -d nginx:1.10
    
    # 将容器内的配置文件拷贝到指定目录
    docker container cp nginx:/etc/nginx /mydata/nginx/
    # 修改文件名称
    mv nginx conf
    # 终止并删除容器
    docker stop nginx
    docker rm nginx
  3. 使用 Docker命令启动 nginx 容器

    docker run -p 80:80 --name nginx \
    -v /mydata/nginx/html:/usr/share/nginx/html \
    -v /mydata/nginx/logs:/var/log/nginx  \
    -v /mydata/nginx/conf:/etc/nginx \
    -d nginx:1.10

nginx 配置

nginx_第3张图片

宿主机配置

  1. 目录结构(版本不同,目录结构不同)

    nginx_第4张图片

    nginx

  2. 配置文件

    • 图解

    nginx_第5张图片

    • nginx 1.9.0

      #主配置文件 nginx.conf
      
      worker_processes  1;
      
      events {
       worker_connections  1024;
      }
      
      http {
       include       mime.types;
       default_type  application/octet-stream;
      
       sendfile        on;
       #tcp_nopush     on;
      
       #keepalive_timeout  0;
       keepalive_timeout  65;
      
       #压缩配置
       gzip on; #开启gzip
       gzip_disable "msie6"; #IE6不使用gzip
       gzip_vary on; #设置为on会在Header里增加 "Vary: Accept-Encoding"
       gzip_proxied any; #代理结果数据的压缩
       gzip_comp_level 6; #gzip压缩比(1~9),越小压缩效果越差,但是越大处理越慢,所以一般取中间值
       gzip_buffers 16 8k; #获取多少内存用于缓存压缩结果
       gzip_http_version 1.1; #识别http协议的版本
       gzip_min_length 1k; #设置允许压缩的页面最小字节数,超过1k的文件会被压缩
       gzip_types application/javascript text/css; #对特定的MIME类型生效,js和css文件会被压缩
      
       server {
           #https(监听443 云服务器需要开启443安全组)
           listen       443;
           server_name  xxx.xxx.com;
          ssl on;
          ssl_certificate /usr/local/_.topwellsoft.com_bundle.crt;
          ssl_certificate_key /usr/local/topwellsoft.com.key;
          ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
          ssl_prefer_server_ciphers  on;
          ssl_ciphers          EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:EDH+aRSA:HIGH:!aNULL:!eNULL:!LOW:!RC4:!3DES:!MD5:!EXP:!PSK:!SRP:!SEED:!DSS:!CAMELLIA;
      
           location / {
               root   html;
               index  index.html index.htm;
           }
      
          #旅游项目后台
          location /tptrip/ {
              proxy_pass  http://localhost:8087/;
              }
      
           #旅游项目手机端
           location /tptrip/mobile/ {
               proxy_pass   http://localhost:8088/tptrip/mobile/; #请求容器中的手机端项目
               index  index.html index.htm;
           }
           #旅游项目pc端
           location /tptrip/trip/ {
               #proxy_pass   http://172.18.0.9:80/tptrip/trip/; #请求容器中的pc端项目
               proxy_pass   http://localhost:8086/tptrip/trip/;
               index  index.html index.htm;
           }
      
           error_page   500 502 503 504  /50x.html;
           location = /50x.html {
               root   html;
           }
       }
      
      }
      
      # nginx.conf.default
      同上
    • nginx 1.16.1

      #主配置文件 nginx.conf
      
      user  nginx;
      worker_processes  1;
      
      error_log  /var/log/nginx/error.log warn;
      pid        /var/run/nginx.pid;
      
      events {
       worker_connections  1024;
      }
      
      http {
       include       /etc/nginx/mime.types;
       default_type  application/octet-stream;
      
       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  /var/log/nginx/access.log  main;
      
       sendfile        on;
       #tcp_nopush     on;
      
       keepalive_timeout  65;
      
       #gzip  on;
      
      #加载 /etc/nginx/conf.d/ 目录下的所有*.conf 文件,作为子配置文件
       include /etc/nginx/conf.d/*.conf;
      }
      
      #默认配置文件 default.conf
      upstream gisserver{
       server xxxx;
      }
      server {
       listen       80;
       server_name  localhost;
      
       #charset koi8-r;
       #access_log  /var/log/nginx/host.access.log  main;
      
       location / {
           root   /usr/share/nginx/html;
           index  index.html index.htm;
       }
      
       listen       8080;
       location /traffic {
           root /root/tp_traffic_visualization/dist;
        }
      
      #     location / {
      #           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      #           proxy_set_header Host $http_host;
      #           proxy_pass http://gisserver;
      #        }
      
      #    location /iserver {
      #        client_body_buffer_size 10m;
      #        client_max_body_size 100m;
      #        proxy_pass http://gisserver;
      #    }
      
       #error_page  404              /404.html;
      
       # redirect server error pages to the static page /50x.html
       #
       error_page   500 502 503 504  /50x.html;
       location = /50x.html {
           root   /usr/share/nginx/html;
       }
      
       # proxy the PHP scripts to Apache listening on 127.0.0.1:80
       #
       #location ~ \.php$ {
       #    proxy_pass   http://127.0.0.1;
       #}
      
       # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
       #
       #location ~ \.php$ {
       #    root           html;
       #    fastcgi_pass   127.0.0.1:9000;
       #    fastcgi_index  index.php;
       #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
       #    include        fastcgi_params;
       #}
      
       # deny access to .htaccess files, if Apache's document root
       # concurs with nginx's one
       #
       #location ~ /\.ht {
       #    deny  all;
       #}
      }

容器内配置

  1. 目录结构

    nginx_第6张图片

  2. 配置

    # 生成 docker 镜像
    FROM nginx:stable-alpine
    WORKDIR /data
    # copy 容器外配置文件到 nginx 默认安装路径下(覆盖默认配置文件)
    #注意,先把容器生成的默认配置文件 copy 到容器外,在此基础上修改生成我们自己的配置文件
    COPY  nginx/nginx.conf /etc/nginx/nginx.conf
    #copy 编译后的前端项目到 /usr/share/nginx/html/tptrip/trip/
    #访问地址:https://xxx:端口号/tptrip/trip/
    COPY  dist/ /usr/share/nginx/html/tptrip/trip/
    #声明运行时容器提供服务端口,只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。写成 80不用更改
    EXPOSE 80
    CMD ["nginx", "-g", "daemon off;"]
    # nginx.conf 主配置文件
    user  nginx;
    worker_processes  auto;
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    
    events {
       worker_connections  1024;
    }
    
    http {
       include       /etc/nginx/mime.types;
       default_type  application/octet-stream;
    
       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  /var/log/nginx/access.log  main;
    
       sendfile        on;
       #tcp_nopush     on;
       server {
           #charset koi8-r;
    
           #access_log  logs/host.access.log  main;
    
           # location / {
           #     root   html;
           #     index  index.html index.htm;
           # }
    
           listen       80;
           location /tptrip/trip/ {
            root /usr/share/nginx/html/tptrip/trip/;
            if (!-e $request_filename) {
                   rewrite ^(.*)$ /index.html?s=$1 last;
                   break;
               }   
           }
           error_page   500 502 503 504  /50x.html;
           location = /50x.html {
               root   html;
           }
       }
       keepalive_timeout  65;
    
       #gzip  on;
       gzip on; #开启gzip
       gzip_disable "msie6"; #IE6不使用gzip
       gzip_vary on; #设置为on会在Header里增加 "Vary: Accept-Encoding"
       gzip_proxied any; #代理结果数据的压缩
       gzip_comp_level 6; #gzip压缩比(1~9),越小压缩效果越差,但是越大处理越慢,所以一般取中间值
       gzip_buffers 16 8k; #获取多少内存用于缓存压缩结果
       gzip_http_version 1.1; #识别http协议的版本
       gzip_min_length 1k; #设置允许压缩的页面最小字节数,超过1k的文件会被压缩
       gzip_types application/javascript text/css; #对特定的MIME类型生效,js和css文件会被压缩
    
       include /etc/nginx/conf.d/*.conf;
    }