Nginx必知必会使用方法备忘录
静态资源服务器
静态资源及相关权限
403 Forbidden应该是在配置nginx静态资源服务器中常见的错误了,这种错误最主要的原因就是文件的权限没有设置正确。
nginx在为一个静态资源文件设置静态资源访问时需要的访问权限要求是:
- 文件夹及其各级父文件夹 可读 可执行
- 文件 可读
以下命令是检查文件夹相关权限的工具命令:
1 | namei -l /var/www/vhosts/xxx.example.com/ |
下面命令是给静态资源文件夹下的静态文件设置统一的可读权限:
1 | find /var/www/vhosts/xxx.example.com/ -type f -print0 | xargs -0 chmod a+r |
可能会涉及到SELinux 相关的安全权限设置:
参考下面文档:
SELinux官方wiki
Using NGINX and NGINX Plus with SELinux
可能会涉及设置防火墙,打开 http/https 等服务:
centOS 防火墙打开对http/https协议端口限制
1 | sudo firewall-cmd --add-service=http --permanent |
查看防火墙支持协议:
1 | sudo firewall-cmd --list-all |
静态资源传输压缩
- gzip相关指令
指令 | 参数 | 说明 | 用法 |
---|---|---|---|
gzip | on / off | 打开或关闭 http 响应的gzip压缩 | gzip on |
gzip_min_length | Digit | gzip 最小压缩字节数,小于这个字节数的内容就不压缩了. 默认值20 bytes | gzip_min_length 1000 |
gzip_comp_level | gzip压缩级别 | ||
gzip_type | gzip 的支持的MIME类型 | gzip_types text/plain application/xml |
- location相关指令
指令 | 参数 | 说明 | 用法 |
---|---|---|---|
autoindex | on / off | 打开或关闭 静态资源预览 | autoindex on |
set | limit_rate | 限速 | set 100k |
官方文档链接:Compression and Decompression
反向代理
- upstream
- http proxy module
指令 | 参数 | 说明 | 用法 |
---|---|---|---|
proxy_set_header | proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; |
||
proxy_pass | proxy_pass http://localhost:8000; |
||
proxy_cache |
一些使用问题
413 Request Entity Too Large
常常出现在向服务上传文件的场景提示,主要原因是请求body的大小超出设定值,需要检查反向代理和应用服务器的相关设置,反向代理Nginx的directive为:client_max_body_size
1 | Syntax: client_max_body_size size; |
默认值为1M,可以根据需要在对应的context设置合理的值即可。
HTTPS / TSL
支持HTTPS需要向CA机构申请证书,根据证书类型(DV、OV、EV)的不同和CA机构的情况会有免费和付费的证书选择,下文会对申请Let’s Encrypt免费DV证书进行说明。
在Centos7下使用
官方推荐方式
- 安装certbot
sudo yum install epel-release
sudo yum install certbot python2-certbot-nginx
- 使用certbot配置证书
certbot --nginx --nginx-root-path=/path/to/nginx/conf -d xxx.example.com
- 设置定时任务自动更新证书有效期
crontab -e
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew
验证renew操作
certbot renew --dry-run
删除现有配置,重新生成证书
certbot revoke --cert-path /etc/letsencrypt/live/CERTNAME/cert.pem
然后将配置文件恢复回certbot修改之前的版本,重新重复上面的配置证书步骤即可
其他ACME客户端
官方文档ACME 客户端
这里选择的是BASH实现的acme.sh
- 安装
需要在root用户下安装,免去后续关于renew 权限的问题
sudo su
curl https://get.acme.sh | sh
安装成功后关闭并重启当前命令行,使配置生效。
- 申请证书
当然申请证书之前需要有一个有完全访问权限的web server,以及正确域名指向、运行的http网站。
1 | acme.sh --issue -d example.com \ |
当然也可以使用DNS模式(以阿里云为例)进行
- 配置安装证书
首先修改对应站点的Nginx配置文件, 将HTTPS配置相关指令添加到server context下:
1 | server { |
具体细节配置参考官方文档
这里顺便推荐一个格式化Nginx配置文件的在线工具nginx beautifier
1 | acme.sh --install-cert -d example.com \ |
- 重定向HTTP到HTTPS
由于这里值涉及到特定站点的跳转,所以只需要在站点内的Nginx配置文件中做修改即可,以下是修改内容的参考:
1 | server { |
- 测试Nginx配置语法,重新加载新配置
/path/to/nginx -t
/path/to/ngin -s reload