Linux中安装Nginx及日常配置使用

高性能的http服务器/反向代理服务器。官方测试支持5万并发,CPU、内存等消耗较低且运行稳定

使用场景

  • Http服务器。
    Nginx可以单独提供Http服务,做为静态网页的服务器。
  • 虚拟主机。
    可以在一台服务器虚拟出多个网站。
  • 反向代理与负载均衡。
    Nginx做反向代理,可以使多个服务器之间分担负载,不会造成某台服务器负载高宕机或者某台服务器十分闲置。

Linux环境安装Nginx

官方网站

  1. 安装依赖包
java 复制代码
# SSL功能需要openssl库,直接通过yum安装: 
yum install openssl

# gzip模块需要zlib库,直接通过yum安装: 
yum install zlib

# rewrite模块需要pcre库,直接通过yum安装: 
yum install pcre

或者直接安装以上三个依赖,命令:

java 复制代码
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel


  1. 创建一个用于存放Nginx的文件夹

  2. 下载Nginxtar包到自己的文件夹。

    命令:wget http://nginx.org/download/nginx-1.22.0.tar.gz

    提示:wget: command not found

    解决:yum -y install wget

  3. 解压tar包。

    命令:tar -xvf nginx-1.22.0.tar.gz nginx

  4. 安装模块。

    进入Nginx目录,执行命令:
    ./configure

    报错:./configure: error: C compiler cc is not found

    解决:yum -y install gcc gcc-c++ autoconf automake make

    报错:./configure: error: the HTTP gzip module requires the zlib library. You can either disable the module by using --without-http_gzip_module option, or install the zlib library into the system, or build the zlib library statically from the source with nginx by using --with-zlib=<path> option.

    解决:yum install -y zlib-devel

  5. 安装Nginx

    命令: make install

  6. 安装完成


Nginx常用命令

进入Nginx安装目录下的sbin目录

  1. 启动

    命令:./nginx

  2. 查看是否启动

    命令:ps ef | grep nginx

  3. 关闭

    命令:nginx -s stop或者nginx -s quit

  4. 重启,重新加载配置文件

    命令:nginx -s reload

  5. 修改conf下监听端口为81


防火墙配置

  1. 查看所有打开的端口

    命令:firewall-cmd --zone=public --list-ports

  2. 开放指定端口号

    命令:firewall-cmd --zone=public --add-port=81/tcp --permanent

  3. 重新载入

    命令:firewall-cmd --reload


Nginx无法重启

描述:Restarting nginx daemon: nginxnginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory) nginx not running

解决:Nginx -c参数指定配置文件解决
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf


Nginx访问

【IP + 端口号 80默认不显示】


Nginx基本配置说明

  • main:全局设置。影响其他部分所有设置。
  • server:主机服务相关设置,主要用于指定虚拟主机域名、IP和端口号等。
  • location:URL匹配特定位置后的设置,反向代理、内容篡改的相关设置。
  • upstream:上游服务器设置和负载均衡相关设置。

Nginx常用功能配置

反向代理
java 复制代码
server {
    listen 80;
    server_name wh.test.com;
    location /api {
        # 反向代理的地址
        # 所有 /api 的接口访问都代理到 7075 端口
            例如:wh.test.com/api/login.do -> http://localhost:7050/login.do
        proxy_pass http://localhost:7075/;
    }
}

访问控制:黑名单
java 复制代码
server {
    location / {
        # 屏蔽单个ip访问
        deny 172.16.60.220;
        
        # 屏蔽所有ip
        deny all;
        
        # 允许ip访问
        allow 172.16.60.220;
    }
}



负载均衡:轮询

每次请求会按时间顺序逐一分配到不同的服务器,如果有服务宕机,Nginx会剔除掉宕机服务器,继续分配请求。

如果其中一台服务器压力太大,出现延迟,会影响所有的这台服务器下的用户请求。

