Nginx在Linux上脚本自动安装,域名监听,wss、https升级,匹配规则讲解

安装

直接上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;
}

  1. 剩下的就简单了,只需要在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两部分组成:
    1. A:https://127.0.0.1:8444
    2. B:/aaa
  • 如果proxy_pass由uri+url组成,那么就应该是location去匹配地址信息,然后包含location在内的左边部分,全部替换proxy_pass的值。什么意思呢?举个例子
请求地址locationproxy_pass实际请求地址说明
http://ceshi.csym.com/server/ceshi.html/server/https://127.0.0.1:8444/aaa/https://127.0.0.1:8444/aaa/ceshi.htmlproxy_pass红色标记部分替换了请求地址中的红色标记部分
http://ceshi.csym.com/server/ceshi.html/serverhttps://127.0.0.1:8444/aaa/https://127.0.0.1:8444/aaa//ceshi.htmlproxy_pass红色标记部分替换了请求地址中的红色标记部分,因为匹配过程中location 没有/,导致地址中余下一个/,然后proxy_pass中又带有一个"/",所以出现了双“/”。
http://ceshi.csym.com/server/ceshi.html/server/https://127.0.0.1:8444/aaahttps://127.0.0.1:8444/aaaceshi.html-
http://ceshi.csym.com/server/ceshi.html/server/https://127.0.0.1:8444https://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很强大,这里只是例举了一些常用的场景,详细的有空会单独再出一篇文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值