首页 > 系统相关 >Nginx学习总结

Nginx学习总结

时间:2022-10-08 13:04:25浏览次数:48  
标签:总结 ssl nginx server 学习 Nginx proxy timeout root

Nginx学习总结


背景

是在受不了每次都是先去百度,找模板了.
这次将几个常用模板整理一下,
以后不管在哪里可以直接使用.
注意: 不能直接用于生产, 可用于测试与POC

第一部分编译

第一部分文件目录存放:
地址 19服务器 /nginx 目录.
-rw-r--r-- 1 root root 335 9月 27 18:50 config.txt
drwxr-xr-x 9 root root 186 12月 4 2019 nginx-1.17.3
drwxr-xr-x 9 root root 186 9月 27 15:14 nginx-1.22.0
drwxr-xr-x 9 root root 186 7月 18 14:45 nginx-1.23.0
drwxr-xr-x 9 root root 186 9月 27 15:05 nginx-1.23.1
drwxr-xr-x 4 root root 207 8月 9 2016 nginx-sticky
drwxrwxr-x 19 root root 4096 9月 27 15:57 openssl-1.1.1b
drwxr-xr-x 9 root root 8192 9月 27 15:57 pcre-8.43
drwxr-xr-x 14 root root 4096 9月 27 15:58 zlib-1.2.11

第一部分编译

关于安装的说明:
不需要单独编译zlib openssl之类的内容.
直接在nginx 下面 config 添加就会自动编译.
注意可以放到arm目录上面进行编译出来的制品就可以在国产环境上面运行
注意prefix的路径 建议设定好. 便于维护.

第一部分编译

./configure --prefix=/data/nginx \
--sbin-path=/data/nginx/nginx \
--conf-path=/data/nginx/nginx.conf \
--pid-path=/data/nginx/nginx.pid \
--with-http_ssl_module \
--with-pcre=../pcre-8.43 \
--with-zlib=../zlib-1.2.11 \
--with-openssl=../openssl-1.1.1b \
--with-stream \
--with-stream_ssl_preread_module \
--add-module=../nginx-sticky

Nginx 配置节模板

  • 简单的前端文件
  • 可以用来进行前后端分离时, nignx暴露前端页面.
user  root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
sendfile on;
gzip on;
server {
listen 80;
server_name localhost;
location / {
root /myapp/web/ ;
index index.html index.htm;
}
}
}

Nginx配置模板

  • 七层反向代理的模板
  • 可以实现简单的应用负载均衡.
  • 注意 upstream 的名字跟proxy_pass的处理.
user  root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
upstream myapp {
sticky;|ip_hash;
server 10.x.x.x:5200;
server 10.2x.x.x:5200;
}
server {
listen 80;
server_name ip;|localhost|somename;
location / {
add_header 'Access-Control-Allow-Origin' "$http_origin";
add_header 'Access-Control-Allow-Credentials' "true";
proxy_pass http://myapp ;
}
}
}

Nginx配置模板

  • 四层反向代理
  • configure 里面必须带 with-stream
  • 需要注意, http替换成了stream 并且没有location的字段.
worker_processes 1;
events {
worker_connections 1024;
}
stream {
upstream backend {
hash $remote_addr consistent;
server 127.0.0.1:12346 weight=5;
server 127.0.0.1:12347 max_fails=3 fail_timeout=30s;
server 127.0.0.1:12348 max_fails=3 fail_timeout=30s;
}
server {
listen 12345;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass backend;
}
}

Nginx配置模板

  • 四层不用证书反向代理HTTPS网站
  • 注意必须使用ssl_preread的模块, 注意可以同时反向代理多个站点.
  • 可以在其他服务器上面修改DNS的方式进行使用.
worker_processes  2;
events {
worker_connections 10240;
}
stream {
map $ssl_preread_server_name $backend_pool {
www.baidu.com baidu;
www.163.com 163;
}
upstream baidu {
server www.baidu.com:443;
}
upstream 163 {
server www.163.com:443;
}
server {
listen 443;
ssl_preread on;
proxy_pass $backend_pool;
proxy_connect_timeout 15s;
proxy_timeout 15s;
proxy_next_upstream_timeout 15s;
}
}

Nginx配置模板

  • Https以及80跳转443的写法
