1. 简介

Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强

2. 正向代理和反向代理

2.1 正向代理

**正向代理**类似一个跳板机,代理访问外部资源。比如:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器,它能访问那个我不能访问的网站,于是我先连上代理服务器,告诉它我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。 image.png

2.2 反向代理

**反向代理(Reverse Proxy)**方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器; image.png

3. Nginx安装以及相关命令

3.1 Nginx安裝

  • 在 hadoop101上运行 yum,安装相关依赖包

    1. sudo yum -y install openssl openssl-devel pcre pcre-devel zlib zlib-devel gcc gcc-c++
  • 上传nginx的tar包至/opt /software,并解压

    1. tar -zxvf nginx-1.12.2.tar.gz
  • 进入解压缩目录,执行编译及安装 ```bash ./configure —prefix=/opt/module/nginx make && make install

—prefix=表示要安装到的目录

  1. - 安装成功后,/opt/module/nginx 目录下结构
  2. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/668367/1631622982868-f444d326-f29e-4389-8770-1835ea6617d3.png#clientId=u0cf3daf3-c554-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=101&id=u7602ab9b&margin=%5Bobject%20Object%5D&name=image.png&originHeight=201&originWidth=795&originalType=binary&ratio=1&rotation=0&showTitle=false&size=27339&status=done&style=none&taskId=u4e774412-b442-40c4-b943-1face672427&title=&width=397.5)
  3. <a name="AV4o8"></a>
  4. ## 3.2 Nginx启动
  5. - 在/opt/module/nginx/sbin 目录下执行
  6. ```bash
  7. # 启动
  8. ./nginx
  9. # 通过配置文件启动,其中-c是指定配置文件,而且配置文件路径必须指定绝对路径
  10. ./nginx -c /opt/module/nginx/conf/nginx.conf
  11. #/opt/module/nginx/sbin/nginx -c /opt/module/nginx/conf/nginx.conf
  12. # 重启
  13. ./nginx -s reload
  14. # 关闭
  15. ./nginx -s stop
  16. # 配置检查
  17. # 当修改 Nginx 配置文件后,可以使用 Nginx的-t 命令进行配置文件语法检查,用于检查 Nginx 配置文件是否正确
  18. /opt/module/nginx/sbin/nginx -c /opt/module/nginx/conf/nginx.conf –t
  • 如果在 非root用户下面启动会报错
    • 原因:nginx 占用 80 端口,默认情况下非 root 用户不允许使用 1024 以下端口
    • 解决:让当前用户的某个应用也可以使用 1024 以下的端口
    • sudo setcap cap_net_bind_service=+eip /opt/module/nginx/sbin/nginx
    • 注意:要根据自己的实际路径进行配置
  • 如果 80 端口号被占用 httpd
    • sudo systemctl stop httpd
    • sudo systemctl disable httpd
  • 部分机器启动时报错:
    • /usr/local/nginx/sbin/nginx: error while loading shared libraries:libpcre.so.1: cannot open shared object file: No such file or directory
    • 解决:ln -s /usr/local/lib/libpcre.so.1 /lib64
      • 查看启动情况
        1. # 因为 nginx 不是用 java 写的,所以不能通过 jps 查看
        2. ps -ef | grep nginx

image.png

3.3 Nginx重启

  1. # 重启
  2. ./nginx -s reload

3.4 Nginx关闭

  1. # 关闭
  2. ./nginx -s stop

3.5 Nginx配置检查

  1. # 配置检查
  2. # 当修改 Nginx 配置文件后,可以使用 Nginx的-t 命令进行配置文件语法检查,用于检查 Nginx 配置文件是否正确
  3. /opt/module/nginx/sbin/nginx -c /opt/module/nginx/conf/nginx.conf t

4. Nginx 核心配置文件说明

核心配置文件位于 Nginx 的安装目录/opt/module/nginx/conf 目录下,名字为**nginx.conf**

4.1 基本配置user|worker_processes|error_log|pid

  1. # 配置worker进程运行用户,nobody也是一个linux用户,一般用于启动程序,没有密码
  2. user nobody;
  3. # 配置工作进程数目,根据硬件调整,通常等于CPU数量或2倍于CPU数量
  4. worker_processes 1;
  5. # 配置全局错误日志及类型,[debug | info | notice | warn | error | crit],默认是error
  6. error_log logs/error.log;
  7. #error_log logs/error.log notice;
  8. #error_log logs/error.log info;
  9. # 配置进程pid文件
  10. pid logs/nginx.pid;

