什么是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的并发能力,更快的给用户响应。
上图是动态资源的请求工程 四个连接数 ,咱们把静态资源放在nginx 上面 就只需要两个连接数, 同时也减轻了后面服务器的压力 , 如下图 静态资源直接放在nginx
image.png动态资源代理
使用proxy_pass动态代理
# 配置如下
location / {
proxy_pass 路径;
}
静态资源代理
为了验证效果,把应用中的静态资源都拷贝到 /opt/docker_nginx/statics/ 目录下
这个目录通过数据卷映射到了nginx内部的 /usr/share/nginx/statics 目录
我们通过location 指定了特性类型的静态资源访问这个路径。
image.png所以,本质上静态资源会到 /opt/docker_nginx/statics/ 目录加载。
我们把要验证的静态资源,比如汤姆猫图片,美女图片【命名为tomcat.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动静分离
网友评论