centos7 nginx location 配置
nginx 安装
yum install -y epel-release
yum install nginx -y
systemctl start nginx
systemctl enable nginx
/etc/nginx/nginx.conf 在http节点下面添加 map 并注释掉 默认监听的80端口
参考 https://docs.microsoft.com/en-us/aspnet/core/signalr/scale?view=aspnetcore-6.0#linux-with-nginx
http { map $http_connection $connection_upgrade { "~*Upgrade" $http_connection; default keep-alive; } 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; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 4096; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; # server { # listen 80; # listen [::]:80; # server_name _; # root /usr/share/nginx/html; # # # Load configuration files for the default server block. # include /etc/nginx/default.d/*.conf; # # error_page 404 /404.html; # location = /404.html { # } # # error_page 500 502 503 504 /50x.html; # location = /50x.html { # } # } # Settings for a TLS enabled server. # # server { # listen 443 ssl http2; # listen [::]:443 ssl http2; # 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; # # error_page 404 /404.html; # location = /40x.html { # } # # error_page 500 502 503 504 /50x.html; # location = /50x.html { # } # } }
新建文件 vim /etc/nginx/conf.d/xxxxx.conf
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name bashi.win;
ssl_certificate /etc/letsencrypt/live/bashi.win/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/bashi.win/privkey.pem;
location / {
try_files $uri $uri/ /index.html;
root /var/www/bashi;
index index.html index.htm;
}
# Configure the SignalR Endpoint
location /api/ {
# App server url
proxy_pass http://localhost:8800/;
# Configuration for WebSockets
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_cache off;
# WebSockets were implemented after http/1.0
proxy_http_version 1.1;
# Configuration for ServerSentEvents
proxy_buffering off;
# Configuration for LongPolling or if your KeepAliveInterval is longer than 60 seconds
proxy_read_timeout 100s;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 80;
server_name bashi.win;
return 301 https://$server_name$request_uri;
}
location编辑及解释
在nginx中配置proxy_pass代理转发时,如果在proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分也给代理走。
假设下面四种情况分别用 http://192.168.1.1/proxy/test.html 进行访问。
第一种:
location /proxy/ {
proxy_pass http://127.0.0.1/;
}
代理到URL:http://127.0.0.1/test.html
第二种(相对于第一种,最后少一个 / )
location /proxy/ {
proxy_pass http://127.0.0.1;
}
代理到URL:http://127.0.0.1/proxy/test.html
第三种:
location /proxy/ {
proxy_pass http://127.0.0.1/aaa/;
}
代理到URL:http://127.0.0.1/aaa/test.html
第四种(相对于第三种,最后少一个 / )
location /proxy/ {
proxy_pass http://127.0.0.1/aaa;
}
代理到URL:http://127.0.0.1/aaatest.html
try_files $uri $uri/ /index.html;
Let's Encrypt 使用教程,免费的SSL证书
https://diamondfsd.com/lets-encrytp-hand-https/
1. godaddy买域名后 解析域名到你服务器ip
先关闭nginx
systemctl stop nginx
Let’s Encrypt 简介
如果要启用HTTPS,我们就需要从证书授权机构(以下简称CA) 处获取一个证书,Let’s Encrypt 就是一个 CA。我们可以从 Let’s Encrypt 获得网站域名的免费的证书。这篇文章也主要讲的是通过 Let’s Encrypt + Nginx 来让网站升级到HTTPS。
Certbot 简介
Certbot 是Let’s Encrypt官方推荐的获取证书的客户端,可以帮我们获取免费的Let’s Encrypt 证书。Certbot 是支持所有 Unix 内核的操作系统的,个人博客的服务器系统是CentOS 7,这篇教程也是通过在个人博客上启用HTTPS的基础上完成的。
获取免费证书
- 安装Certbot客户端
yum install certbot
- 获取证书
certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com
这个命令会为 example.com 和 www.example.com 这两个域名生成一个证书,使用
--webroot
模式会在/var/www/example
中创建.well-known
文件夹,这个文件夹里面包含了一些验证文件,certbot 会通过访问 example.com/.well-known/acme-challenge 来验证你的域名是否绑定的这个服务器。这个命令在大多数情况下都可以满足需求,
但是有些时候我们的一些服务并没有根目录,例如一些微服务,这时候使用 --webroot
就走不通了。certbot 还有另外一种模式 --standalone
, 这种模式不需要指定网站根目录,他会自动启用服务器的443端口,来验证域名的归属。我们有其他服务(例如nginx)占用了443端口,就必须先停止这些服务,在证书生成完毕后,再启用。
certbot certonly --standalone -d example.com -d www.example.com
证书生成完毕后,我们可以在 /etc/letsencrypt/live/
目录下看到对应域名的文件夹,里面存放了指向证书的一些快捷方式。
这时候我们的第一生成证书已经完成了,接下来就是配置我们的web服务器,启用HTTPS。
Nginx 配置启用 HTTPS
看上面nginx配置
自动更新 SSL 证书
配置完这些过后,我们的工作还没有完成。 Let’s Encrypt 提供的证书只有90天的有效期,我们必须在证书到期之前,重新获取这些证书,certbot 给我们提供了一个很方便的命令,那就是 certbot renew
。 通过这个命令,他会自动检查系统内的证书,并且自动更新这些证书。 我们可以运行这个命令测试一下
certbot renew --dry-run
我在运行的时候出现了这个错误
Attempting to renew cert from /etc/letsencrypt/renewal/api.diamondfsd.com.conf produced an unexpected error: At least one of the required ports is already taken.. Skipping.
这是因为我的api.diamondfsd.com生成证书的时候使用的是 --standalone
模式,验证域名的时候,需要启用443端口,这个错误的意思就是要启用的端口已经被占用了。 这时候我必须把nginx
先关掉,才可以成功。果然,我先运行 service nginx stop
运行这个命令,就没有报错了,所有的证书都刷新成功。
证书是90天才过期,我们只需要在过期之前执行更新操作就可以了。 这件事情就可以直接交给定时任务来完成。linux 系统上有 cron
可以来搞定这件事情。 我新建了一个文件 certbot-auto-renew-cron
, 这个是一个 cron
计划,这段内容的意思就是 每隔 两个月的 凌晨 2:15 执行 更新操作。
15 2 * */2 * certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start"
--pre-hook
这个参数表示执行更新操作之前要做的事情,因为我有 --standalone
模式的证书,所以需要 停止 nginx
服务,解除端口占用。 --post-hook
这个参数表示执行更新操作完成后要做的事情,这里就恢复 nginx
服务的启用
最后我们用 crontab
来启动这个定时任务
crontab certbot-auto-renew-cron
至此,整个网站升级到HTTPS就完成了。 总结一下我们需要做什么
- 获取Let’s Encrypt 免费证书
- 配置Nginx开启HTTPS
- 定时刷新证书
鸣谢 Let’s Encrypt 组织以及所有该组织的贡献者支持者 为我们提供 免费的安全证书。