我有一个非常简单的nginx
,所以我的本地服务可以很好地从外部访问。
这是配置
user httpdusr everyone;
#####################
worker_processes 1;
events {
worker_connections 1024;
}
http {
server {
listen 80;
include /opt/etc/nginx/mime.types;
location / {
try_files $uri$args $uri$args/ index.html;
root /share/CE_CACHEDEV1_DATA/Web/fitness/;
}
auth_basic "Restricted";
auth_basic_user_file /share/Web/.htpasswd
}
server {
listen 80;
server_name service1.domain.com;
location / {
proxy_pass http://localhost:9091;
}
}
server {
listen 80;
server_name service2.domain.com;
location / {
proxy_pass http://localhost:8080;
}
}
server {
listen 80;
server_name service3.domain.com;
location / {
proxy_pass http://192.168.1.1;
}
proxy_set_header Host $host;
}
server {
listen 80;
server_name service4.domain.com;
location / {
proxy_pass http://localhost:32400;
}
}
server {
listen 80;
server_name service5.domain.com;
location / {
proxy_pass http://localhost:5601;
}
auth_basic "Restricted";
auth_basic_user_file /share/Web/.htpasswd;
}
}
我不是 NGINX 专家,这是我在几个教程中总结出来的。但是,正如你所见,服务的数量在增长,重复性也越来越大。作为一名开发人员……这让我内心很痛苦 :-)
我知道这是可能的,但我不知道如何获得像这样的共同部分:
common() {
listen 80;
server_name <param1>;
location / {
proxy_pass <param2>;
}
}
然后像使用它一样
common(service1.domain.com, http://localhost:9091)
谢谢!
答案1
您可以使用 Nginx包括函数,但不能使用参数。除了一些自己开发的模板系统之外,我不知道还有什么方法可以实现你想要的。我不会费心。
长手写的 Nginx 配置文件很好,而且易于维护。一旦达到数千行,管理起来就会更加困难,但对于您的规模来说,这通常不是问题。
对于组织而言,最好每个域都有一个文件,其中包含与 http / https、子域等所需的服务器块数量相同的服务器块。主 Nginx 文件包含它们。您可以在配置文件之间包含完全相同的代码,如下所示。
/etc/nginx/nginx.conf
include /etc/nginx/enabled-sites/*;
/etc/nginx/enabled-sites/site1.conf
server {
location / {
// etc
}
include /etc/nginx/fragments/security-headers;
}
/etc/nginx/fragments/安全标头
# Security headers
add_header Strict-Transport-Security "max-age=2592000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header Content-Security-Policy "default-src 'self' www.google-analytics.com ajax.googleapis.com www.google.com google.com gstatic.com www.gstatic.com connect.facebook.net facebook.com;";
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy "origin";
答案2
这里有多种选项可以解决您的问题。
一种方法是使用http://nginx.org/r/map指示:
map $host $pphost {
hostnames;
default http://127.0.0.1:29159;
service1.example.org http://127.0.0.1:9091;
service2.example.org http://127.0.0.1:8080;
}
server {
listen 80;
server_name service1.example.org service2.example.org …;
location / {
proxy_pass $pphost;
}
}
server {
listen 29159;
return 200 $http_host\n$request_uri\n200\tOK;
# this is simply used as the defailt fallback,
# to avoid having proxy_pass within an extra if
}
另一种方法是使用http://nginx.org/r/include指令,连同处理服务器配置各种变化的脚本,用您喜欢的语言编写。
请注意,虽然你不能使用http://nginx.org/r/set在任何上下文中 — 它需要server
,location
或if
— 您可以include
在任意上下文中使用。至于map
,它实际上只能在上下文中全局定义http
(例如,与 where goes 处于同一级别server
),因此,这是配置您的首选项的完美方式。