Nginx

什么是Nginx

Nginx 是一个高性能的 http 和反向代理服务器,其特点是占用内存小,并发能力强。 Nginx 专为性能优化而开发,性能是其最重要的考量,能经受高负载的考验,有报告表明能支持高达50000个并发连接数。

Nginx可以从事的用途

web服务器

提供Web信息浏览服务。它只需支持HTTP协议、HTML文档格式及URL。

反向代理

正向代理:在浏览器中配置代理服务器,通过代理服务器进行互联网访问。
反向代理:将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴漏的是代理服务器地址。

负载均衡

如果请求数过大,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器的情况改为请求分发到多个服务器上,就是负载均衡。

Nginx安装

CentOS

yum install -y nginx

Ubuntu

apt-get install -y nginx

当终端显示出Complete!字样时,则代表我们的Nginx已经安装成功了。

Docker 方式安装: Docker 部署 Nginx - 简书 (jianshu.com)

查看Nginx版本:

nginx -v

Nginx自带常用命令

nginx -s stop       快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。
nginx -s quit       平稳关闭Nginx,保存相关信息,有安排的结束web服务。
nginx -s reload     因改变了Nginx相关配置,需要重新加载配置而重载。
nginx -s reopen     重新打开日志文件。
nginx -c filename   为 Nginx 指定一个配置文件,来代替缺省的。
nginx -t           不运行,仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
nginx -v           显示 nginx 的版本。
nginx -V           显示 nginx 的版本,编译器版本和配置参数。

Nginx启动

##在centos7+ 启动nginx服务
systemctl start nginx
#centos6+ 上启动nginx服务
service nginx start
#或,简单粗暴一句,通过这种方式启动nginx 使用systemctl status nginx查看的状态是未运行
nginx

Nginx停止

##在centos7+ 停止nginx服务
systemctl stop nginx
#centos6+ 上停止nginx服务
service nginx stop
#粗鲁的停止,下班了,不干了,就算请求来了我也不接了。
nginx -s stop
##优雅的停止,Nginx在退出前完成已经接受的连接请求。
nginx -s quit

Nginx重启

##在centos7+ 重启nginx服务
systemctl restart nginx
#centos6+ 上重启nginx服务
service nginx restart
#使用nginx命令停止,推荐这个
nginx -s reload

四种解决Nginx出现403 forbidden 报错的方法

一、由于启动用户和nginx工作用户不一致所致

1.1查看nginx的启动用户

ps aux | grep "nginx: worker process" | awk '{print $1}'

1.2将nginx.config的user改为和启动用户一致

vim conf/nginx.conf
二、缺少index.html或者index.php文件,就是配置文件中index index.html index.htm这行中的指定的文件
  server {
    listen       80;
    server_name localhost;
    index index.php index.html;
    root /data/www/;
  }

如果在/data/www/下面没有index.php,index.html文件的时候,直接会报403 forbidden

三、权限问题,如果nginx没有web目录的操作权限,也会出现403错误

解决办法:修改web目录的读写权限,或者是把nginx的启动用户改成目录的所属用户,重启Nginx即可解决

chmod -R 777 /data
chmod -R 777 /data/www/
四、SELinux设置为开启状态(enabled)的原因

查看当前selinux的状态

/usr/sbin/sestatus

将SELINUX=enforcing 修改为 SELINUX=disabled 状态

vim /etc/selinux/config

#SELINUX=enforcing
SELINUX=disabled

重启生效。reboot

reboot

SELinux作为Linux的安全防护插件,在普通机器和其他生产环境有额外的系统做安全防护,所以这里关闭即可

配置web服务器

location /path/ {
    # 相对匹配,文件路径等于 root + location,如访问 http://ip/path/ 对应的文件目录是/root/software/autotpsite/dist/path/
 root   /root/software/autotpsite/dist;  
    # 绝对匹配,文件路径等于alias对应目录与location无关, 目录必须以/结尾 与root二选一 ,如访问 http://ip/path/ 对应的文件目录 /root/software/autotpsite/dist/
 # alias   /root/software/autotpsite/dist/; 
}

正向代理和反向代理介绍

正向代理:

正向代理服务是由客户端设立的。
客户端了解代理服务器和目标服务器都是谁。
帮助咱们实现突破访问权限,提高访问的速度,对目标服务器隐藏客户端的ip地址。


image.png
反向代理:

反向代理服务器是配置在服务端的。
客户端是不知道访问的到底是哪一台服务器。
达到负载均衡,并且可以隐藏服务器真正的ip地址。


image.png

部署反向代理

反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址

核心配置:

### 省略了http和server块,这里加到server块里面就可以
location /api/ {
   include       uwsgi_params;
   uwsgi_pass     127.0.0.1:8081; # 此方式需要 uwsgi采用socket连接方式
}
#location /jira {
#   include       uwsgi_params;
#   uwsgi_pass     127.0.0.1:8081;
#}
location / {
   alias     /root/software/autotpsite/dist/;
}

或者使用正则的方式匹配URL

location / {
   alias     /root/software/autotpsite/dist/;
}
location ~/(api/|jira/) {
   include       uwsgi_params;
   uwsgi_pass     127.0.0.1:8081;
 # proxy_pass   http://127.0.0.1:8081;   # 通用配置方式
}