worker_processes  auto;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
gzip on;
access_log off;
client_max_body_size 20m;
client_header_buffer_size 64k;
large_client_header_buffers 4 64k;
client_body_buffer_size 100m;
gzip_buffers 16 8k;
proxy_buffer_size 64k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
keepalive_timeout 6000;
fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
proxy_connect_timeout 600s;
proxy_send_timeout 1200;
proxy_read_timeout 1200;
server_tokens off;

upstream myapp{
ip_hash;|sticky;
server 127.0.0.1:5200 ;
server 127.0.0.1:5300 ;
}
server {
listen 80;
server_name your.site.com ;
rewrite ^(.*) https://$server_name$1 permanent;
}
server {
listen 443 ssl;
server_name your.site.com ;
error_page 497 https://$http_host$request_uri;
ssl_certificate cert/server.crt;
ssl_certificate_key cert/server.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
valid_referers none blocked server_names;
if ($invalid_referer = "1") {
return 403;
}
location / {
add_header 'Access-Control-Allow-Origin' "$http_origin";
add_header 'Access-Control-Allow-Credentials' "true";
proxy_pass http://myapp ;
}
location ^~ /api/runtime/sys/v1.0/messagecenter {
proxy_pass http://myapp/api/runtime/sys/v1.0/messagecenter;
proxy_http_version 1.1;
proxy_read_timeout 3600s;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
}

Nginx配置模板

  • 双向SSL认证模板
worker_processes  auto;
events {
worker_connections 10240;
}
http {
client_header_timeout 600;
client_body_timeout 600;
client_max_body_size 300m;
proxy_send_timeout 600;
proxy_read_timeout 600;
include mime.types;
default_type application/octet-stream;
access_log off;
sendfile on;
keepalive_timeout 65;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 8;
gzip_types text/plain application/javascript text/css application/json text/javascript image/svg+xml image/png;
gzip_vary off;
upstream myapp {
ip_hash;
server 127.0.0.1:5200 weight=5 max_fails=1000 fail_timeout=10s;
}
server {
listen 80;
server_name www.myapp.com;
rewrite ^(.*)$ https://${server_name}$1 permanent;
}
server {
listen 443 ssl;
server_name www.myapp.com;
add_header Strict-Transport-Security "max-age=172800; includeSubDomains" ;
ssl_certificate /opt/myapp/cert/server.crt; # server证书公钥 或阿里云证书pem
ssl_certificate_key /opt/myapp/cert/server.key; # server私钥 或阿里云证书key
ssl_client_certificate /opt/myapp/cert/ca.crt; # 根级证书公钥,用于验证各个二级client
ssl_verify_client on; # 开启客户端证书验证
ssl_prefer_server_ciphers on;
ssl_early_data on;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1.3 ;
ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
proxy_set_header Host $http_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_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

location ^~ / {
proxy_pass http://myapp/;
}
}
}

Nginx配置模板

  • 本地文件浏览
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
sendfile on;
gzip on;
server {
listener 80;
server_name localhost;
location / {
root /myapp/;
autoindex on;
autoindex_localtime on ;
autoindex_exact_size off;
autoindex_localtime on;
}
}
}

Nginx配置模板

  • 同一端口多重vhost
   server {
listen 777;
server_name zhaobsh001.com;
location / {
root html001;
index index.html index.htm;
}
}
server {
listen 777;
server_name zhaobsh002.com;
location / {
root html002;
index index.html index.htm;
}
}

systemd管理Nginx

cat  << EOF > /etc/systemd/system/nginx.service 
[Unit]
Description=nginx

[Service]
Type=forking
ExecStart=/data/nginx/nginx -c /data/nginx/nginx.conf
Restart=always
LimitNOFILE=64000

[Install]
WantedBy=multi-user.target
EOF

Rpm打包模板

#DEFINES
%define _binaries_in_noarch_packages_terminate_build 0
%global __os_install_post %{nil}

Name: nginx
Version: opt
Release: 1%{?dist}
Summary: Rpm package for nginx ...

Group: nginx
License: GPL
URL: https://www.zhaobsh.com/
Source0: nginx/

BuildArch: x86_64
Autoreq: no

%changelog
* Sat Jan 01 2021 zhaobsh-author
Initial Version ...
%description
Rpm package for nginx

%install
app_dir=%{buildroot}/opt
mkdir -p $app_dir
echo pwd
echo %{SOURCE0}/nginx/
cp -r %{SOURCE0}/nginx/ $app_dir/

