Nginx

Nginx

Nginx

Nginx FAQ

403

403 forbidden,权限问题

  • 还没到后端,或者静态文件,从nginx返回的,文件权限,是否nginx有读权限;location特定返回,某个location返回403
  • 到了后端了,从后端返回的,后端认为没权限,检查后端逻辑

geoip配置

安装

如果是源码安装,需要重新编译

如果源安装,centos系,debian系列自行搜索下吧

1
yum -y install nginx-module-geoip

nginx部分

/etc/nginx.conf里面需要增加

1
2
load_module modules/ngx_http_geoip_module.so;
load_module modules/ngx_stream_geoip_module.so

http里面需要增加

1
geoip_country /usr/share/GeoIP/GeoIP.dat;

server里面一个简单的配置参考

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
server {
    server_name test.liuliancao.com;
    location /question {
       if ($geoip_country_code = "CN") {
          rewrite ^/question https://inner.liuliancao.com permanent;
       }
       if ($geoip_country_code != "CN") {
           rewrite ^/question https://oversea.liuliancao.com  permanent;
       }
    }
}

有什么好办法在线测试一个nginx配置吗

80转443

rewrite ^/(.*)$1 https://xxxx/$1 permanent; https://cloud.tencent.com/document/product/400/35244

隐藏git等文件夹

1
2
3
  location ^~ /.git {
      return 444;
    }

try_files 404如何修改uri或者302跳转

不用try_files, 用error_page 404 = @notfound配合location @notfound进行 302跳转

1
2
3
4
5
6
7
8
9
  location / {
      root $baseroot;
      index  index.html;
      error_page 404 = @notfound;
      #try_files $uri $uri/ /index.html;
    }
    location @notfound {
      return 302 /;
    }

证书续签问题

通过let's encrypt这个CA机构进行签发,可参考知乎链接

正常可以选择certbot或者acme.sh

acme.sh

可以参考github的acme中文说明

安装Install
1
curl https://get.acme.sh | sh -s email=my@example.conf

如果安装失败可以再多执行几次,最终应该会成功,还不行按照指引

中国用户请参考: https://github.com/acmesh-official/acme.sh/wiki/Install-in-China

最后需要执行

1
2
3
4
5
6
source ~/.bashrc
# acme.sh version
https://github.com/acmesh-official/acme.sh
v3.0.6
# crontab -l
34 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

acme可以使用各个dns的api,比如阿里云等,但是没有对腾讯云的支持,腾讯云 可以参考下这个https://github.com/go-acme/lego

certbot

官方网站 https://certbot.eff.org/

注意签发以后的证书如果要上传到阿里云,需要进行一下转化成RSA格式的私钥

1
openssl rsa -in privkey.pem -out privkey.pem.rsa.key

nginx获取真实ip

一般代理会把proxy的ip列表放到X-Forwarded-For(大小写不敏感)里面 也有放到别的头里面的,也有放下划线的(X_Forwarded_For)

出现ip获取不到的情况的时候,可以errorlog增加debug写

1
error_log /var/log/nginx/test_debug.log debug;

对应nginx获取的配置

1
2
3
4
    underscores_in_headers on; # 支持带下划线的头,如果不是也可以不加
    set_real_ip_from "0.0.0.0/1"; # 设置要替换的头
    real_ip_header X_Forwarded_For; # 设置真实ip的头,一般是X-Forwarded-For
    real_ip_recursive on; # 如果不设置,后端获取到的可能是个列表

重新加工源码编译源安装的nginx

思路 通过nginx -V获取到编译参数,nginx -v获取指定版本,然后./configure 参数,make , make install即可,记得提前备份好内容,当然我们也可以自己 去解压rpm包,但那个相对麻烦了一点

下载nginx包

1
wget http://nginx.org/download/nginx-1.20.1.tar.gz

安装依赖

1
sudo yum install gcc pcre-devel openssl-devel zlib-devel libxml2-devel libxslt-devel gd gd-devel perl perl-devel perl-CPAN perl-ExtUtils-Embed.noarch graphviz gperftools-devel perl-YAML

我的系统是centos

1
2
[root@bt2-vm-lobby-optool-01 ~]# nginx -v
nginx version: nginx/1.20.1

nginx加固方案之ModSecurity

nginx开启debug 测试location等

error_log 的结尾加上debug即可,但是要注意 ./configure的时候需要加上–with-debug

参考文档