https配置模板

https的配置模板,访问http默认跳转到https

server {
    listen 80;
    server_name www.test123.com;
   #跳转https
    rewrite ^(.*)$ https://${server_name}$1 permanent;
}
server {
        listen    443;
        server_name www.test123.com;
       #开启ssl证书认证
        ssl on;
        access_log  /data/nginx/www.test123.com.access.log main;
        keepalive_timeout 60;
       #证书路径,根据实际情况改写
        ssl_certificate  /data/nginx/cert/www.test123.com.com.pem;
        ssl_certificate_key /data/nginx/cert/www.test123.com.com.key;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        #禁止在header中出现服务器版本,防止黑客利用版本漏洞攻击
        server_tokens off;

}

网页访问密码

有很多服务通过nginx访问,但本身没有提供账号认证的功能,就可以通过nginx提供的authbase账号密码认证来实现,可以用以下脚本来生成账号的密码。
大致分为两个步骤:
1、把账号密码写入文件
2、在nginx里导入账号密码文件

yum install httpd-tools -y
htpasswd -bc /usr/local/nginx/conf/htpasswd jyb  sz@jyb3706

vim xxx.conf
server {
    #网页输入密码提示语
    auth_basic "输入密码:";
    #密文位置
    auth_basic_user_file /usr/local/nginx/conf/htpasswd;
}

端口转发

用户访问网站时,将请求转发到指定端口

# upstream里的server可以写多个
upstream accesslayer.sit{
    server 127.0.0.1:7078 max_fails=2 fail_timeout=10s;
}
server {
    listen          80;
    server_name     accesslayer.sit.xxx.com;
    access_log  logs/accesslayer.sit_access.log  main;
    error_log  logs/accesslayer.sit_error.log ;
    location / {
        proxy_pass http://accesslayer.sit;
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_http_version 1.1;
        proxy_set_header host "accesslayer.sit.xxx.com";
        proxy_set_header Connection "";
        client_max_body_size  100m;
    }
}

配置多个站点

一台主机配置多个站点
基于端口的虚拟主机: 每个站点对应不同的端口,访问的时候使用ip:port的方式访问,可以修改nginx里的listen端口来实现

基于域名的虚拟主机: 使用最广的方式,下边例子中就是用了基于域名的虚拟主机,前提条件是你有多个域名分别对应每个站点,server_name填写不同的域名即可

当一个nginx服务上创建了多个虚拟主机时默认会从上到下查找,如果匹配不到虚拟主机则会返回第一个虚拟主机的内容,如果你想指定一个默认站点时,可以将这个站点的虚拟主机放在配置文件中第一个虚拟主机的位置,或者在这个站点的虚拟主机上配置listen default

server {
    listen       80 default;
    server_name  a.xxx.cn;
    location / {
        root /home/project/pa;
        index index.html;
    }
}

server {
    listen       80;
    server_name  xxx.cn  b.xxx.cn;
    location / {
        root /home/project/pb;
        index index.html;
    }
}

开启目录浏览

当你想让nginx作为文件下载服务器存在时,需要开启nginx的目录浏览,其会列出目录下的文件

server {
    location download {
        #开启目录浏览功能
        autoindex on;
        # 显示文件确切大小,单位是bytes。改为off后,显示文件大概大小,单位kB或MB或GB
        autoindex_exact_size off;
        # 默认为off,显示的文件时间为GMT时间。改为on后,显示的文件时间为文件的服务器时间
        autoindex_localtime on;
    }
}

默认当访问列出的txt等文件时会在浏览器上显示文件的内容,如果你想让浏览器直接下载,加上下边的配置

if ($request_filename ~* ^.*?\.(txt|pdf|jpg|png)$) {
    add_header Content-Disposition 'attachment';
}

禁止HTTP方式非配置域名访问

可能有一些未备案的域名或者你不希望的域名将服务器地址指向了你的服务器,这时候就会对你的站点造成一定的影响,需要禁止IP或未配置的域名访问,我们利用上边所说的default规则,将默认流量都转到444去。
其中defalut_server显式指出本server为80端口的默认server, 因为是默认server,所以server_name其实可以填任意值,444为nginx自定义code,表示断开连接不返回任何响应。

