Nginx是一款高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。其特点包括:

  1. 稳定性和功能集:Nginx的源代码以类BSD许可证的形式发布,其稳定性和丰富的功能集,以及简单的配置文件和低系统资源的消耗而闻名。
  2. 轻量级和反向代理:Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。
  3. 负载均衡:Nginx作为反向代理服务器,通过代理的方式可以有效地实现负载均衡,分发用户请求到不同的后端服务器上。这有助于提高系统的可伸缩性和可靠性。
  4. 正向代理和反向代理的区别:正向代理是指客户端通过代理服务器访问目标服务器,客户端需要手动设置代理服务器的IP和端口号;而反向代理是指客户端对代理是无感知的,客户端不需要任何配置就可以访问,只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后返回给客户端。

对于Nginx的使用,最重要的是理解每个配置项的作用。所以一份详细的Nginx的配置对于JAVA开发和运维尤为重要。我们一般使用两个Nginx配置文件对Nginx进行配置,一个是公共文件nginx。conf,一个是自定义文件 比如某个项目的nginx文件。nginx_1.conf。然后通nginx.conf 把 nginx_1.conf包含进去。

下面上各项配置信息详解》

########### 每个指令必须有分号结束。#################
#user administrator administrators;  #配置用户或者组,默认为nobody nobody。
worker_processes 8;  #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  65535;    #最大连接数,默认为512
}
http {
    include       mime.types;   #文件扩展名与文件类型映射表
    default_type  application/octet-stream; #默认文件类型,默认为text/plain
    #access_log off; #取消服务日志    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
    access_log log/access.log myFormat;  #combined为日志格式的默认值
    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。

    upstream mysvr {   
      server 127.0.0.1:8080;
      server 192.168.10.121:8081 backup;  #热备
    }
    error_page 404 https://www.baidu.com; #错误页
    server {
        keepalive_requests 120; #单连接请求上限次数。
        listen       4545;   #监听端口
        server_name  127.0.0.1;   #监听地址       
        location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           #root path;  #根目录
           #index vv.txt;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip           
        } 
    }
}