java 复制代码
http {  
    upstream test.com {  
        server 192.168.10.1:8081;  
        server 192.168.10.2:8082;  
        server 192.168.10.3:8083;  
    }  
    server {  
        location /test {  
            proxy_pass  http://test.com/;  
        }  
    }  
}

负载均衡:权重

理想状态下,10次请求中有6次请求了8081,1次请求了8082,3次请求了8083

java 复制代码
http {  
    upstream test.com {  
        server 192.168.10.1:8081 weight=6;  
        server 192.168.10.2:8082 weight=1;  
        server 192.168.10.3:8083 weight=3;  
    }  
    server {  
        location /test {  
            proxy_pass  http://test.com/;  
        }  
    }  
}

负载均衡:Hash

计算方式:abs(客户端ip.hash())%服务器数量。

客户端的IP地址是唯一不变的。所以,通过hash算法计算出ip地址对应的哈希值,通过哈希码值对服务器数量进行一个求模式运算。这样就可以保持每个客户端访问的服务器是保持不变的。因为哈希算法散列的特点,也可以近似的当作平均分配。

java 复制代码
http {  
    upstream test.com {  
        ip_hash;
        server 192.168.10.1:8081;  
        server 192.168.10.2:8082;  
        server 192.168.10.3:8083;  
    }  
    server {  
        location /test {  
            proxy_pass  http://test.com/;  
        }  
    }  
}

负载均衡:最小连接数

基于最小连接的负载均衡方式,Nginx会将请求发送给当前处理请求数量最少的服务器上,用来分担各个服务器之间的压力。

java 复制代码
http {  
    upstream test.com {  
        least_conn;
        server 192.168.10.1:8081;  
        server 192.168.10.2:8082;  
        server 192.168.10.3:8083;  
    }  
    server {  
        location /test {  
            proxy_pass  http://test.com/;  
        }  
    }  
}

gzip压缩

开启gzip压缩可以减少http传输过程中文件的大小。可以极大提高网站的访问速度。

java 复制代码
gzip  on; # 开启gzip 压缩
gzip_types; # 要采用 gzip 压缩的 MIME 文件类型,其中 text/html 被系统强制启用
gzip_static on; # 默认 off,该模块启用后,Nginx 首先检查是否存在请求静态文件的 gz 结尾的文件,如果有则直接返回该 .gz 文件内容
gzip_proxied expired no-cache no-store private auth; # 默认 off,nginx 做为反向代理时启用,用于设置启用或禁用从代理服务器上收到相应内容 gzip 压缩
gzip_buffers 16 8k; # 获取多少内存用于缓存压缩结果,16 8k 表示以 8k*16 为单位获得
gzip_min_length 1k; # 允许压缩的页面最小字节数,页面字节数从 header 头中的 Content-Length 中进行获取。默认值是 0,不管页面多大都压缩。建议设置成大于 1k 的字节数,小于 1k 可能会越压越大
gzip_comp_level 4; # gzip 压缩比,压缩级别是 1-9,1 压缩级别最低,9 最高,级别越高压缩率越大,压缩时间越长,建议 4-6
gzip_http_version 1.0; # 默认 1.1,启用 gzip 所需的 HTTP 最低版本
gzip_vary off; # 用于在响应消息头中添加 Vary:Accept-Encoding,使代理服务器根据请求头中的 Accept-Encoding 识别是否启用 gzip 压缩
gzip_disable "MSIE [1-6]\.";// 指定哪些不需要 gzip 压缩的浏览器

Http静态资源服务器
java 复制代码
server {  
  listen       80;  
  server_name  localhost;  

  #后台管理
  location /handadmin{
      alias  /opt/home/handbook/dist/;
      index index.html;
  }  
}

动静分离

Nginx设置expires可以指定访问缓存。设置之后,用户在指定的时间都只会访问浏览器中的缓存,而不会去请求Nginx

java 复制代码
# 静态请求
location ~ \.(gif|jpg|jpeg|png|bmp|swf|css|js) {  
    root /usr/local/dist;  
    expires 10h; # 设置过期时间为10小时  
}  

