网站启用https,就需要配置数字证书。不想被探测器扫描,就禁止通过IP访问。
1. 安装,启动,停止,加载
以 centos7 为例
1 2 3 4 5 6 7 8 9 10 11
| # 安装 yum install nginx
# 启动 nginx
# 停止 nginx -s stop
# 加载配置文件 nginx -s reload
|
2. 修改默认显示内容
nginx默认的首页,404,500等页面的显示内容太多了,容易暴露服务器信息,可以将 index.html, 404x.html, 500x.html 替换成自定义的文件,默认目录为 /usr/share/nginx/html。
3. 添加数字证书
修改 /etc/nginx/nginx.conf文件,然后将443端口的证书配置注释去掉,再将证书文件拷贝到相应目录,然后执行 nginx -s reload 即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; server_name _; root /usr/share/nginx/html;
ssl_certificate "/etc/pki/nginx/server.crt"; ssl_certificate_key "/etc/pki/nginx/private/server.key"; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on;
# Load configuration files for the default server block. include /etc/nginx/default.d/*.conf;
location / { proxy_pass http://localhost:4000; }
|
4. 禁止通过ip直接访问网站
如果不想服务器被扫描器探测,可以禁止通过IP访问网站。
修改 nginx.conf 文件,添加一个 server,注意不是修改原 server。
新增一个server配置,这里将 80 和 443 写在了一起,也可以分开写。
1 2 3 4 5 6 7 8 9 10 11 12 13
| # forbidden ip:port access server { listen 80 default; listen 443 ssl http2 default_server; ssl_certificate "/etc/pki/nginx/server.crt"; ssl_certificate_key "/etc/pki/nginx/private/server.key"; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; server_name _; return 403; }
|
修改原server,将 server_name _ 更改为 server_name yourdomain.com;
1 2 3 4 5
| # 修改原server server { listen 443; # 只保留443, 去掉 ssl http2 default_server; listen [::]:443 ssl http2 default_server; server_name yourdomain.com;
|
然后执行 nginx -s reload 重新加载配置即可。
5. http跳转到https
鉴于http越来越不安全,可以添加http跳转,在用户通过http访问的时候,自动跳转到 https。
这里采用 return 301 重定来实现。
1 2 3 4 5
| server { listen 80; server_name yourdomain.com; return 301 https://$server_name$request_uri; }
|
网络上还有 rewrite 和 error_page 的方法,rewrite已不推荐,而 error_page 方法我测试并未生效,详情可参考这篇文章。
6. no-www与www
是用户访问网站的时候,有 www 和没有 www 都显示一样的效果。
因为我的域名比较长,这里以有 www 跳转到 无 www 为例。
在配置中新增一个server,可以把80和443配置在一起,当然也可以分开,更详细内容可参考这篇文章。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # www.example.com redirect example.com server { listen 80; listen 443 ssl; ssl_certificate "/etc/pki/nginx/server.crt"; ssl_certificate_key "/etc/pki/nginx/private/server.key"; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; server_name www.yourdomain.com; return 301 https://yourdomain.com$request_uri; }
|
7. 去掉 nginx 的版本号
在响应数据的header中会显示nginx的版本号,如果不想显示,可以在配置文件中添加 server_tokens 配置。
1 2 3 4
| # /etc/nginx/nginx.conf
http { server_tokens off;
|
加在 http 下面会全部隐藏,如果你想80端口隐藏,443端口不隐藏,那么把这个配置添加在 server 下面。
8. 调整日志格式
修改 nginx.conf 中的 log_format,即可对 nginx 日志进行格式调整。
默认格式
1 2 3 4 5
| log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
|
调整后
1 2 3 4 5 6
| log_format main '{"time": "$time_local", "status": $status, "remote_addr": "$remote_addr", ' '"request": "$request", "body_bytes_sent": $body_bytes_sent, ' '"request_time": $request_time, "http_referer": "$http_referer", ' '"user_agent": "$http_user_agent"}';
access_log /var/log/nginx/access.log main;
|
有些不可见字符,在 json 里面显示不友好,可以再调整一下
1 2 3
| log_format main '$time_local | $status | $remote_addr | "$request" | ' '"$http_referer" | "$http_user_agent" | ' '$body_bytes_sent | $request_time';
|