Nginx

反向代理

正向代理代理的对象是客户端,反向代理代理的对象是服务端。 反向代理隐藏了真实的服务端,当我们请求 www.baidu.com 的时候,就像拨打10086一样,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了,www.baidu.com 就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到真实的服务器那里去。

Nginx就是性能非常好的反向代理服务器,用来做负载均衡。

正向代理隐藏真实客户端,反向代理隐藏真实服务端

反向代理的实现 1. 需要有一个负载均衡设备来分发用户请求,将用户请求分发到空闲的服务器上 2. 服务器返回自己的服务到负载均衡设备 3. 负载均衡将服务器的服务返回用户

以上的潜台词是:用户和负载均衡设备直接通信,也意味着用户做服务器域名解析时,解析得到的IP其实是负载均衡的IP,而不是服务器的IP,这样有一个好处是,当新加入/移走服务器时,仅仅需要修改负载均衡的服务器列表,而不会影响现有的服务。

链接:https://www.zhihu.com/question/24723688/answer/160252724

安装

下载  https://nginx.org/download/nginx-1.14.2.tar.gz

上传nginx-1.14.2.tar.gz到目标服务器

tar -zxf ***.tar.gz 解压缩

确认gcc是否安装,若否先yum -y install gcc  gcc-c++ kernel-devel

安装完成后进入nginx目录 ./configure —with-http_ssl_module

make && make install

安装成功, 进入/usr/local/nginx/sbin/

执行./nginx启动

软连接 ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx

启动

踩坑:Redirecting to /bin/systemctl start nginx.service Failed to start nginx.service: Unit not found.

在 /etc/init.d/下创建名为nginx的启动脚本即可

设置执行权限:chmod +x /etc/init.d/nginx

注册成服务:chkconfig -add nginx

设置开机启动:chkconfig nginx on

Linux上开机自动启动Nginx: 在/etc/rc.local文件中加一行 nginx

检查 nginx 运行状态:service nginx status

启动:nginx 或 service nginx start

踩坑:nginx: [error] invalid PID number “” in “/run/nginx.pid”

nginx -c /etc/nginx/nginx.conf # 找到 nginx.conf 路径

nginx -s reload

查看Ngnix配置

sudo su -
ps -aux | grep nginx
# root xxx 0.0  0.0 xxx xxx ? Ss Mar19 0:00 nginx: master process /usr/sbin/nginx

/usr/sbin/nginx -t
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

cat /etc/nginx/nginx.conf
# include /etc/nginx/default.d/*.conf;
# include /etc/nginx/default.d/*.conf;

cat /etc/nginx/conf.d/swift.conf
# 测试
nginx -t
# 重启
service nginx restart
nginx -s reload

nginx.conf

后端

pm2 start npm —name iqvia-data-3007 — run start:prod

location /iqvia/ {
    rewrite "^/iqvia/(.*)$" /$1 break;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass http://xx.xx.xx.39:3007;
}

前端 build

server {
    server_name hr_hackathon.xxx.com;
    root /usr/share/nginx/fpa_share_doc/dist;
    location / {
      try_files $uri $uri/ /index.html;
    }
  }

指向index

npm run build:prod

# 0042 (42 -> 39)
location /iqvia-email {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_buffering off;
    proxy_pass http://xx.xx.xx.39;
}
# 0039 (nginx在42,资源在39)
location /iqvia-email/ {
    alias   /var/www/iqvia_email/build/;
    index index.html;
}

# 0080 (80资源在本机)
location /iqvia-email/ {
    alias   /var/www/iqvia_email/build/;
    index index.html;
    try_files $uri /iqvia-email/index.html;
}

指向端口

next build
next start -p 3008
pm2 start npm --name carto-dashboard-3008 -- run start
// next.config.ts
module.exports = {
  basePath: '/carto-dashboard',
};
location /carto-dashboard {
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_pass http://xx.xx.xx.80:3008;
}

前端 单页

server {
  server_name project_organization.xxx.com;
  root /root/www/project_organization;
  index dateBar.html;
}

静态资源

location /static {
    alias   /var/www/static;
}

SSL 证书

踩坑:Nginx 配置完后,只能打开http开头的域名,因为缺少SSL证书

HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息

HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。

在nginx的conf目录下新建一个cert目录,并将两个证书文件上传到cert目录下

listen 443 ssl; # managed by Certbot
ssl_certificate "/etc/letsencrypt/live/xxx.cer";
ssl_certificate_key "/etc/letsencrypt/live/xxx.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout  10m;
ssl_ciphers PROFILE=SYSTEM;
ssl_prefer_server_ciphers on;

踩坑:[emerg] the “ssl” parameter requires ngx_http_ssl_module. Nginx 缺少 http_ssl_module 模块

切换到源码包:cd /home/usr/nginx-1.14.2/

./configure —with-http_ssl_module

make (不要make install,否则会覆盖安装)

备份原有已安装好的nginx:cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak

停止nginx运行:nginx -s stop

将刚刚编译好的nginx覆盖掉原有的nginx:cp ./objs/nginx /usr/local/nginx/sbin/nginx

启动nginx:nginx

nginx -V 查看是否已成功加入

___

Nginx  Apache 高并发的原因

Nginx 负载均衡调度算法
负载均衡之轮询算法

Apache 多进程多线程

Nginx 单进程单线程

web socket需要把http设为1.1
只握手一次

```js
location{
  proxy_http_version: 1,1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade"; // 升级到最新版本 Status code 101
  proxy_set_header Host $host; // 暴露被反向代理隐藏的host
}
Article
Tagcloud
DVA Java Express Architecture Azure CI/CD database ML AWS ETL nest sql AntV Next Deep Learning Flutter TypeScript Angular DevTools Microsoft egg Tableau SAP Token Regexp Unit test Nginx nodeJS sails wechat Jmeter HTML2Canvas Swift Jenkins JS event GTM Algorithm Echarts React-Admin Rest React hook Flux Redux ES6 Route Component Ref AJAX Form JSX Virtual Dom Javascript CSS design pattern