# 动态请求
location ~ \.(do) {  
    proxy_pass  127.0.0.1:8081;  
} 

图片防盗链

防止其他网站利用外链访问服务器图片

java 复制代码
server {  
    listen 8081;  
    server_name  localhost;  

    # 图片防盗链  
    location ~* \.(gif|jpg|jpeg|png|bmp|swf) {  
        valid_referers none blocked server_names ~\.google\. ~\.baidu\. *.qq.com;  
        # 只允许本机 IP 外链引用,将百度和谷歌也加入白名单有利于 SEO  
        if (invalid_referer){  
            return 403;  
        }  
    }  
} 

适配PC

根据用户请求的user-agent来判断返回PC还是H5

sql 复制代码
server {  
    listen 80;  
    server_name test.com;  

    location / {  
     root  /usr/local/app/pc; # pc 的 html 路径  
        if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') {  
            root /usr/local/app/mobile; # mobile 的 html 路径  
        }  
        index index.html;  
    }  
} 

设置二级域名
sql 复制代码
server {  
    listen 80;  
    server_name admin.test.com; // 二级域名  

    location / {  
        root  /usr/local/app/admin; # 二级域名的 html 路径  
        index index.html;  
    }  
} 

配置Https
sql 复制代码
server{  
    listen 443 ssl http2; # 这里还启用了 http/2.0
    ssl_certificate /etc/letsencrypt/live/test.com/fullchain.pem; # 证书文件地址  
    ssl_certificate_key /etc/letsencrypt/live/test.com/privkey.pem; # 私钥文件地址  
    server_name test.com www.test.com; # 证书绑定的域名  
}

配置Http转Https
server {  
    listen      80;  
    server_name  www.test.com;  

    # 单域名重定向  
    if (host = 'www.test.com'){  
        return 301 https://www.test1.com;  
    }  

    # 全局非 https 协议时重定向  
    if (scheme != 'https') {  
        return 301 https://server_name$request_uri;  
    }  

    # 或者全部重定向  
    return 301 https://server_name$request_uri;  
}

禁止指定user_agent
java 复制代码
# http_user_agent 为浏览器标识  
# 禁止 user_agent 为baidu、360和sohu,~*表示不区分大小写匹配  
if (http_user_agent ~* 'baidu|360|sohu') {  
    return 404;
}  

# 禁止 Scrapy 等工具的抓取  
if (http_user_agent ~* (Scrapy|Curl|HttpClient)) {  
    return 403; 
}

#### 请求过滤
#### 根据请求类型过滤

# 非指定请求全返回 403  
if ( request_method !~ ^(GET|POST|HEAD) ) {  
    return 403;  
}  
相关推荐
JustCouvrir9 小时前
macOS|前端工程部署到Nginx服务器
服务器·前端·nginx
AlbertS10 小时前
使用 Let’s Encrypt 获取免费SSL证书
nginx·免费·centos7·ssl证书·let’s encrypt
航月10 小时前
FTP、ISCSI、CHRONY、DNS、NFS、DOCKER、MARIADB、NGINX、PHP、CA各服务开启方法
nginx·docker·mariadb
IT-民工2111015 小时前
nginx监控指标有哪些
运维·nginx
陌路物是人非1 天前
docker对nginx.conf进行修改后页面无变化或页面报错
nginx·docker
草明1 天前
Nginx 做反向代理,一个服务优先被使用,当无法提供服务时才使用其他的备用服务
运维·nginx·github
吉吉611 天前
Nginx:我自己的网站
运维·nginx
凉忆-2 天前
nginx安装ssl模块教程
运维·nginx·ssl
俎树振2 天前
树莓派上安装与配置 Nginx Web 服务器教程
服务器·前端·nginx
Karoku0662 天前
【缓存与加速技术实践】Web缓存代理与CDN内容分发网络
运维·数据库·redis·mysql·nginx·缓存