#user  nobody;
# CPU核心数-1
worker_processes  3;
# nginx错误日志的目录
#error_log  logs/error.log;
error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
# nginx进程id记录文件路径
pid        logs/nginx.pid;
# 单个进程可打开的最大文件数量
worker_rlimit_nofile 1024;
events {
	# epoll 模型对事件处理进行优化
	use epoll;
	# 客户端最大连接数,建议与单个进程可打开的最大文件数量保持一致
    worker_connections  1024;
}
http {
	#  隐藏nginx版本信息
	server_tokens off;
    include       mime.types;
    default_type  application/octet-stream;
	# 日志格式
	log_format  main  '[time:$request_time s] $remote_addr - $remote_user [$time_local] "$request" '  
			  '$status $body_bytes_sent "$http_referer" '
			  '"$http_user_agent" "$http_x_forwarded_for"'
			  '$upstream_addr $upstream_response_time $request_time $upstream_status '
					  '"$http_range" "$sent_http_content_range"'
					  '"$gzip_ratio"'
					  '"$query_string"' 
	'"-http_refer:$http_referer"';	
	# nginx日志缓存,降低日志IO。
	open_log_file_cache max=10240 inactive=60s valid=1m min_uses=2;
	# 文件上传大小
	client_max_body_size 100m;
	client_header_buffer_size 64k;
	large_client_header_buffers 4 4k;
	# 压缩配置
	gzip on;
	gzip_min_length 2k;
	gzip_buffers 4 16k;
	gzip_comp_level 3;
	gzip_vary on;
	gzip_types text/plain application/x-javascript application/javascript application/css  text/css application/xml application/json;
	#	缓存配置
	proxy_connect_timeout 3600s;# Nginx与代理的服务连接超时时间(Nginx请求代理服务)
	proxy_read_timeout 3600s;   # Nginx从代理服务读取文件超时时间
	proxy_send_timeout 3600s;	# Nginx向代理服务写入文件超时时间
	proxy_buffer_size 512k;		# 客户端请求头header大小
	proxy_buffers 64 512k;		# 缓冲区的大小和数量
	proxy_busy_buffers_size 512k;	#
	proxy_temp_file_write_size 512k;	#
	## 当上游服务器的响应过大不能存储到配置的缓冲区域时,Nginx存储临时文件硬盘路径 ,设置为服务器上存在的目录
	proxy_temp_path /usr/local/nginx1.20/cache_temp_path;
	# 注意【cache_one】,后续的location会用到
	proxy_cache_path /usr/local/nginx1.20/cache_path levels=1:2 keys_zone=cache_one:500m inactive=1d max_size=10g use_temp_path=off;
	# proxy_cache_key $host$request_uri;
	client_body_buffer_size 10240k;
	output_buffers 8 64k;
	postpone_output 1460;
	client_header_timeout 120s;
	client_body_timeout 120s;
    sendfile        on;
    keepalive_timeout  65;
	upstream cwbb {
	# 会话保持,必须安装sticky模块
	sticky name="hellosticky";
	server 192.168.137.121:8080 max_fails=5  fail_timeout=600s weight=10;
	server 192.168.137.121:8081 max_fails=5  fail_timeout=600s weight=10;
	server 192.168.137.121:8083 max_fails=5  fail_timeout=600s weight=10;
	server 192.168.137.121:8084 max_fails=5  fail_timeout=600s weight=10;
	check interval=3000 rise=2 fall=5 timeout=1000 type=http;
	}
    server {
        listen       80;
        server_name  localhost;
		
		# 如果没有配置https证书,则listen 443 ssl; ssl_certificate; ssl_certificate_key; ssl_session_cache; ssl_session_timeout;都可以用#注释
		#listen       443 ssl;
		#ssl_certificate      /usr/local/nginx1.20/cert/xxx.crt;
		#ssl_certificate_key  /usr/local/nginx1.20/cert/xxx.key;
		#ssl_session_cache    shared:SSL:10m;
		#ssl_session_timeout  5m;
		#ssl_ciphers  HIGH:!aNULL:!MD5;
		#ssl_prefer_server_ciphers  on;

		location ~* ^.+\.(jpg|jpeg|gif|png|js|ttf|css|json|)$ {
			proxy_pass http://cwbb;
			proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
			proxy_cache off;
			proxy_redirect off;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_connect_timeout 180;
			proxy_send_timeout 180;
			proxy_read_timeout 180;
			proxy_buffer_size 128k;
			proxy_buffers 4 128k;
			proxy_busy_buffers_size 128k;
			proxy_temp_file_write_size 128k;
			proxy_cache_valid 200 304 302 24h;
			proxy_cache_key   $server_addr$uri$is_args$args;
			add_header Cache-Control no-cache;
		}
		# check模块配置
        location /check_status {
                   check_status;
                   access_log off;
            }
        # stub模块配置
        location /stub_status {
                   stub_status;
                   access_log off;
            }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
		## 根目录访问 ,如果有其他需要代理的路径,则依次增加location即可
		location / {
			## 如果信息中心强制禁止不安全的请求类型,增加如下配置,GET|POST|HEAD是允许的请求类型
			if ($request_method !~ ^(GET|POST|HEAD)$) {
			      return 403 '{"timestamp":"2019-05-30T12:39:03.593","success":false,"errorCode":"403","errorMessage":"不安全的请求类型:$request_method","errorDetail":"不安全的URL:$request_uri","data":null}';
			}
			proxy_pass http://cwbb;
			limit_rate 400k;
			limit_rate_after 5m;
			proxy_connect_timeout 1200;
			proxy_send_timeout 1200s;
			proxy_read_timeout 1200s;
			proxy_redirect off;
			proxy_set_header Host $host;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			add_header Cache-Control no-cache;
		}
    }
}
http {//协议级别
  include mime.types;
  default_type application/octet-stream;
  keepalive_timeout 65;
  gzip on;
  upstream {//负载均衡配置
  …
  }
  server {//服务器级别,每个server类似于httpd中的一个
   listen 80;
    server_name localhost;
    location / {//请求级别,类似于httpd中的,用于定义URL与本地文件系统的映射关系
      root html;
     index index.html index.htm;
   }
  }
}

