宿主机放行docker的网卡请求起因docker里头装了个nginx，有一天因为防火墙调整了导致docker中的nginx出现No Router To Host错误步骤ifconfig查看docker的网卡名称，我这边是docker0执行以下命令对docker的网卡放行所有请求firewall-cmd --permanent --zone=trusted --change-interface=docker0重载防火墙即可firewall-cmd --reload
nginx配置http强制重定向至https以及过程中遇到的坑
nginx配置http强制重定向至https以及过程中遇到的坑重定向的常规配置server { listen 80; server_name xxx.cn; rewrite ^(.*)$ https://${server_name}$1 permanent; }如果server中的80端口和443端口写在一起的，也可以使用这段配置if ($server_port !~ 443){ rewrite ^(/.*)$ https://$host$1 permanent; }这是一种常规的配置方式，宝塔中的强制重定向，就是使用的这段配置坑rewrite 是301跳转在post关闭自动重定向后可以发现执行了301重定向到https页面，而这个时候，POST请求中的body已经全部丢失，程序也报错没有接收到参数301、302 只支持 GET 请求，如果是 POST 请求，重定向后会使用 GET 请求且 Body 数据会丢失解决要想解决也很简单，只需要使用307进行重定向即可307、308 支持 POST 请求，在 POST 重定向的时候会带上原来请求的 Body 再请求新的地址，Body 数据不会丢失配置如下：server { listen 80; server_name xxx.cn; # rewrite ^(.*)$ https://${server_name}$1 permanent; return 307 https://${server_name}$request_uri; }或者if ($server_port !~ 443){ # rewrite ^(/.*)$ https://$host$1 permanent; return 307 https://${server_name}$request_uri; }扩展资料
nginx开启https需要编译ssl，否则会报错the "ssl" parameter requires ngx_http_ssl_module一、安装编译时所需依赖库：yum -y install openssl openssl-devel pcre pcre-devel zlib zlib-devel二、安装nginx下载nginx安装包wget http://nginx.org/download/nginx-1.23.1.tar.gz解压nginx-1.23.1.tar.gztar -zxvf nginx-1.23.1.tar.gz进入nginx目录cd nginx-1.23.1编译nginx配置如果原来已经编译安装了nginx，prefix和原来一样即可，编译的时候会自动把原nginx备份，并且配置也会保留，无需担心，为了安全起见，可以把原来的安装文件夹备份一份# 要注意，nginx的源码文件夹，不要和--prefix的输出路径相同，不然make install可能会出现问题 ./configure --prefix=/usr/local/nginx --user=www --group=www --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module编译make && make install启动nginx/usr/local/nginx/sbin/./nginx实用指令查看nginx编译了什么cd /usr/local/nginx/sbin/./nginx -V #查看编译了什么，安装位置可能不一样，需要按自己实际来
因为需要将应用服务器之外的另一台文件服务器的ip地址隐藏，并且需要记录文件访问记录，以及需要对request的请求做一些处理，nginx实现这些相当麻烦，因此直接用Java写一个反向代理，简单明了。utils相当于使用流拷贝的方式，将获取到的newUrl的response，拷贝到客户请求的response中，这样就实现了转发 import org.springframework.http.HttpMethod; import org.springframework.http.client.ClientHttpRequest; import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.util.StreamUtils; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URI; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; public class ProxyUtil { public static void proxy(URI newUri, HttpServletRequest request, HttpServletResponse response) throws IOException { String methodName = request.getMethod(); HttpMethod httpMethod = HttpMethod.resolve(methodName); if(httpMethod == null) { return; } ClientHttpRequest delegate = new SimpleClientHttpRequestFactory().createRequest(newUri, httpMethod); Enumeration<String> headerNames = request.getHeaderNames(); // 设置请求头 while (headerNames.hasMoreElements()) { String headerName = headerNames.nextElement(); Enumeration<String> v = request.getHeaders(headerName); List<String> arr = new ArrayList<>(); while (v.hasMoreElements()) { arr.add(v.nextElement()); } delegate.getHeaders().addAll(headerName, arr); } StreamUtils.copy(request.getInputStream(), delegate.getBody()); // 执行远程调用 ClientHttpResponse clientHttpResponse = delegate.execute(); response.setStatus(clientHttpResponse.getStatusCode().value()); // 设置响应头 clientHttpResponse.getHeaders().forEach((key, value) -> value.forEach(it -> { response.setHeader(key, it); })); StreamUtils.copy(clientHttpResponse.getBody(), response.getOutputStream()); } }controller//经过/proxy/**的地址都会返回192.168.1.1的结果，相当于nginx反向代理的效果 @RequestMapping(value = "/proxy/**") public void proxy(HttpServletRequest request, HttpServletResponse response){ String path = uri.getPath(); URI newUri = new URI("http://192.168.1.1" + path.replace("/proxy","")) ProxyUtil.proxy(newUri,request,response); }这样加上后，所有经过/proxy/**的地址都会走一遍Java代码，你可以在代码中增加登录验证等功能
[quote color="success"]在windows下搭建nginx+php环境时，php-cgi.exe会经常性的自动关闭退出，经常莫名其妙的就502了，去服务器一看，php服务已经停止运行[/quote]由于windows没有linux的守护进程那种东西，因此之前php服务用的是winsw实现开机自启加后台运行，不然直接执行php-cgi.exe -b 127.0.0.1:9000 -c php.ini会有黑框框，很难受。然而winsw似乎并不支持守护运行，即进程退出后无法重启，服务中设置重启也没用。然后就在网上找了个windows下的php-cgi进程管理器，该进程管理器需要用到pthreadGC2.dll。经测试win64平台可以用下载地址：http://down.chinaz.com/soft/31157.htm下载完解压，将bin中的文件复制到php安装目录新建一个start.bat用来启动守护进程，在中间写入后运行就可以启动守护进程了：xxfpm "php-cgi.exe -c php.ini" -n 5 -i 127.0.0.1 -p 9000xxfpm的操作参数如下：Usage: xxfpm path [-n number] [-i ip] [-p port] Manage FastCGI processes. -n, --number number of processes to keep -i, --ip ip address to bind -p, --port port to bind, default is 8000 -u, --user start processes using specified linux user -g, --group start processes using specified linux group -r, --root change root direcotry for the processes -h, --help output usage information and exit -v, --version output version information and exit如果要去掉恼人的黑框框，可以将bat丢到winsw中运行，并且实现开机自启winsw.xml： php-cgi php-cgi php服务端 start.bat reset 参考链接：https://www.cnblogs.com/fogwang/p/5507594.html