文章目录
安装
直接上sh脚本。包源:
- rpm包地址:
http://nginx.org/packages/
- win和二进制包地址:
https://nginx.org/en/download.html
vi install_nginx.sh
#!/bin/bash
# 安装和更新基本库
sudo yum update
sudo yum install pcre2
# 检查是否以root用户运行脚本
if [ "$(id -u)" != "0" ]; then
echo "错误:请使用root用户运行此脚本"
exit 1
fi
rpm -ivh http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.24.0-1.el7.ngx.x86_64.rpm --force --nodeps
# 更新软件包缓存
# yum update -y
# 安装Nginx包
# yum install nginx
# 启动Nginx服务
systemctl start nginx
systemctl enable nginx
- 复制脚本,并起名
install_nginx.sh
。直接怼进去 - 赋予权限:
chmod +x install_nginx.sh
- 执行脚本:
./install_nginx.sh
- 查看版本
nginx -v
配置文件介绍
1. 先进入安装目录,找到默认配置文件
cd /etc/nginx
2. 打开默认配置
vi nginx.conf
3. 调整一下,改成如下配置,这里需要注意一下http的日志路径,和全局的异常日志路径
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
use epoll; # 使用epoll模型
multi_accept on; # 尽可能多的接受连接
worker_connections 65535;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '[$time_local] - [$scheme://$host$request_uri $status $request_method] - [$remote_addr] - [$http_host] - '
'[$upstream_addr - $upstream_status] ';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
stream {
include /etc/nginx/tcp.conf.d/*.conf;
}
- 剩下的就简单了,只需要在conf.d文件夹下面创建自己想要的配置。例如我这里创建一个监听域名为
ceshi.csym.com
的请求,来跟着走
cd conf.d
vi ceshi.csym.com
把下面的内容给我怼进去
server {
server_name ceshi.csym.com; # 监听的目标域名
listen 80;
listen 443 ssl;
access_log /var/log/nginx/ceshi.csym.com.log main; # 这里可以单独指定日志
# 证书相关
ssl_certificate conf.d/ssl/ceshi.csym.com.pem; # 秘钥
ssl_certificate_key conf.d/ssl/ceshi.csym.com.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;
# 压缩,提高web页面访问速度
gzip on;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
keepalive_timeout 600;
client_max_body_size 1G;
proxy_read_timeout 600;
# 默认请求地址,/ 也就是域名本身访问的时候,一般指向前端页面
location / {
root /usr/share/nginx/html/ceshi; # ceshi代表分包名
index index.html;
# 解决刷新404问题
try_files $uri $uri/ /index.html;
}
# location / {
# return 301 https://www.baidu.com$; # 永久重定向到百度
# }
# 请求地址是http://ceshi.csym.com/server/ 的时候执行的代码块,这里是代理到https://127.0.0.1:8444/。注意,如果Nginx做了ssl,这里可以是http
location /server/ {
proxy_pass https://127.0.0.1:8444/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# Websocket 支持,如果Nginx做了ssl,这里会自动升级为wss.如果是netty等框架单独写的websocket,可以单独开一个代码块,也能升级wss
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
这里的匹配规则需要注意一下。按照上面的配置,假如我们有这样一个场景:
- 地址:http://ceshi.csym.com/server/ceshi.html
- location :/server/
- proxy_pass:https://127.0.0.1:8444/aaa,它由A和B两部分组成:
- A:https://127.0.0.1:8444
- B:/aaa
- 如果proxy_pass由
uri+url
组成,那么就应该是location去匹配地址信息,然后包含location在内的左边部分,全部替换proxy_pass的值。什么意思呢?举个例子
请求地址 | location | proxy_pass | 实际请求地址 | 说明 |
---|---|---|---|---|
http://ceshi.csym.com/server/ ceshi.html | /server/ | https://127.0.0.1:8444/aaa/ | https://127.0.0.1:8444/aaa/ceshi.html | proxy_pass红色标记部分 替换了请求地址中的红色标记部分 |
http://ceshi.csym.com/server/ ceshi.html | /server | https://127.0.0.1:8444/aaa/ | https://127.0.0.1:8444/aaa// ceshi.html | proxy_pass红色标记部分 替换了请求地址中的红色标记部分 ,因为匹配过程中location 没有/,导致地址中余下一个/,然后proxy_pass中又带有一个"/",所以出现了双“/”。 |
http://ceshi.csym.com/server/ ceshi.html | /server/ | https://127.0.0.1:8444/aaa | https://127.0.0.1:8444/aaaceshi.html | - |
http://ceshi.csym.com/ server/ceshi.html | /server/ | https://127.0.0.1:8444 | https://127.0.0.1:8444/server/ceshi.html | 当且仅当proxy_pass只由A组成时,末尾没有“/”,那么就会成为全代理 |
4. 每次修改配置文件之后,需要刷新一下配置
nginx -s reload
5. 有时候会遇到一些代理问题,尤其是自己建立的虚拟机
例如代理的时候请求不到上游服务器,出现以下日志
connect() to XXXX failed (13: Permission denied) while connecting to upstream,
这个是由于谷歌的SeLinux框架导致的,执行以下命令
setsebool -P httpd_can_network_connect 1
后续一大堆的域名文件,都可直接丢到这个文件夹下,Nginx会自动识别分别执行的,充分合理利用二级域名(千万不要直接拿www的主域名来做接口,不然你就是大冤种),每一个二级域名都是一个项目地址,一个或者多个后端地址。如果要一个耳机域名,多个前端的话,要不前端单独用个二级域名,要不同一个域名下面再开一个端口监听。虽然一个端口也可以通过路由来处理,但是这种方法有坑。。。。
这里还有一个小妙招,Nginx通过域名来监听,即便域名指向的是同一个ip地址,也会根据域名来执行对应的代码块,所以嘛…自己想了。Nginx很强大,这里只是例举了一些常用的场景,详细的有空会单独再出一篇文章