如:我的nginx公共配置

#配置用户或者组,默认为nobody
user  nginx;

#允许生成的进程数,默认为1,一般配置为cpu核数
worker_processes  auto;
#错误日志
error_log  /var/log/nginx/error.log notice;

#进程ID
pid        /var/run/nginx.pid;

events {

    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept off;  #设置一个进程是否同时接受多个网络连接,默认为off
	# epoll 模型对事件处理进行优化
    use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    #允许最大连接数
    worker_connections  65535;
}


http {
	#隐藏nginx版本信息
	server_tokens off;
	#文件扩展名与文件类型映射表
    include       /etc/nginx/mime.types;
	#默认文件类型,默认为text/plain
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;
	
	#连接超时时间,默认为75s,可以在http,server,location块。
    keepalive_timeout  65;

    #gzip  on;
    client_max_body_size 1024m;
	
	#包含的自定义配置文件块
    include /etc/nginx/conf.d/*.conf;

	#是否传递4xx和5xx错误信息到客户端,或者允许nginx使用error_page处理错误信息。
    fastcgi_intercept_errors on;
}

单机自定义server配置

#8561端口服务器
server {
    #监听端口
    listen 8561;
	#域名配置项
    server_name _;
	location  /h5 {
		root  /usr/share/nginx/html/;
		try_files $uri $uri/ /h5/index.html;
	} 

   location  /mhyr-project {
	 root  /usr/share/nginx/html/mhyr-project/;
	 try_files $uri $uri/ /index.html;
   } 
   #静态资源配置项
   location /resource/ {
		proxy_pass https://tenc.cos.ap-beij.myqcloud.com/;
	}
   #静态资源
   location /icon/ {
		root /usr/share/nginx/html/mhyr-project-plat;
		try_files $uri $uri/ /index.html;
	}		
   #反向代理
   location /mhyrproject/ {
	 proxy_set_header Host $host;
	 client_max_body_size 10m;
	 proxy_set_header X-Real-IP $remote_addr;
	 proxy_set_header REMOTE-HOST $remote_addr;
	 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	 proxy_pass http://localhost:8100/;
   }
 
	#错误页面配置项	 
	error_page   403 404  /404.html;
	location = /404.html {
		root  error;
	}

	# redirect server error pages to the static page /50x.html
	# error_page   500 502 503 504  /50x.html;
	location = /50x.html {
		root   html;
	}

}

#443端口服务器
server {
    listen 443 ssl http2;
	#域名配置项
    server_name t-project.mhyr.cn;
	#证书配置项
    ssl_certificate /etc/nginx/cert/mhyr.cn2022.txt;
	#证书秘钥配置项
    ssl_certificate_key /etc/nginx/cert/private2022_unsecure.key;
    
    ssl_prefer_server_ciphers on;
	#SSL协议配置项
    ssl_protocols TLSv1.2;
    location  /h5 {
        root  /usr/share/nginx/html/;
        try_files $uri $uri/ /h5/index.html;
    } 
 
   location /mhyrproject/ {
	 proxy_set_header Host $host;
	 client_max_body_size 10m;
	 proxy_set_header X-Real-IP $remote_addr;
	 proxy_set_header REMOTE-HOST $remote_addr;
	 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	 #反向代理
	 proxy_pass http://localhost:8100/;
   }

    location /resource/ {
        proxy_pass https://jt-mbr-uat-1301587776.cos.ap-beijing.myqcloud.com/;
    }

    location /icon/ {
        root /usr/share/nginx/html/mhyr-project-plat;
        try_files $uri $uri/ /index.html;
    }
         
    proxy_intercept_errors on;
    error_page  500 502 503 504 404 403   /404.html;
    #error_page 500 502 503 504 404 403 = https://project-test.mangocity.com/mhyr-project/#/error;
    location =  /404.html {
       root   /usr/share/nginx/html;
    }

    # redirect server error pages to the static page /50x.html
    # error_page   500 502 503 504  /50x.html;
    #location = /50x.html {
    #    root   html;
    #}
}

配置负载均衡的话需要:

#负载均衡配置

  # apisSrvice 为反向代理的服务名称   http://localhost:8100/;apisSrvice http://localhost:8100/;
upstream apisSrvice { 
    server  20.11.1.26:9100 max_fails=2  fail_timeout=5s;
    server  20.11.1.45:9100 max_fails=2  fail_timeout=5s;
    server  20.11.1.46:9100 max_fails=2  fail_timeout=5s;
    server  20.11.1.30:9100 max_fails=2  fail_timeout=5s;
    server  20.11.1.21:9100 max_fails=2  fail_timeout=5s;
}

Nginx配置SSL证书详解

# Nginx 如何添加对SSL的支持
# 需要安装 --with-http_ssl_module模块
# ssl指令:该指令用来在指定的服务器开启HTTPS,可以使用listen 443 ssl来开启
# 语法:ssl on | off;
# 默认:off
# 位置 http、server
server {
  lsten 443 ssl;
}

# ssl_certificate指令:为当前这个虚拟主机指定一个带有PEM格式证书的证书。
# 语法:ssl_ceritificate file;
# 默认:无
# 位置 http、server
ssl_ceritificate www.sohu.com.pem;

# ssl_certificate_key指令:为pem指定secret_key文件路劲。
# 语法:ssl_certificate_key file;
# 默认:无
# 位置 http、server
ssl_ceritificate www.sohu.com.key;

# ssl_session_cache指令:该指令用来配置用于SSL回话的缓存
# 语法: ssl_session_cache off | none | [builtin[:size]] [shared:name:size]
# 默认:none
# 位置 http、server
# off:禁用回话魂村,客户端不得重复使用会话
# none:禁止使用会话缓存,客户端可以重复使用,但是并没有在缓存中存储会话参数。
# builtin:内置OpenSSL缓存,仅在一个工作进程中使用
# shared:所有工作进程之间共享缓存,缓存的相关信息用name和size来指定
ssl_session_cache none;

# ssl_session_timeout:开启SSL会话功能后,设置客户端能够反复使用存储在缓存中的会话参数时间。
# 语法:ssl_session_timeout time;
# 默认:5m    //也就是5分钟
# 位置 http、server
ssl_session_timeout 5m;

# ssl_ciphers:支出允许的密码,密码指定为OpenSSL指定的密码格式。
# 语法:ssl_ciphers ciphers;
# 默认值:ssl_ciphers HIGH:!aNULL:!MD5;
# 位置 http、server
ssl_ciphers HIGH:!aNULL:!MD5;

# ssl_prefer_server_ciphers:该指令指定是否服务器密码优先客户端密码
# 语法:ssl_prefer_server_ciphers on | off
# 默认:off
# 位置 http、server
ssl_prefer_server_ciphers off

# SSL证书来源
# 1.去阿里云或者腾讯云或者其他证书机构购买或者申请SSL证书。
# 2.用OpenSSL去自己制作SSL证书
# OpenSSL生成证书的命令
mkdir /root/cert
cd /root/cert
openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -singnkey server.key -out server.crt

# 如何配置刚生成的SSL证书
server {  
  listen 443 ssl;
  server_name localhost;
  
  ssl_certificate cert.pem;
  ssl_certificate_key cert.key;
  
  ssl_session_cache shared:SSL:1m;
  ssl_session_timeout 5m;
  
  ssl_ciphers HIGH:!aNULL:MD5;
  ssl_prefer_server_ciphers on;
  
  location / {
    root html;
    index index.html;
  }
}
# 再次重启的时候浏览器还是会报错,是因为我们自己生成的证书是没有认证机构的。要不报错就必须从认证机构哪里获得证书。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