高性能的http服务器/反向代理服务器。官方测试支持5万并发,CPU、内存等消耗较低且运行稳定
使用场景
- Http服务器。
Nginx可以单独提供Http服务,做为静态网页的服务器。 - 虚拟主机。
可以在一台服务器虚拟出多个网站。 - 反向代理与负载均衡。
Nginx做反向代理,可以使多个服务器之间分担负载,不会造成某台服务器负载高宕机或者某台服务器十分闲置。
Linux环境安装Nginx
官方网站
- 安装依赖包
# SSL功能需要openssl库,直接通过yum安装:
yum install openssl
# gzip模块需要zlib库,直接通过yum安装:
yum install zlib
# rewrite模块需要pcre库,直接通过yum安装:
yum install pcre
或者直接安装以上三个依赖,命令:
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
-
创建一个用于存放
Nginx
的文件夹 -
下载
Nginx
的tar
包到自己的文件夹。
命令:wget http://nginx.org/download/nginx-1.22.0.tar.gz
提示:wget: command not found
解决:yum -y install wget
-
解压
tar
包。
命令:tar -xvf nginx-1.22.0.tar.gz nginx
-
安装模块。
进入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
-
安装
Nginx
命令:make install
-
安装完成
Nginx常用命令
进入Nginx
安装目录下的sbin
目录
-
启动
命令:./nginx
-
查看是否启动
命令:ps ef | grep nginx
-
关闭
命令:nginx -s stop
或者nginx -s quit
-
重启,重新加载配置文件
命令:nginx -s reload
-
修改
conf
下监听端口为81
防火墙配置
-
查看所有打开的端口
命令:firewall-cmd --zone=public --list-ports
-
开放指定端口号
命令:firewall-cmd --zone=public --add-port=81/tcp --permanent
-
重新载入
命令: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常用功能配置
反向代理
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/;
}
}
访问控制:黑名单
server {
location / {
# 屏蔽单个ip访问
deny 172.16.60.220;
# 屏蔽所有ip
deny all;
# 允许ip访问
allow 172.16.60.220;
}
}
负载均衡:轮询
每次请求会按时间顺序逐一分配到不同的服务器,如果有服务宕机,Nginx会剔除掉宕机服务器,继续分配请求。
如果其中一台服务器压力太大,出现延迟,会影响所有的这台服务器下的用户请求。
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
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地址对应的哈希值,通过哈希码值对服务器数量进行一个求模式运算。这样就可以保持每个客户端访问的服务器是保持不变的。因为哈希算法散列的特点,也可以近似的当作平均分配。
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
会将请求发送给当前处理请求数量最少的服务器上,用来分担各个服务器之间的压力。
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传输过程中文件的大小。可以极大提高网站的访问速度。
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静态资源服务器
server {
listen 80;
server_name localhost;
#后台管理
location /handadmin{
alias /opt/home/handbook/dist/;
index index.html;
}
}
动静分离
Nginx
设置expires
可以指定访问缓存。设置之后,用户在指定的时间都只会访问浏览器中的缓存,而不会去请求Nginx
# 静态请求
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;
}
图片防盗链
防止其他网站利用外链访问服务器图片
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
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;
}
}
设置二级域名
server {
listen 80;
server_name admin.test.com; // 二级域名
location / {
root /usr/local/app/admin; # 二级域名的 html 路径
index index.html;
}
}
配置Https
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
# 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;
}