4.2 events

  1. # 配置工作模式和连接数
  2. events {
  3. # ======配置每个worker进程连接数上限,nginx支持的总连接数就等于worker_processes * worker_connections======
  4. worker_connections 1024;
  5. }

4.3 http配置(重点)

4.3.1 基本配置

  1. # 配置http服务器,利用他的反向代理功能提供负载均衡支持
  2. http {
  3. # 配置nginx支持哪些多媒体类型,可以在conf/mime.types查看支持哪些多媒体类型
  4. include mime.types;
  5. # 默认文件类型 流类型,可以理解为支持任意类型
  6. default_type application/octet-stream;
  7. # 配置日志格式
  8. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  9. # '$status $body_bytes_sent "$http_referer" '
  10. # '"$http_user_agent" "$http_x_forwarded_for"';
  11. # ======配置access.log日志及存放路径,并使用上面定义的main日志格式======
  12. #access_log logs/access.log main;
  13. sendfile on; # 开启高效文件传输模式
  14. #tcp_nopush on; # 防止网络阻塞
  15. #keepalive_timeout 0;
  16. keepalive_timeout 65; # 长链接超时时间,单位是秒
  17. #gzip on; # 开启gzip压缩输出

4.3.2 server(可配置多个)

  • server———配置对应的服务器

    • listen———监听的端口号
    • server_name———IP
    • ssi on;//开启ssi支持
    • ssi_silent_errors on;//默认为off,设置为on则在处理SSI文件出错时不输出错误信息
    • ssi_types://默认为 ssi_types text/html,如果需要支持shtml(服务器执行脚本,类似于jsp)则需要设置为ssi_types text/shtml
    • location 虚拟主机———虚拟路径

      • alias———映射的实际路径
      • Access-Control-Allow-Origin 外域地址———允许跨域访问的外域地址。如果允许任何站点跨域访问则设置为*,通常这是不建议的。
      • Access-Control-Allow-Credentials true/false———允许客户端携带证书访问
      • Access-Control-Allow-Methods GET———允许客户端跨域访问的方法
      • proxy_pass———服务器列表名,与upstream结合使用 ```nginx

        配置虚拟主机

        server { listen 80; # 配置监听80端口 server_name localhost; # 配置服务名

        charset koi8-r; # 配置字符集

        access_log logs/host.access.log main; # 配置本虚拟主机的访问日志

        1. # 默认的匹配斜杠/的请求,当访问路径中有斜杠/,会被该location匹配到并进行处理

        location / {

        1. root html; # root是配置服务器的默认网站根目录位置,默认是nginx安装目录下的html目录
        2. index index.html index.htm; # 配置首页文件的名称

        }

        1. # 配置404的页面

        error_page 404 /404.html;

        redirect server error pages to the static page /50x.html

        配置50x页面

        error_page 500 502 503 504 /50x.html;

        精确匹配

        location = /50x.html {

        1. root html;
        2. # proxy pass http://www.xxx.com 反向代理,http://upstream后配置的名称

        }

        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;

        }

        }

HTTPS的配置见6.总结

HTTPS server

  1. #
  2. #server {
  3. # listen 443 ssl;
  4. # server_name localhost;
  5. # ssl_certificate cert.pem;
  6. # ssl_certificate_key cert.key;
  7. # ssl_session_cache shared:SSL:1m;
  8. # ssl_session_timeout 5m;
  9. # ssl_ciphers HIGH:!aNULL:!MD5;
  10. # ssl_prefer_server_ciphers on;
  11. # location / {
  12. # root html;
  13. # index index.html index.htm;
  14. # }
  15. #}
  1. <a name="tpljc"></a>
  2. ### 4.3.3 upstream(手动添加)--- 服务器列表,负载均衡
  3. ```nginx
  4. # ex:Flink实时数仓案例使用如下配置:
  5. # www.xxx.com是指location中配置的proxy_pass,即为访问www.xxx.com,反向代理分发到upstream下的三台主机上
  6. upstream www.xxx.com {
  7. server hadoop101:8081 weight=1;
  8. server hadoop102:8081 weight=2;
  9. server hadoop103:8081 weight=3;
  10. }
  11. # 注意:每行配置完毕后有分号
  12. # upstream------实现请求转发,负载均衡
  13. # weight------指定负载均衡权重
  14. # server------指定反向代理的服务器
  15. # ip_hash------访问此ip,固定访问哪个tomcat服务器(粘性session)

5. Nginx的主要应用

5.1 静态网站部署

Nginx 是一个 HTTP 的 web 服务器,可以将服务器上的静态文件(如 HTML、图片等) 通过 HTTP 协议返回给浏览器客户端

5.2 负载均衡

在网站创立初期,一般都使用单台机器对外提供集中式服务。随着业务量的增大, 一台服务器不够用,此时就会把多台机器组成一个集群对外提供服务,但是,网站对外提供的访问入口通常只有一个,比如 www.web.com。那么当用户在浏览器输入 www.web.com 进行访问的时候,如何将用户的请求分发到集群中不同的机器上呢,这就是负载均衡要做的事情。

负载均衡通常是指将请求”均匀”分摊到集群中多个服务器节点上执行,这里的均匀是指 在一个比较大的统计范围内是基本均匀的,并不是完全均匀 image.png 常用的负载均衡策略:轮询、权重、备机…

5.3 静态代理

把所有静态资源的访问改为访问 nginx,而不是访问 tomcat,这种方式叫静态代理。 因为 nginx 更擅长于静态资源的处理,性能更好,效率更高。 所以在实际应用中,我们将静态资源比如图片、css、html、js 等交给 nginx 处理,而不是由 tomcat 处理。 image.png

5.4 动静分离

Nginx 的负载均衡和静态代理结合在一起,可以实现动静分离,这是实际应用中常见的一种场景。 动态资源,如 jsp 由 tomcat 或其他 web 服务器完成 静态资源,如图片、css、js 等由 nginx 服务器完成 它们各司其职,专注于做自己擅长的事情 动静分离充分利用了它们各自的优势,从而达到更高效合理的架构 image.png

5.5 虚拟主机

虚拟主机,就是把一台物理服务器划分成多个“虚拟”的服务器,这样我们的一台物理服务器就可以当做多个服务器来使用,从而可以配置多个网站。

Nginx 提供虚拟主机的功能,就是为了让我们不需要安装多个 Nginx,就可以运行多 个域名不同的网站。

Nginx 下,一个 server 标签就是一个虚拟主机。nginx 的虚拟主机就是通过 nginx.conf 中 server 节点指定的,想要设置多个虚拟主机,配置多个 server 节点即可。

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

6. 总结

6.1 基本步骤

  • 先准备Tomcat,修改Server.xml中的端口号(server、Connector、Connector(jta)三个标签)
  • 解压Nginx,修改nginx.conf文件
    • 配置一个upStream 服务器列表名{服务器1的IP+端口,服务器2IP+端口…}
    • 配置一个server(反向代理服务器),里面有端口,域名,location里面再配置一个proxy_pass=服务器列表名

6.2 配置项

  • upstream———服务器列表,实现请求转发,负载均衡
    • weight———负载均衡权重
    • server———反向代理的服务器
    • ip_hash———访问此ip,固定访问哪个tomcat服务器(粘性session)
  • server———配置对应的服务器
    • listen———监听的端口号
    • server_name———IP
    • ssi on;//开启ssi支持
    • ssi_silent_errors on;//默认为off,设置为on则在处理SSI文件出错时不输出错误信息
    • ssi_types://默认为 ssi_types text/html,如果需要支持shtml(服务器执行脚本,类似于jsp)则需要设置为ssi_types text/shtml
    • location 虚拟主机———虚拟路径
      • alias———映射的实际路径
      • Access-Control-Allow-Origin 外域地址———允许跨域访问的外域地址。如果允许任何站点跨域访问则设置为*,通常这是不建议的。
      • Access-Control-Allow-Credentials true/false———允许客户端携带证书访问
      • Access-Control-Allow-Methods GET———允许客户端跨域访问的方法
      • proxy_pass———服务器列表名,反向代理