需求
我有几个小网站需要穿透出去,为了方便使用和安全,选择了直接使用Nginx实现反向代理和ssl的部署,另外还有一些简单的Nginx防护
- 反代实现
- 加密访问(仅本人访问)
- SSL部署
- Nginx防护恶意请求
反代实现
server
{
listen 80;
server_name www.your_url.com;
location / {
proxy_pass http://local456:port/;
}
}
这样就在80端口实现了对server_name 的反代操作,server_name填写外部请求的url,proxy_pass填写内部你需要反代出去的url
当你对www.your_url.com进行访问的时候,nginx就会转发到http://local456:port/上,就实现了最简单的反向代理
注意需要在系统内部防火墙内开放端口
加密访问
有的站点不需要给别人访问,仅提供给自己,于是就有了加密的需求
这个方法是在百度上翻到的
server {
listen 80;
server_name www.your_url.com;
auth_basic "Authorization";
auth_basic_user_file /www/server/pass/www.your_url.com.pass;
location / {
proxy_pass http://local456:port/;
}
}
.pass文件可以使用htpasswd,openssl进行生成,添加完后重新启动Nginx就可以了
当输入url进行访问时,会弹出小窗口提示需要输入账号密码进行验证,输入正确的账号密码即可访问成功
SSL部署
首先需要进行证书的申请,我选择从https://freessl.cn/进行申请

输入邮箱,选择RSA和DNS验证,进行一键申请,接着输入你的域名解析供应商的APIkey,它会自动进行解析参数的添加并在验证成功后删除
之后在KeyManager上的证书管理界面,点击证书的详情,然后再右下角点击查看PEM,对证书和私钥分别进行复制粘贴保存,分别命名为fullchain.pem和privkey.pem,上传至云
然后开始对Nginx进行修改
server {
listen 80;
listen 443 ssl;
server_name www.your_url.com;
auth_basic "Authorization";
auth_basic_user_file /www/server/pass/www.your_url.com.pass;
location / {
proxy_pass http://local456:port/;
}
ssl_certificate /path_to_pem/fullchain.pem;
ssl_certificate_key /path_to_pem/privkey.pem;
if ($server_port !~ 443){
rewrite ^(/.*)$ https://$host$1 permanent;
}
}
首先开启对443口的监听,分别在ssl_certificate和ssl_certificate_key上填写相应文件的路径,最后写个重定向,当请求非443端口时,强制重定向到443的https链接上
最后保存重启,验证是否成功
简单的Nginx防护
拦截特定UA
if ($http_user_agent ~ "Apache\-HttpClient") {
return 403;
}
或者空UA
if ($http_user_agent = '') {
return 403;
}
拦截SQL注入
if ($query_string ~* (\$|'|--|[+|(%20)]union[+|(%20)]|[+|(%20)]insert[+|(%20)]|[+|(%20)]drop[+|(%20)]|[+|(%20)]truncate[+|(%20)]|[+|(%20)]update[+|(%20)]|[+|(%20)]from[+|(%20)]|[+|(%20)]grant[+|(%20)]|[+|(%20)]exec[+|(%20)]|[+|(%20)]where[+|(%20)]|[+|(%20)]select[+|(%20)]|[+|(%20)]and[+|(%20)]|[+|(%20)]or[+|(%20)]|[+|(%20)]count[+|(%20)]|[+|(%20)]exec[+|(%20)]|[+|(%20)]chr[+|(%20)]|[+|(%20)]mid[+|(%20)]|[+|(%20)]like[+|(%20)]|[+|(%20)]iframe[+|(%20)]|[\<|%3c]script[\>|%3e]|javascript|alert|webscan|dbappsecurity|style|confirm\(|innerhtml|innertext)(.*)$) { return 555; }
来源:如何配置Nginx防止SQL注入、XSS攻击? - 幸运摩登 - 博客园 (cnblogs.com)
防盗链
location ~ .*\.(jpg|jpeg|gif|png|js|css)$
{
expires 30d;
valid_referers your_url.com;
if ($invalid_referer){
return 404;
}
}
当referer不为your_url.com的时候,资源请求直接返回404,防止外部访问
还有防CC,防外国IP访问,等等就不赘述