uWSGI服务配置

[uwsgi]
# 配置文件处于项目根目录,因此设置为相对路径即可,复用性更高
chdir = ./              
module = autotpsite.wsgi:application
# Nginx使用uwsgi_pass做方向代理时 需要设置成socket
socket = 0.0.0.0:8081
#http-socket = 0.0.0.0:8081   #对应nginx的uwsgi模式
#http = 0.0.0.0:8081     #对应nginx的uwsgi模式
master = true
pidfile = uwsgi8081.pid
daemonize = uwsgi_server.log
# 只记录错误信息
disable-logging = true
# 新增配置--允许多线程
enable-threads = true
# 设置请求头最大字节数,用于socket模式
buffer-size = 40960

location指令说明:
功能:用于匹配URL
语法如下:

1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
2、~:用于表示 uri 包含正则表达式,并且区分大小写。
3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。
4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。

如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。

部署负载均衡

在nginx中配置负载均衡也是十分容易的,同时还支持了多种负载均衡策略供我们灵活选择。

http {
###此处省略一大堆没有改的配置
   ##自定义我们的服务列表
   upstream myserver{
       server 127.0.0.1:8081;
       server 192.168.2.5:8081;
   }
   server {
       listen       80 ; ##设置我们nginx监听端口为8888
       server_name myserve;
       # Load configuration files for the default server block.
       include /etc/nginx/default.d/*.conf;
       location / {
           alias   /root/software/autotpsite/dist/;
       }
       location ~/(api/|jira/) {
           proxy_pass   http://myserver; # 核心配置在这里
           proxy_connect_timeout 10;   # 超时时间,单位秒
       }
       error_page 404 /404.html;
           location = /40x.html {
       }
       error_page 500 502 503 504 /50x.html;
           location = /50x.html {
       }
   }
}

uWSGI配置:

[uwsgi]
chdir = /root/software/autotpsite/
module = autotpsite.wsgi:application
http-socket = 0.0.0.0:8081
master = true
pidfile = /root/software/autotpsite/uwsgi8081.pid
daemonize = /root/software/autotpsite/uwsgi_server.log
# 只记录错误信息
disable-logging = true

nginx提供了三种不同的负载均衡策略供我们灵活选择,分别是:

轮询(默认方式):

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
用法:啥也不加,上文实例就是默认的方式,就是默认的

权重(weight):

weight 代表权重,默认为 1,权重越高被分配的客户端越多,权重越大,能力越大,责任越大,处理的请求就越多。
用法:

upstream myserver{
   server 127.0.0.1:8081 weight =1;
   server 192.168.2.5:8081 weight=2;
}
ip_hash:

每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。
用法:

 upstream myserver{
       ip_hash;#可与weight配合使用
       server 127.0.0.1:8081 weight =1;
       server 192.168.2.5:8081 weight =2;
     }
image.png

Nginx动静分离

Nginx的并发能力公式:
worker_processes * worker_connections / 4 | 2 = Nginx最终的并发能力
动态资源需要/4,静态资源需要/2.
Nginx通过动静分离,来提升Nginx的并发能力,更快的给用户响应。

image.png

上图是动态资源的请求工程 四个连接数 ,咱们把静态资源放在nginx 上面 就只需要两个连接数, 同时也减轻了后面服务器的压力 , 如下图 静态资源直接放在nginx

image.png
动态资源代理

使用proxy_pass动态代理

# 配置如下
location / {
  proxy_pass 路径;
}
静态资源代理

为了验证效果,把应用中的静态资源都拷贝到 /opt/docker_nginx/statics/ 目录下
这个目录通过数据卷映射到了nginx内部的 /usr/share/nginx/statics 目录
我们通过location 指定了特性类型的静态资源访问这个路径。

所以,本质上静态资源会到 /opt/docker_nginx/statics/ 目录加载。
我们把要验证的静态资源,比如汤姆猫图片,美女图片【命名为tomcat.png】,放到这个目录。

image.png

配置文件:

# 修改配置文件
upstream emp {
  ip_hash;
  server 192.168.174.128:8081;
  server 192.168.174.128:8080;
}

server{
    listen 80;
    server_name localhost;
    
    location ~* \.(gif|jpg|png|js|css|html)$ {
        # 匹配以gif|jpg|png|js|css|html为结尾的路径 静态资源
        root /usr/share/nginx/statics;
    }
    
    location / {
        proxy_pass http://emp/;
    }

}

vim docker-compose.yml

version: '3.1'
services:
  nginx:
    restart: always
    image: daocloud.io/library/nginx:latest
    container_name: nginx
    ports:
      - 80:80
    volumes:
      - /opt/docker_nginx/conf.d/:/etc/nginx/conf.d
      - /opt/docker_nginx/statics/:/usr/share/nginx/statics

我们当前的所有静态资源文件,比如js/css/images/html都放在了 /opt/docker_nginx/statics 目录下如果遇到访问静态资源403无权限查看的问题,原因是nginx访问时是通过nginx用户,而statics 静态文件夹是root用户创建的,其他用户没有访问权限,需要添加访问权限

chmod -R 777 /opt/docker_nginx/statics/

动态资源从tomcat获取,静态资源从/opt/docker_nginx/statics/目录获取 ==> Nginx动静分离

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容