服务器拆分方案
- web服务器:一般用来处理一些静态资源,如CSS、JS文件等
- data服务器:存放数据,以及用来处理一些业务请求,如各种业务接口
- 图片服务器:用来处理一些图片、视频的资源
负载均衡
参考:
https://www.cnblogs.com/muhy/p/10528338.html
https://www.jianshu.com/p/ab7cf5484e8f
简易图片服务器配置
配置步骤
1.在nginx.conf
文件的server中添加配置如下:
server {
...
# 解决中文文件乱码问题
charset utf-8;
location /images/ {
# 访问路径
alias g:/img/;
# 后面是本地存储图片的映射路径,最后面的/别漏了
autoindex on;
# 加上这行代表访问:http://127.0.0.1/images/时允许显示图片列表
}
...
}
2.在命令行输入命令:nginx -s reload
,重启nginx服务器
3.访问:http://127.0.0.1/images/1.jpg,则会访问到该目录下的1.jpg
图片;访问:http://127.0.0.1/images/,则可以看到该目录下的图片列表
参考:
https://blog.csdn.net/qq_23974323/article/details/80067250
登录校验
- 如针对
html
文件需要登录校验:
location /resource/ {
# 非html的情况下,无需验证
if ($request_uri !~* /(.*)\.html) {
set $auth_basic off;
}
# html的情况下,提示需验证
if ($request_uri ~* /(.*)\.html) {
set $auth_basic "User Authentication";
}
# 密码文件路径(在不使用加密工具的情况下,文件内容为:username:password即可)
auth_basic_user_file pwd/pwd;
# 根据前面设置的变量决定是否验证
auth_basic $auth_basic;
alias g:/resource/;
autoindex on;
}
协议相关
HTTPS配置
- 生成证书密钥,证书生成命令如下:
openssl req -x509 -newkey rsa:2048 -nodes -sha256 -keyout privkey.pem -out cert.pem
执行成功后将生成privkey.pem
和cert.pem
文件,这个是我们自己生成的证书,到时候访问https页面将会有不安全提示。如果想提示安全,可以去certbot、阿里云之类的签发机构获取免费签发的证书
- nginx配置如下:
server {
listen 443 ssl;
# 改为监听443端口,并配置ssl
server_name localhost;
ssl_certificate_key certs/privkey.pem;
ssl_certificate certs/cert.pem;
# 配置证书密钥,路径是conf下的相对路径
location / {
proxy_pass http://127.0.0.1:5000; # 配置反向代理
proxy_set_header Host $host;
}
...
}
- 配置访问http自动跳转https:
server {
listen 80;
server_name 127.0.0.1;
return 302 https://$server_name$request_uri;
}
参考:https://10.linuxstory.net/deploy-lets-encrypt-ssl-certificate-with-certbot/
阿里云证书参考:https://blog.csdn.net/u012557538/article/details/80389071
HTTP2配置
只需要在https的配置基础上,把监听443端口的那一行修改如下:
listen 443 ssl http2;
举例:
server {
listen 443 ssl http2;
# 配置http2
server_name localhost;
client_max_body_size 10m;
http2_push_preload on;
# 配置支持推送
ssl_certificate_key certs/localhost-privkey.pem;
ssl_certificate certs/localhost-cert.pem;
}
后端相关
缓存配置
在对应location
下添加缓存配置即可,如配置不要缓存:
add_header Cache-Control no-store;
注:
在Nginx中配置的缓存是代理缓存,其和客户端http请求时配置的缓存不太一样:客户端配置的缓存是当前客户端第一次请求过后,只有当前客户端会增加的缓存,而其他客户端第一次请求时,还是没缓存的;代理缓存是当一个客户端向代理请求以后,以后任何客户端访问这个代理都有缓存
动静分离配置
即将动态请求和静态资源请求分开,举例:
location / {
# 动态请求走这里
proxy_pass http://server1; # 默认配置PC端页面反向代理
}
location /static/~(.*)(\.jpg|\.png|\.gif|\.jepg|\.css|\.js|\.css){
# 静态资源请求走这里
root html/dist/static/;
}
GZip压缩配置
http {
# ...
gzip on; # 开启gzip
gzip_static on; # 如果对应资源存在gz文件,则直接返回(一般前端打包会对css/js文件压缩生成gz文件,然后搭配该配置使用)
gzip_comp_level 4; # 压缩等级(0-9),等级越高压缩率越高,越耗CPU(一般配置4-6就差不多了,再高了提升可能不明显)
gzip_vary on; # response里告知使用了gzip
gzip_types text/plain application/json application/x-javascript application/css application/xml application/xml+rss text/javascript application/x-httpd-php image/jpeg image/gif image/png image/x-ms-bmp;
# gzip会匹配到这些mimetype才进行压缩
# ...
}
更多相关字段参考:
https://www.huaweicloud.com/articles/acaf8a97036327a68166bab375aa03a8.html
https://segmentfault.com/a/1190000020978410
websocket支持配置
http {
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream server1 {
server 127.0.0.1:8000;
}
server {
location / {
proxy_pass http://server1;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
}
HTTP2服务端推送配置
参考:http://www.ruanyifeng.com/blog/2018/03/http2_server_push.html
前端相关
静态文件去除后缀名配置
location / {
if (!-e $request_filename){
rewrite ^(.*)$ /$1.html last;
break;
}
}
移动端/PC端适配配置
如果希望用户通过移动端或PC端访问时分别展示两套不同的页面,可以在nginx里通过条件判断,进行不同的反向代理,举例:
server {
...
location / {
...
proxy_pass http://127.0.0.1:5000; # 默认配置PC端页面反向代理
if ( $http_user_agent ~* "(Android|iPhone|Windows Phone|UC|Kindle)" ){
proxy_pass http://127.0.0.1:8000; # 配置移动端页面反向代理
}
...
}
}
如果配置的是两套静态前端,那么可以根据条件判断改变root
目录来实现,举例:
server {
...
location / {
...
root html/pc; # pc端项目入口
index index.html;
if ( $http_user_agent ~* "(Android|iPhone|Windows Phone|UC|Kindle)" ){
root html/mobile; # 移动端项目入口
}
...
}
}
vue-router的history模式兼容配置
location / {
root html/xxx/;
try_files $uri $uri/ /index.html;
}
常用配置参考
常用模块参考
其他参考
错误参考
nginx: [error] OpenEvent("Global\ngx_reload_16944") failed (2: The system cannot find the file specified)
没有启动nginx
bind() to 0.0.0.0:443 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions
通过下面命令找出占用443端口的程序,关闭它:
netstat -aon|findstr "443"