文章目录
  1. 1. 静态资源服务器
    1. 1.1. 静态资源及相关权限
    2. 1.2. 静态资源传输压缩
  2. 2. 反向代理
    1. 2.1. 一些使用问题
      1. 2.1.1. 413 Request Entity Too Large
  3. 3. HTTPS / TSL
    1. 3.1. 在Centos7下使用
      1. 3.1.1. 官方推荐方式
      2. 3.1.2. 其他ACME客户端

静态资源服务器

静态资源及相关权限

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
2
3
4
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent

sudo firewall-cmd --reload

查看防火墙支持协议:

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
2
3
Syntax: client_max_body_size size;
Default: client_max_body_size 1m;
Context: http, server, location

默认值为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
2
3
4
acme.sh --issue -d example.com \
-w /path/to/vhosts/root \
-d www.eample.com \
--nginx /path/to/nginx/conf/sites-available/example.com.conf

当然也可以使用DNS模式(以阿里云为例)进行

acme - aliyun domain API

  • 配置安装证书

首先修改对应站点的Nginx配置文件, 将HTTPS配置相关指令添加到server context下:

1
2
3
4
5
6
7
8
9
10
11
12
13
server {

server_name example.com www.example.com;
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl_certificate /path/to/nginx/certs/example.com/example.com.cer;
ssl_certificate_key /path/to/nginx/certs/example.com/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
......
}

具体细节配置参考官方文档

这里顺便推荐一个格式化Nginx配置文件的在线工具nginx beautifier

1
2
3
4
5
acme.sh --install-cert -d example.com \
--cert-file /path/to/nginx/certs/example.com/example.com.cer \
--key-file /path/to/nginx/certs/example.com/example.com.key \
--fullchain-file /path/to/nginx/certs/example.com/fullchain.cer \
--reloadcmd "systemctl reload nginx.service"
  • 重定向HTTP到HTTPS

由于这里值涉及到特定站点的跳转,所以只需要在站点内的Nginx配置文件中做修改即可,以下是修改内容的参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {

listen 80;
listen [::]:80;
server_name www.example.com example.com;
# redirects both www and non-www to https
return 301 https://example.com$request_uri;
}
server {

server_name example.com www.example.com;
listen 443 ssl http2;
......
}
  • 测试Nginx配置语法,重新加载新配置

/path/to/nginx -t
/path/to/ngin -s reload

文章目录
  1. 1. 静态资源服务器
    1. 1.1. 静态资源及相关权限
    2. 1.2. 静态资源传输压缩
  2. 2. 反向代理
    1. 2.1. 一些使用问题
      1. 2.1.1. 413 Request Entity Too Large
  3. 3. HTTPS / TSL
    1. 3.1. 在Centos7下使用
      1. 3.1.1. 官方推荐方式
      2. 3.1.2. 其他ACME客户端