server
{
    listen 80 default_server;
    server_name _;
    return 444;
}

上边这个方法比较粗暴,当然你也可以配置下所有未配置的地址访问时直接301重定向到你的网站去,也能为你的网站带来一定的流量

server {
    rewrite ^/(.*)$ https://xxx.cn/$1    permanent;
}

禁止HTTPS非配置域名访问

在nginx1.19.4 及以上版本,禁止非预期域名直接访问配置也很简单,只需要添加443端口监听并配置ssl_reject_handshake on即可,具体可参见NGINX 配置避免 IP 访问时证书暴露域名
但是对于低版本nginx,需要配置对应443端口规则,还需要配置一个自签名IP证书(不配置证书的情况下nginx -t就会直接报配置不正确),配置如下:

server
{
    listen 80 default_server;
    listen 443 ssl default_server;
    server_name _;
    ssl_certificate /usr/local/nginx/conf/ssl/ip.crt;
    ssl_certificate_key /usr/local/nginx/conf/ssl/ip.key;
    return 444;
}

直接返回验证文件

很多时候微信等程序都需要我们放一个txt的文件到项目里以验证项目归属,我们可以直接通过上边这种方式修改nginx即可,无需真正的把文件给放到服务器上

location = /XDFyle6tNA.txt {
    default_type text/plain;
    return 200 'd6296a84657eb275c05c31b10924f6ea';
}

访问404重定向到指定页面

当请求的路径不存在时,重定向到指定的文件

# 第一种方法
if (!-e $request_filename) {
    rewrite ^/(.*) /xxx.html last;
    break;
}

# 第二种方法
server {
    location / {
       error_page 404 =  @errpage;
    }
    location @errpage {
       rewrite  .*  / permanent;
    }
}

upstream开启keepalive

nginx在项目中大多数情况下会作为反向代理使用,例如nginx后接tomcat,nginx后接php等,这时我们开启nginx和后端服务之间的keepalive能够减少频繁创建TCP连接造成的资源消耗,配置如下

upstream tomcat {
    server xxx.cn:8080;
    keepalive 1024;
}

server {
    location / {
        proxy_http_version 1.1;
        proxy_set_header Connection "";

        proxy_pass http://tomcat;
    }
}

keepalive: 指定每个nginxworker可以保持的最大连接数量为1024,默认不设置,即nginx作为client时keepalive未生效

proxy_http_version 1.1: 开启keepalive要求HTTP协议版本为HTTP 1.1

proxy_set_header Connection "": 为了兼容老的协议以及防止http头中有Connection close导致的keepalive失效,这里需要及时清掉HTTP头部的Connection

配置upstream反向代理

upstream tomcats {
    server 192.168.106.176 weight=1;
    server 192.168.106.177 weight=1;
}
    server {
        location /testpage/ {
            proxy_pass http://tomcats;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

}

稍不注意可能会落入一个proxy_pass加杠不加杠的陷阱,这里详细说下proxy_pass http://tomcatsproxy_pass http://tomcats/的区别:
虽然只是一个/的区别但结果却千差万别。分为以下两种情况:

1. 目标地址中不带/

proxy_pass http://tomcats)。此时新的目标url中,匹配的uri部分不做修改,原来是什么就是什么。

   location /testpage/ {
       proxy_pass  http://192.168.106.135:8181;
   }

http://domain/testpage/ -->  http://192.168.106.135:8181/testpage/
http://domain/testpage/action/abc --> http://192.168.106.135:8181/testpage/action/abc

2. 目标地址中带/

proxy_pass http://tomcats/),此时新的目标url中,匹配的uri部分将会被修改为该参数中的uri。

   location /testpage/ {
       proxy_pass  http://192.168.106.135:8181/;
   }

http://domain/testpage/ -->  http://192.168.106.135:8181
http://domain/testpage/action/abc -->  http://192.168.106.135:8181/action/abc

nginx的php配置

本机已安装php和nginx
在nginx的默认配置里第一行加上user root;
再修改配置文件

server {
    index index.php index.html;
    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php(.*)$  {
            root /usr/local/nginx/html/ccb/;
            fastcgi_pass   unix:/tmp/www;
            fastcgi_index  index.php;
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;
    }

}
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。