在这里插入图片描述

nginx初始化

docker拉取nginx镜像

[root@Dragon ~]# dk pull nginx

实例化nginx镜像

[root@Dragon ~]# dk run -it --name nginx1 -p 80:80 nginx /bin/bash
WARNING: IPv4 forwarding is disabled. Networking will not work.

有一个警告意思是ipv4的转发未开启先不管

启动nginx

找一下启动文件

root@65493cd4789a:/usr/local/sbin# find / -name nginx
# 下面是输出的结果
/etc/default/nginx
/etc/init.d/nginx
/etc/logrotate.d/nginx
/etc/nginx
find: '/proc/1/map_files': Operation not permitted
find: '/proc/11/map_files': Operation not permitted
/usr/lib/nginx
/usr/sbin/nginx
/usr/share/doc/nginx
/usr/share/nginx
/var/cache/nginx
/var/log/nginx

/usr/sbin/nginx看起来比较像

cd进去,找到了,然后运行./nginx命令启动nginx

root@65493cd4789a:/usr/local/sbin# cd /usr/sbin
root@65493cd4789a:/usr/sbin# ./nginx
2021/10/26 12:47:04 [notice] 13#13: using the "epoll" event method
2021/10/26 12:47:04 [notice] 13#13: nginx/1.21.3
2021/10/26 12:47:04 [notice] 13#13: built by gcc 8.3.0 (Debian 8.3.0-6) 
2021/10/26 12:47:04 [notice] 13#13: OS: Linux 3.10.0-1160.el7.x86_64
2021/10/26 12:47:04 [notice] 13#13: getrlimit(RLIMIT_NOFILE): 1048576:1048576

有几行notice先不管

查看nginx配置文件,我们使用nginx主要就是在配置文件里进行编辑,后面会详细讲到。

# 使用find命令查找配置文件nginx.conf
root@65493cd4789a:/usr/sbin# find / -name nginx.conf
# 输出结果
/etc/nginx/nginx.conf
find: '/proc/1/map_files': Operation not permitted
find: '/proc/14/map_files': Operation not permitted
find: '/proc/15/map_files': Operation not permitted
find: '/proc/19/map_files': Operation not permitted
# 查看配置文件
root@65493cd4789a:/usr/sbin# cat /etc/nginx/nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
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;

    include /etc/nginx/conf.d/*.conf;
}

在宿主机浏览器访问80端口,可以看到nginx的welcome页面

nginx常用命令

nginx命令需要在nginx的目录下才能使用

查看nginx版本号

root@e137e425fbf3:/usr/sbin# ./nginx -v
nginx version: nginx/1.21.3

关闭nginx

root@e137e425fbf3:/usr/sbin# ./nginx -s stop
2021/10/26 13:47:45 [notice] 42#42: signal process started

启动nginx

./nginx

重新加载nginx

可加载配置文件里的内容

./ nginx -s reload

nginx配置文件

先创建nginx的容器数据卷

在root/nginx目录下创建www、logs、conf目录

  • conf:nginx配置文件目录
  • logs:nginx日志目录
  • www:nginx存储网站网页目录

拷贝配置文件到本地

[root@Dragon ~]# dk cp nginx1:/etc/nginx/nginx.conf /root/nginx/conf

创建新的容器并将www、logs、conf目录映射到本地

docker run -d -p 80:80 --name d_nginx -v /root/nginx/www:/usr/share/nginx/html -v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /root/nginx/logs:/var/log/nginx nginx

这样就可以在容器外编辑配置文件了

配置文件由四部分组成

全局块

从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配
置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数, 进程 PID 存放路径、日志存放路径和类型以
及配置文件的引入等。

worker_processes  auto;

这是 Nginx 服务器并发处理服务的关键配置, worker_processes 值越大,可以支持的并发处理量也越多,但是
会受到硬件、软件等设备的制约

events块

events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process
下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word
process 可以同时支持的最大连接数等。

events {
    worker_connections  1024;
}

上述例子就表示每个 work process 支持的最大连接数为 1024.
这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置

http块

这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。

需要注意的是: http 块也可以包括 http 全局块、 server 块。

http全局块

http 全局块配置的指令包括文件引入、 MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等

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;

    include /etc/nginx/conf.d/*.conf;
}
server块

在/etc/nginx/conf.d/目录下的default.conf中

这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了
节省互联网服务器硬件成本。

每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。

1、全局 server 块

最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。

2、 location 块

一个 server 块可以配置多个 location 块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称
(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓
存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #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;
    #}
}

nginx配置反向代理

简单代理

拉取tomcat镜像,映射到8080端口

[root@Dragon conf]# dk run -d -p 8080:8080 --name d_tomcat tomcat:8.0.52

我们直接在http块中添加自定义的server块即可,配置80端口的请求转发到tomcat的8080端口

    server{
       listen 80;
       charset utf-8;
       server_name 192.168.152.161;
 
       location / {
          proxy_pass http://192.168.152.161:8080;
          proxy_redirect default;
       }
    }

重启d_nginx镜像,再次用宿主机浏览器访问虚拟机80端口,成功访问到tomcat的welcome页面。反向代理成功!

复杂代理

准备两个jar程序分别在8888端口和9999端口,配置server块让访问虚拟机的uri中带有index.html的转发到9999端口,uri中带有cartoonIndex.html的转发到8888端口。

 server{
       listen 80;
       charset utf-8;
       server_name 192.168.152.161;

       location ~/cartoonIndex.html {
          proxy_pass http://192.168.152.161:8888;
       }
       location ~/index.html {
          proxy_pass http://192.168.152.161:9999;
          proxy_redirect default;
       }

这里只是一个简单的例子,这个只转发了两个页面,其余的东西没有转发。正常情况下应该配置路径

nginx配置负载均衡

将同一个请求平均分到两个服务器上

配置负载均衡时要把默认配置include /etc/nginx/conf.d/*.conf;删除

    upstream myserver {
        server 192.168.152.161:8888;
        server 192.168.152.161:9999;
    }
    server{
        listen 80;
        charset utf-8;
        server_name 192.168.152.161;
        
        location / {
          proxy_pass http://myserver;
        }
    }

默认负载均衡的策略时轮询

轮询

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

weight

指定轮询几率, weight 和访问比率成正比,用于后端服务器性能不均的情况。

    upstream myserver {
        server 192.168.152.161:8888 weight=10;
        server 192.168.152.161:9999 weight=15;
    }

ip_hash

每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。

upstream myserver {
        ip_hash;
        server 192.168.152.161:8888;
        server 192.168.152.161:9999;
    }

fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

    upstream server_pool{
        server 192.168.152.161:8888;
        server 192.168.152.161:9999;
        fair;
    }

nginx配置动静分离

Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和
静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx
处理静态页面, Tomcat 处理动态页面。

动静分离从目前实现角度来讲大致分为两种

一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;

另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。

通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使
浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资
源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,
所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,
不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送
一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码
304,如果有修改,则直接从服务器重新下载,返回状态码 200。

由于我们是使用nginx容器,所以在配置静态资源的时候要放在映射好的www文件夹里,路径写成容器里的绝对路径


   server{
       listen 80;
       charset utf-8;
       server_name 192.168.152.161;

       location /www/ {
          alias /usr/share/nginx/html/www;
          index index.html index.htm;
          autoindex     on;
       }
       location /image/ {
          root  /usr/share/nginx/html/data/;
          autoindex     on;
       }
    }
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