01.Docker部署-Nignx
Nginx 是一个开源的高性能 Web 服务器和反向代理服务器,也可以作为负载均衡器、HTTP 缓存以及邮件代理服务器使用。它最初由俄罗斯程序员 Igor Sysoev 开发,目的是解决 C10k 问题(即如何让服务器同时处理成千上万个并发连接)。如今,Nginx 被广泛应用于全球各类网站,尤其适用于高并发、高负载的场景。
Nginx 的常见用途¶
- Web 服务器:
Nginx 可以作为独立的 Web 服务器提供静态内容服务,并支持 PHP、Python、Java 等动态内容的处理(通常通过 FastCGI 或代理到后端应用服务器)。
- 反向代理服务器:
在多层架构中,Nginx 作为反向代理服务器,用于将客户端请求转发到多个应用服务器,并在其中承担负载均衡和缓存等功能。
- 负载均衡器:
Nginx 是流行的负载均衡解决方案,支持多种负载均衡策略,确保 Web 应用的高可用性和可扩展性。 4. API 网关:
在微服务架构中,Nginx 可以作为 API 网关,集中管理 API 请求并提供负载均衡、认证、安全控制等功能。
- SSL 终端:
Nginx 支持 SSL 证书的处理,可以作为 SSL 终端,解密 HTTPS 流量,然后将解密后的流量转发给后端服务器。
- 缓存加速:
利用 Nginx 的缓存功能,可以减轻后端服务器负担并加速用户的请求响应时间。
Docker-Compose 部署¶
version: "3.8"
services:
web:
container_name: nginx
image: nginx
ports:
- 80:80
- 443:443
deploy:
resources:
limits:
memory: 100M # 设置最大内存
cpus: "0.5" # 限制容器使用 1 个 CPU 核心
reservations:
memory: 50M # 设置预留内存
cpus: "0.5" # 设置 CPU 预留(预留 0.5 个 CPU 核心
volumes:
- ./html:/usr/share/nginx/html
- ./conf/nginx.conf:/etc/nginx/nginx.conf
- ./conf.d:/etc/nginx/conf.d
- ./logs:/var/log/nginx
restart: always
networks:
- web_net
networks:
web_net:
external: true
先手动新建onf/nginx.conf
文件,如果这个内容启动不了, 可以不映射Volumes,先运行容器,然后进入Nginx容器内取出这个文件内容,手动新建之后再打开Volumes映射。
nginx.conf
文件内容如下:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name 你的域名.cn;
location / {
root /usr/share/nginx/html/;
index index.html index.htm;
}
}
# HTTPS server
server {
listen 443 ssl;
server_name selfteachingroad.cn;
ssl_certificate /etc/nginx/conf.d/cert/你的域名证书.pem;
ssl_certificate_key /etc/nginx/conf.d/cert/你的域名证书.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:1m;
fastcgi_param HTTPS on;
fastcgi_param HTTP_SCHEME https;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
}
}
# 引入扩展配置(可以细分服务nginx)
include /etc/nginx/conf.d/*.conf;
}
Nginx 配置多个静态网页站(子目录方式实现)¶
建立一个网站都要申请域名,如果在国内服务器,都要进行备案,备案的流程有点麻烦,所以一般拿到一个域名之后,就用这个域名进行多个网站项目的部署。
比如我申请了 yanggenjie.cn
这个域名,访问这个域名是我的主站,但是有时候有些文档我也想部署在线访问,一般都不会再去申请一个域名了,直接在这个域名之后加上子目录,比如https://yanggenjie.cn/wiki/HintCAD/,这种访问,或者子域名,比如: https://wiki.yanggenjie.cn。这样,但子域名的操作也是需要自己添加解析,还要申请SSL证书,比如申请泛域名的SSL证书,才能用https访问,操作起来也比较麻烦。(当然,有NginxProxyManager之后,这些麻烦都将不复存在)
二级目录的这种方式,只要主域名能正常访问,那只需要修改 Nginx 的配置,就能直接访问了。一般都不需要做过多的配置。
接下来,就说一下我的 Nginx 如何配置的二级目录(Nginx 是跑在 Docker 容器内的)。
html 是网站根目录,html 目录结构如下
|-- wiki
| |-- HintCAD
| `-- rstSyntax
`-- yanggenjie.cn
|-- 404.html
|-- about
|-- assets
|-- BIM\345\274\200\345\217\221
|-- blog
|-- index.html
|-- python
|-- search
|-- sitemap.xml
|-- sitemap.xml.gz
|-- \345\215\232\345\256\242\346\212\200\346\234\257
`-- \345\267\245\345\205\267
主站资源文件是放在 yanggenjie.cn 这个文件夹的,然后笔记文件单独放在 wiki 下的每个单独文件夹。
然后,Nginx 配置内容如下:
server {
listen 80;
server_name localhost;
# 强制https跳转
# return 301 https://$server_name$request_uri;
location / {
root /usr/share/nginx/html/yanggenjie.cn;
index index.html index.htm;
}
location /wiki/HintCAD {
alias /usr/share/nginx/html/wiki/HintCAD/;
index index.html;
}
location /wiki/rstSyntax {
alias /usr/share/nginx/html/wiki/rstSyntax/
index index.html;
}
}
第一个 location 是指,当我访问:yanggenjie.cn,后面什么都不带的时候,就去访问 html/yanggenjie.cn 这个文件夹下的所有内容
第二个 location 就是二级目录的设置了,指的是,当我访问 yanggenjie.cn/wiki/HintCAD/时,就会去访问/usr/share/nginx/html/wiki/HintCAD/下的资源。
这样配置的话,就可以用二级目录来访问不同的资源了,
注意¶
注意,配置 location 时,链接代/和不带/,意义完全不一样。这里都要带上/才能正确访问。
这里有两个地方带斜杠和不带斜杠,一个是 location 外的路径,一个是 location 块内的 alias 路径
# 1.location后面的链接不带斜杠
# 访问的链接就可以写成:https://yanggenjie.cn/wiki/HintCAD
location /wiki/HintCAD {
}
# 2.location后面的链接带斜杠
# 访问链接的后面就必须带斜杠:https://yanggenjie.cn/wiki/HintCAD/,不带斜杠就访问不到
location /wiki/HintCAD/ {
}
# 3. location块内的内容中,alias路径不带斜杠
# 就说明当访问xx.cn/wiki/HintCAD这个路径时,实际会跳转到:alias+xx路径去找资源
# 即到服务器的/usr/share/nginx/html/wiki/HintCAD/wiki/HintCAD目录下寻找
# 这个路径一般都不是我们想要的
location /wiki/HintCAD {
alias /usr/share/nginx/html/wiki/HintCAD;
index index.html;
}
# 4.location块内,alisa带斜杠
# 就说明当访问xx.cn/wiki/HintCAD这个路径时,
# 会去服务器的/usr/share/nginx/html/wiki/HintCAD/目录下寻找资源
# 这个路径一般就是我们想要的
location /wiki/HintCAD {
alias /usr/share/nginx/html/wiki/HintCAD/;
index index.html;
}
# 这里应该是有个小坑,就是location的匹配链接是/wiki/HintCAD,
# 那么你alisa创建的目录最好也是要有wiki/HintCAD的目录结构
# 这个目录结构否则可能也会出现访问失效的情况
# 这个和1、2情进行组
# 这个表示,当访问https://yanggenjie.cn/wiki/HintCAD时,
# 会去服务器的/usr/share/nginx/html/wiki/HintCAD/wiki/HintCAD目录下寻找资源
# 注意我这里没有打错,就是有两个/wiki/HintCAD这个路径,第一个是alias路径,第二个是location块匹配的路径
location /wiki/HintCAD {
alias /usr/share/nginx/html/wiki/HintCAD;
index index.html;
}
# 这个访问https://yanggenjie.cn/wiki/HintCAD/时
# 资源同样是去服务器/usr/share/nginx/html/wiki/HintCAD/wiki/HintCAD目录下找资源
location /wiki/HintCAD/ {
alias /usr/share/nginx/html/wiki/HintCAD;
index index.html;
}
# 4. location块内的内容中,alias路径带斜杠
location /wiki/HintCAD {
alias /usr/share/nginx/html/wiki/HintCAD/;
index index.html;
}
# 这个表示访问https://yanggenjie.cn/wiki/HintCAD时,
# 会去服务器的/usr/share/nginx/html/wiki/HintCAD/目录下找资源。这个一般才是我们想要的效果
location /wiki/HintCAD/ {
alias /usr/share/nginx/html/wiki/HintCAD/;
index index.html;
}
# 这个表示访问https://yanggenjie.cn/wiki/HintCAD/时,(这个链接带有/)
# 会去服务器的/usr/share/nginx/html/wiki/HintCAD/目录下找资源。这个一般才是我们想要的效果
至此,按这种写法进行配置,一般就能正常访问了。