使用docker安装nginx

122 阅读4分钟

安装

root@oldsix:/data/nginx/conf/config.d# nerdctl run -d -p 80:80  \
              -p 443:443  \
 --name mynginx \
 --net=host \
 -v /data/nginx/html:/usr/share/nginx/html \
 -v /data/nginx/conf:/etc/nginx \
 -v /data/nginx/logs:/var/log/nginx \
 nginx 
37358645e312d4d42fbce1d1aea1097cc8a20c9b8a850c6ea3cc0c287c7e2936
root@oldsix:/data/nginx/conf/config.d# nerdctl ps
CONTAINER ID    IMAGE                             COMMAND                   CREATED          STATUS    PORTS                                       NAMES
37358645e312    docker.io/library/nginx:latest    "/docker-entrypoint.…"    2 seconds ago    Up        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp    mynginx
root@oldsix:/data/nginx/logs# netstat -nplt|grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      54694/nginx: master 

配置文件

root@oldsix:/data/nginx/logs# cat ../conf/nginx.conf
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log debug;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}
# 定义 HTTP 服务器
http {
    # 包含 MIME 类型的文件
    include       /etc/nginx/mime.types;
    # 默认 MIME 类型
    default_type  application/octet-stream;

log_format  main  '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent -- $args';
access_log /var/log/nginx/caoyong-access.log ;
 # 自定义的 Nginx 配置
    server {
        # 监听的端口
        listen       80;
        # 服务器名称
        #server_name  localhost;

        location / {
            # 网站根目录,此处使用容器内的路径
            root   /usr/share/nginx/html;
            # 默认首页
            index  index.html;
            # 尝试从磁盘找到请求的文件,如果不存在则跳转到 index.html
            try_files $uri $uri/ /index.html;
        }
        location /moli {
             autoindex on;
             if ($arg_path = "india"){
                rewrite /moli/(.*)$ /$1 break;
                proxy_pass http://india.knowdee.com;
             }
             if ($arg_path = "us"){
                rewrite /moli/(.*)$ /$1 break;
                proxy_pass http://moli-us.knowdee.com;
             }
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_read_timeout 600s;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        # 定义 404 页面
        error_page  404              /404.html;
        location = /404.html {
            root   /usr/share/nginx/html;
        }

        # 定义 50x 页面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
}
# 四层负载均衡,为三台Master apiserver组件提供负载均衡
#stream {
#    log_format  main  '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
#    access_log  /var/log/nginx/k8s-access.log  main;
#    upstream k8s-apiserver {
#       server 172.70.21.11:6443; 
#       server 172.70.21.12:6443; 
#       server 172.70.21.13:6443;  
#    }
#    
#    server {
#       listen 16443; # 由于nginx与master节点复用,这个监听端口不能是6443,否则会冲突
#       proxy_pass k8s-apiserver;
#    }
#}

按url请求参数代理

  1. location进行路径 最常见的是通过location进行路径匹配的时候,但是没办法使用正则表达一起捕获这个路径和querstring的参数。如果我们想通过URL里面的Query String进行不同的rewrite,应该如何处理呢?答案就是arg变量。Nginx里面arg变量。 Nginx里面query_string 与args相同,存储了所提交的所有args相同,存储了所提交的所有query_string;比如&p=2887&q=test 如果想要在nginx里面单独访问这些变量。可以这样 比如p变量可以这样访问p变量可以这样访问 arg_p arg可以精确匹配变量,比如说我有一个参数(uri里?后面的那部分全叫参数):&p=你大爷&q=你大娘,用query_string和arg就是获取所有,而使用arg就是获取所有,而使用arg_p就是可以获取“你大爷”。
  2. rewrite: 需求用到rewrite 其中有一个是要把a.php?id=2重定向到b-2.html 开始简单的写为 rewrite "^/a(.)?(.)"/b" /b-2.html permanent;

ingress 可以实现系统的功能

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    meta.helm.sh/release-name: app
    meta.helm.sh/release-namespace: moli-us
    nginx.ingress.kubernetes.io/configuration-snippet: |
      if ($http_path = "us") {
        proxy_pass http://app.moli-us;
        break;
      }
      if ($http_path = "india") {
        proxy_pass http://app.moli-india;
        break;
      }
  labels:
    app.kubernetes.io/instance: app
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: app
    app.kubernetes.io/version: 2.0.0
    helm.sh/chart: app-0.0.3
    helm.toolkit.fluxcd.io/name: app
    helm.toolkit.fluxcd.io/namespace: moli-us
  name: app
  namespace: moli-us
spec:
  ingressClassName: nginx
  rules:
  - host: moli-us.knowdee.com
    http:
      paths:
      - backend:
          service:
            name: app
            port:
              number: 80
        path: /
        pathType: ImplementationSpecific

Nginx配置中last和break及permanent和redirect的区别

一、不写last和break

流程就是依次执行这些rewrite

  1. rewrite break - url重写后,直接使用当前资源,不再执行location里余下的语句,完成本次请求,地址栏url不变
  2. rewrite last - url重写后,马上发起一个新的请求,再次进入server块,重试location匹配,超过10次匹配不到报500错误,地址栏url不变
  3. rewrite redirect – 返回302临时重定向,地址栏显示重定向后的url,爬虫不会更新url(因为是临时)
  4. rewrite permanent – 返回301永久重定向, 地址栏显示重定向后的url,爬虫更新url

二、使用last会对server标签重新发起请求

  1. 如果location中rewrite后是对静态资源的请求,不需要再进行其他匹配,一般要使用break或不写,直接使用当前location中的数据源,完成本次请求
  2. 如果location中rewrite后,还需要进行其他处理,如动态fastcgi请求(.PHP,.jsp)等,要用last继续发起新的请求
    (根的location使用last比较好, 因为如果有.php等fastcgi请求还要继续处理)
  3. 使用alias指定源:必须使用last

三、last和break总结

  1. 当出现在location之外时,两者的作用是一致的没有任何差异。
    注意一点就是,他们会跳过所有在他们之后的rewrite模块中的指令,去选择自己匹配的location
    Example:
rewrite url1 url2 last; ①
rewrite url3 url4 last; ②
rewrite url5 url6 last; ③
 
location ~  url2     ④
location ~  url4     ⑤
location ~  url6     ⑥

当① 这条rewrite 规则生效后,它后面的②和③ 将被跳过不做判断,而去直接选择 后面的location。

  1. last和break当出现在location内部时,两者就存在了差异
    last: 使用了last指令,rewrite后会跳出location作用域,重新开始再走一次刚刚的行为
    break: 使用了break指令,rewrite后不会跳出location 作用域。它的生命也在这个location中终结。
    Example:
rewrite xxx1 yyy last; ⑦
rewrite xxx2 yyy last; ⑧
rewrite xxx3 yyy last; ⑨
rewrite xxx4 yyy last; ⑩
 
location ~  url1
{
    rewrite url1 url2 last; ①
}
 
location ~  url2
{
    rewrite url3 url4 break; ②
    fastcgi_pass 127.0.0.1:9000;
}

以上事例说明:
第一个location中的rewrite指令处理完成之后,会跳出location,再重新判断rewrite 7 ~ 9的规则。
第二个location中的rewrite指令处理完成之后,不会跳出location,更不会重新判断rewrite 7 ~ 9的规则。而只能将信息传递给后面的fastcgi_pass或者proxy_pass等指令。

四、permanent和redirect总结

permanent: 大家公认的信息,永久性重定向。请求日志中的状态码为301
redirect:大家公认的信息,临时重定向。请求日志中的状态码为302
从实现功能的角度上去看,permanent 和 redirect 是一样的。不存在哪里好,哪里坏。也不存在什么性能上的问题。
但从SEO(或者是百度爬你的网站时)。 类似于这样的东西,会对你到底是永久性重定向还是临时重定向感兴趣。