黑马点评项目在开发环境中使用了Windows版的nginx,当你要将其部署到Linux服务器上时,你需要重新下载适用于Linux系统的nginx版本。Windows和Linux系统之间存在底层架构和可执行文件格式的差异,因此不能直接将Windows上的nginx文件用于Linux服务器。
我在服务器端使用了docker快速部署了nginx容器,但是前端项目和配置文件都需要进行修改,下面就是我修改的思路历程。
一、上传本机nginx文件
1.上传nginx.conf文件
上传nginx.conf文件到自定义目录,我将整个这里nginx-1.18.0上传到了 /home/user/ 文件夹下
如果使用宝塔面板下载好的nginx,需要在其目录自行修改这些文件。如果和我一样使用docker容器里的nginx就不需要去改了。
nginx.conf
# 设置工作进程数,一般设置为服务器CPU核心数worker_processes 1;# 设定NGINX的工作模式及连接数上限events { worker_connections 1024; # 单个进程最大连接数}http { # 文件扩展名与MIME类型映射 include mime.types; # 默认类型为json,适合API接口响应 default_type application/json; # 开启高效文件传输模式 sendfile on; # 连接保持超时时间 keepalive_timeout 65; # 配置服务器块 server { # 监听端口 listen 8080; # 服务器域名或IP server_name localhost; # 静态资源服务配置,指定前端项目目录 location / { root html/hmdp; # 前端资源根目录 index index.html index.htm; # 默认主页文件 } # 错误页面处理 error_page 500 502 503 504 /50x.html; location = /50x.html { root html; # 错误页面文件所在目录 } # API接口反向代理配置 location /api { # 设置默认响应类型为json default_type application/json; # 支持长连接,优化性能 keepalive_timeout 30s; keepalive_requests 1000; # 配置以支持HTTP/1.1的Keep-Alive特性 proxy_http_version 1.1; # 重写URL去掉/api前缀 rewrite /api(/.*) $1 break; # 传递请求头到后端服务器 proxy_pass_request_headers on; # 当后端服务器出现问题时的重试逻辑配置(此处被注释,表示使用默认) # proxy_next_upstream error timeout; # 将/api开头的请求代理到后端服务器集群,使用backend定义的服务器列表 proxy_pass http://backend; } } # 后端服务器集群配置 upstream backend { # 配置两台后端服务器,端口分别为8081和8082,具备故障转移和负载均衡能力 server 127.0.0.1:8081 max_fails=5 fail_timeout=10s weight=1; # 最大失败次数、失败后暂停时间、权重 server 127.0.0.1:8082 max_fails=5 fail_timeout=10s weight=1; } }
2.上传前端项目
如果上一步已经将本地的整个nginx文件夹上传到了服务器,那么这一步也不用做。
使用宝塔面板下载好的nginx,需要在其目录里自行添加前端项目。
将本地的html整个文件目录上传到 /server/nginx/
这样nginx需要的文件基本都有了。
3.阶段总结
nginx.conf
是 Nginx 服务器的主要配置文件,它定义了服务器的全局和局部配置设置,用于控制 Nginx 如何处理请求、如何与其他服务交互以及如何提供静态内容或代理到后端服务器等。
Nginx 配置文件主要包括以下几个核心部分,我们可以结合您提供的配置示例来具体说明:
1. 全局配置
- worker_processes: 指定 Nginx 工作进程的数量。例如:
worker_processes 1;
2. 事件处理模型配置 (events
)
- worker_connections: 每个工作进程可以同时打开的最大连接数。
events { worker_connections 1024;}
3. HTTP配置 (http
)
3.1 MIME类型和默认类型
- include: 引入MIME类型配置文件
-
http { include mime.types; default_type application/json;}
3.2 文件传输和连接保持
- sendfile: 开启高效文件传输模式
-
sendfile on; keepalive_timeout 65;
4. 服务器块 (server
)
4.1 监听与服务器名称
- listen: 指定服务器监听的端口
-
server { listen 8080; server_name localhost;}
4.2 静态资源服务
- location: 配置如何处理特定的URL路径请求。
location / { root html/hmdp; # 静态文件根目录 index index.html index.htm; # 默认首页文件 }
4.3 错误页面处理
- error_page: 定义错误状态码对应的自定义错误页面。
error_page 500 502 503 504 /50x.html; location = /50x.html { root html; }
4.4 反向代理和负载均衡
- location: 配置反向代理到后端服务器。
- proxy_pass: 指定后端服务器地址。
- upstream: 定义一组后端服务器。
location /api { proxy_pass http://backend; # ...其他反向代理配置 } upstream backend { server 127.0.0.1:8081 max_fails=5 fail_timeout=10s; server 127.0.0.1:8082 max_fails=5 fail_timeout=10s; }
5. 日志配置
虽然您提供的配置示例中没有直接展示日志配置,但通常Nginx配置还会包括错误日志和访问日志的配置,例如:
http { access_log /var/log/nginx/access.log combined; error_log /var/log/nginx/error.log warn; # ...}
以上就是Nginx配置文件中一些核心部分的介绍及示例,实际配置会根据应用场景更加复杂和详细,包括但不限于Gzip压缩、SSL/TLS证书配置、缓存设置、限流策略等。
二、运行nginx容器
如果是服务器里的nginx,在其所在目录的命令行输入以下命令,重新加载nginx配置,使其生效。
nginx -s reload
如果使用docker容器,那么就这样操作:使用最新版应该无妨
docker pull nginx:1.18.0
确保下载好images
运行如下命令:我的目录在/home/user/nginx-1.18.0,如果自定义需要替换
docker run -d -p 8080:8080 -v /home/user/nginx-1.18.0/html/hmdp:/etc/nginx/html/hmdp -v /home/user/nginx-1.18.0/html:/etc/nginx/html -v /home/user/nginx-1.18.0/conf/nginx.conf:/etc/nginx/nginx.conf nginx:1.18.0
查看运行容器情况
docker ps
如果没有则,检查是否意外exit
docker ps -a
并查看日志
docker logs 容器ID/name
运行成功
前端可以正常访问。
出现的错误:
1.容器以为端口被占用退出。
如果8080端口被占用:
那就是服务器里的nginx服务占用了8080端口,需要找到占用的进程ID,并且kill掉
查看端口占用:
netstat -ntulp | grep 8080
找到对应进程,kill掉
kill进程:
sudo kill 进程ID# 如果kill命令不起作用,尝试强制终止sudo kill -9 进程ID
如果重启容器还是不行,那就说明依然有进程占用80端口,没有kill完,继续找对应进程ID,kill!
2.容器端口配置异常
检查nginx容器日志输出,查看原因
docker logs 容器ID/name
如果nginx正常启动,访问8080端口,没有任何反应,应该考虑端口是否匹配,和防火墙是否开放
这个项目里nginx配置文件nginx.conf中配置了,监听了8080端口,所以检查nginx.conf是否正确,docker容器启动配置的是否正确,防火墙端口是否开放。
server { # 监听端口 listen 8080; #.....}
8080:8080 (宿主机端口:容器端口)
防火墙确认打开
3.启动容器时挂载文件夹配置异常
-v /home/user/nginx-1.18.0/html:/etc/nginx/html(宿主机上的目录路径:容器内的目录路径)
Nginx试图访问的路径是/etc/nginx/html/hmdp/index.html,确保路径正确
# -v /home/user/nginx-1.18.0/html:/usr/share/nginx/html-v /home/user/nginx-1.18.0/html:/etc/nginx/html
需要仔细修改:
docker run -d -p 8080:8080 -v /home/user/nginx-1.18.0/html/hmdp:/etc/nginx/html/hmdp -v /home/user/nginx-1.18.0/html:/etc/nginx/html -v /home/user/nginx-1.18.0/conf/nginx.conf:/etc/nginx/nginx.conf nginx:1.18.0