nginx理解

可以写多个server监听同一个端口号,但是要求server_name不一样,就会达到虽然用的同一个主机访问不同的域名走不同的反代,达到访问不同网页的目的。
linux的nginx是一个.conf文件就是一个server,然后可以为每一个域名建一个这个配置文件,专门配置它的代理

nginx和frp共享80端口

一台主机的情况下共用80端口,这里要借助域名。
把80端口交给nginx,然后frp的http服务起其他端口比如8888。
nginx通过反代映射给frp。

server {
    listen       80;
    server_name  *.oxoxo.xyz;

    location / {
        proxy_pass      http://127.0.0.1:8888;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

这里需要注意的是frp只能用二级域名做透传,不支持一级域名。
而且一般一级域名也都是要留给自己对一些服务做介绍用,比如我可以在主页里介绍这个透传服务。
为了使自起服务和透传的服务共用80端口就需要再建一个nginx的配置文件,也监听80端口但是域名不一样,我们这里可以用主域名。

server {
    listen       80;
    server_name  www.oxoxo.xyz oxoxo.xyz;

    location / {
        proxy_pass      http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

8000就是我起的frps的http服务,用来描述内网透传服务用的。
这个2段代码可以分别建.conf文件,放在/nginx/conf/conf.d目录下,比如default.conf、default1.conf,然后运行nginx就会自动加载这2个配置文件,根据不同的域名走不同的代理配置。

安装docker版nginx

  1. 下载镜像

    docker pull nginx

  2. 运行镜像

    docker run -d -P --name nginx cd52

  3. 新建目录,并进入目录

    mkdir nginx
    cd nginx

  4. 拷贝配置到当前目录,.代表当前目录

docker cp nginx:/etc/nginx .

  1. 停止并删除nginx容器

    docker rm -f nginx

  2. 目录改名conf
    mv nginx conf

  3. 新建容器,把当前目录加卷
    docker run --name nginx -d -p 9012:80 -v /root/nginx/html:/usr/share/nginx/html -v /root/nginx/conf:/etc/nginx cd52

如果遇到/etc/nginx/nginx.conf权限问题打不开需要禁用selinux。

nginx配置文件配置共用80端口

  1. 先修改监听的端口号,即共用的端口号,http.server.listen的值改成80
  2. 添加子服务器,新建location,每一个location代表一种匹配方式,如果访问能够匹配上则会跳转到proxy_pass定义的其他端口号提供的服务上去,location可以写多个
#user       www www;  ## Default: nobody
    worker_processes  5;  ## Default: 1
    error_log  logs/error.log;
    pid        logs/nginx.pid;
    worker_rlimit_nofile 8192;

    events {
      worker_connections  4096;  ## Default: 1024
    }

    http {

      default_type application/octet-stream;
      log_format   main '$remote_addr - $remote_user [$time_local]  $status '
        '"$request" $body_bytes_sent "$http_referer" '
        '"$http_user_agent" "$http_x_forwarded_for"';
      access_log   logs/access.log  main;
      sendfile     on;
      tcp_nopush   on;
      server_names_hash_bucket_size 128; # this seems to be required for some vhosts


      server { # simple reverse-proxy
        listen       80;
        server_name  oxoxo.xyz;
        access_log   logs/domain2.access.log  main;

        location / {
          proxy_pass      http://172.21.0.15:81/;
        }
        location /wx {
          proxy_pass      http://172.21.0.15:83/;
        }
      }


    }