%files
%defattr(700,root,root)
/opt/nginx
%dir
/opt/nginx

Rpm打包并且添加service文件的模板

#DEFINES
%define _binaries_in_noarch_packages_terminate_build 0
%global __os_install_post %{nil}

Name: nginx
Version: data_1.23.0
Release: 1%{?dist}
Summary: Rpm package for nginx ...

Group: nginx
License: Copyright © zhaobsh
URL: https://www.zhaobsh.com/
Source0: nginx/
Source1: nginx.service
BuildArch: x86_64
Autoreq: no

%description
Rpm package for nginx

%install
app_dir=%{buildroot}/data
%{__install} -p -D %{SOURCE1} $RPM_BUILD_ROOT/etc/systemd/system/nginx.service
mkdir -p $app_dir
echo pwd
echo %{SOURCE0}/nginx/
cp -r %{SOURCE0}/nginx/ $app_dir/
cp -r %{SOURCE1} /etc/systemd/system/nginx.service
%files
%defattr(777,root,root)
/data/nginx
/etc/systemd/system/nginx.service
%dir
/data/nginx

自己编译打包nginx的容器镜像

以为自己的镜像里面需要有一套sticky或者是ssl_preread的套件.
一般情况下从公网上面拉下来的镜像是不带的.
另外为了解决一些字体语言等的问题, 也为了提高版本一般建议自己制作镜像.
这里简单说一下自己的思路:
比如自己编译了一个目录为 /data/nginx 为prefix的nginx二进制, 我可以进行如下操作
第一步, 写好nginx的配置文件.
比如为 应用服务器前后端分离的哪个, 指向应用的web目录. 可以在dockerfile中将应用一起copy进来.
第二步, 打包镜像 执行命令.

自己编译打包nginx的容器镜像

编写启动脚本:
/data/nginx/nginx -c /data/nginx/nginx.conf -g "daemon off;"
可以将文件保存为 /data/startnginx 并且赋予执行权限
注意必须添加 -g "daemon off;" 关闭后台运行 因为容器如果发现进程是后台运行的,会自动终止.
第二步编写dockerfile文件.

FROM centos:withxxxx
COPY data /data
COPY myapp /myapp
workdir /data
CMD ["sh","startnginx"]

语言以及字符容器镜像的打包过程

  • 以国产麒麟为例, 他是默认CentOS8的文件位置.
FROM kylin-server-10-sp2-aarch64:b09
RUN yum install fontconfig mkfontscale -y && yum clean all
ADD myfonts.tar.gz /usr/share/fonts/
WORKDIR /usr/share/fonts/
RUN fc-cache
ADD zh.tar.gz /usr/lib/locale
RUN export LANG=zh_CN.utf8
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

关于proxy_pass与proxy_redirect

proxy_pass是反向代理最常见的语法. 
其实所有的proxy_pass 都会默认带一个 proxy_redirect的语法
默认值是 auto ; 可以改为 off 或者是具体的值.

网上的介绍有很多, 我这边的理解为:
proxy_redirect的默认值auto的作用是将nginx负载的服务器地址在客户端浏览器的地址栏中显示为
server_name对应的url, 避免暴露后端正常的的服务器信息. 本质是一次重定向.

一般情况下auto 就足够了. 改为off会在前台浏览器显示后端的url地址,可能会早晨不必要的问题
如果后端服务无法与客户端直接连接, 刷新或者是进入下一步就会出现404的问题.

还有一个用途就是在级联nginx时能够将下级转发过来的地址予以修改, 避免连接失效.

一个很常见的场景是:
我API反馈一个url给客户,要求客户按照这个API打开特定的功能界面.
如果我双重nginx反向代理了. 第一层的负载均衡会将我实际后端服务器的url替换成upstream的server名称.
然后第二层获取到这个url一般情况下是无法解析的. 因为upstream的server一般仅是一个带哈,没有必须要的DNS解析.
此时就需要在第二层的反向代理处增加一次redirect.
具体语法为:
proxy_redirect http://first.level.upstream.name http://Second.level.servername.com ;
这样客户端浏览器打开时就可以再次进入双层反向代理, 最终找到正确的url地址,打开相应的页面.



标签:总结,ssl,nginx,server,学习,Nginx,proxy,timeout,root
From: https://blog.51cto.com/u_11529070/5737220

相关文章