『壹』 .nginx第一次的启动的时候会创建哪些文件
nginx是个多进程web容器,不同的配置下它的启动方式也是不同的,这里我只说说最典型的启动方式。它有1个master进程,和多个worker进程(最优配置的数量与CPU核数相关)。那么,首先我们要找到main函数,它在src/core/nginx.c文件中。谈到源码了,这时我们先简单看下源码的目录结构吧。nginx主要有下列目录:src/core,这个目录存放了基础的数据结构像LIST、红黑树、nginx字符串,贯穿始终的一些逻辑结构如ngx_cycle_s、ngx_connection_s等,还有对一些底层操作的封装如log、文件操作、共享内存、内存池等,最后还有个nginx.c这个main启动函数了。src/event,这个目录下存放与抽象事件相关的结构和钩子函数。nginx是以事件驱动处理流程的,事件自然是整个体系的核心了,这里定义了最核心的ngx_event_s结构。src/event/moles目录存放了具体的种种事件驱动方式,例如epoll、kqueue、poll、aio、select等,它们通过ngx_event_actions_t结构体中的钩子挂在nginx中。nginx启动时会根据配置来决定使用哪种实现方式。src/os/unix中存放了unix系统下许多函数调用的UNIX实现。src/http目录存放到http mole的相关实现,这个mole负责处理http请求,包括协议的解析以及访问backend server的代码。src/http/mole目录存放http mole类型的一些特定用途的mole,比如gzip处理加密,图片压缩等。有个初步了解后,回到main函数中,顺序看看我们感兴趣的事情。它先执行了ngx_time_init,为什么要初始化时间呢?nginx考虑的还是很周到的,取系统时间gettimeofday是系统调用,这意味着,需要发送中断给linux内核,内核需要做进程间切换来处理这个调用。这是一个不能忽视成本的函数。nginx封装了时间函数,这样,每次我们需要处理时间时,并不是调用gettimeofday,而是nginx自己缓存的时间,这样大量减少了系统调用,取当前时间这事可是谁都爱干的。那么,nginx是怎么维护自己的这个时钟呢?如何保证用户取到的当前时间是有意义的?nginx设计者的出发点是,nginx是事件驱动机制,当一批事件发生时,也就是epoll_wait返回时,会取一次gettimeofday来更新自己的时间,然后调用各个事件对应的处理函数。这些函数都会保证自己是无阻塞的,也就是毫秒级的处理能力,所以,在任何一个事件处理函数中,取到的时间都是之前epoll_wait刚返回时取到的时间,这样,即使拿到的时间慢了几毫秒也无所谓。关键是,每个函数都是无阻塞的,都要迅速的把控制权交还给nginx,这是基本设计原则哈。
『贰』 nginx配置文件中怎么把hostname的值赋给其它变量
Nginx 的配置文件使用的就是一门微型的编程语言,许多真实世界里的 Nginx 配置文件其实就是一个一个的小程序。当然,是不是“图灵完全的”暂且不论,至少据我观察,它在设计上受 Perl 和 Bourne Shell 这两种语言的影响很大。在这一点上,相比 Apache 和 Lighttpd 等其他 Web 服务器的配置记法,不能不说算是 Nginx 的一大特色了。既然是编程语言,一般也就少不了“变量”这种东西(当然,Haskell 这样奇怪的函数式语言除外了)。熟悉 Perl、Bourne Shell、C/C++ 等命令式编程语言的朋友肯定知道,变量说白了就是存放“值”的容器。而所谓“值”,在许多编程语言里,既可以是 3.14 这样的数值,也可以是 hello world 这样的字符串,甚至可以是像数组、哈希表这样的复杂数据结构。然而,在 Nginx 配置中,变量只能存放一种类型的值,因为也只存在一种类型的值,那就是字符串。比如我们的 nginx.conf 文件中有下面这一行配置:set $a "hello world";我们使用了标准 ngx_rewrite 模块的 set 配置指令对变量 $a 进行了赋值操作。特别地,我们把字符串 hello world 赋给了它。我们看到,Nginx 变量名前面有一个 $ 符号,这是记法上的要求。所有的 Nginx 变量在 Nginx 配置文件中引用时都须带上 $ 前缀。这种表示方法和 Perl、PHP 这些语言是相似的。虽然 $ 这样的变量前缀修饰会让正统的 java 和 C# 程序员不舒服,但这种表示方法的好处也是显而易见的,那就是可以直接把变量嵌入到字符串常量中以构造出新的字符串:set $a hello;set $b "$a, $a";这里我们通过已有的 Nginx 变量 $a 的值,来构造变量 $b 的值,于是这两条指令顺序执行完之后,$a 的值是 hello,而 $b 的值则是 hello, hello. 这种技术在 Perl 世界里被称为“变量插值”(variable interpolation),它让专门的字符串拼接运算符变得不再那么必要。我们在这里也不妨采用此术语。我们来看一个比较完整的配置示例:server {listen 8080;location /test {set $foo hello;echo "foo: $foo";}}这个例子省略了 nginx.conf 配置文件中最外围的 http 配置块以及 events 配置块。使用 curl 这个 HTTP 客户端在命令行上请求这个 /test 接口,我们可以得到$ curl 'http://localhost:8080/test'foo: hello这里我们使用第三方 ngx_echo 模块的 echo 配置指令将 $foo 变量的值作为当前请求的响应体输出。我们看到,echo 配置指令的参数也支持“变量插值”。不过,需要说明的是,并非所有的配置指令都支持“变量插值”。事实上,指令参数是否允许“变量插值”,取决于该指令的实现模块。如果我们想通过 echo 指令直接输出含有“美元符”($)的字符串,那么有没有办法把特殊的 $ 字符给转义掉呢?答案是否定的(至少到目前最新的 Nginx 稳定版 1.0.10)。不过幸运的是,我们可以绕过这个限制,比如通过不支持“变量插值”的模块配置指令专门构造出取值为 $ 的 Nginx 变量,然后再在 echo 中使用这个变量。看下面这个例子:geo $dollar {default "$";}server {listen 8080;location /test {echo "This is a dollar sign: $dollar";}}测试结果如下:$ curl 'http://localhost:8080/test'This is a dollar sign: $这里用到了标准模块 ngx_geo 提供的配置指令 geo 来为变量 $dollar 赋予字符串 "$",这样我们在下面需要使用美元符的地方,就直接引用我们的 $dollar 变量就可以了。其实 ngx_geo 模块最常规的用法是根据客户端的 IP 地址对指定的 Nginx 变量进行赋值,这里只是借用它以便“无条件地”对我们的 $dollar 变量赋予“美元符”这个值。在“变量插值”的上下文中,还有一种特殊情况,即当引用的变量名之后紧跟着变量名的构成字符时(比如后跟字母、数字以及下划线),我们就需要使用特别的记法来消除歧义,例如:server {listen 8080;location /test {set $first "hello ";echo "${first}world";}}这里,我们在 echo 配置指令的参数值中引用变量 $first 的时候,后面紧跟着 world 这个单词,所以如果直接写作 "$firstworld" 则 Nginx “变量插值”计算引擎会将之识别为引用了变量 $firstworld. 为了解决这个难题,Nginx 的字符串记法支持使用花括号在 $ 之后把变量名围起来,比如这里的 ${first}. 上面这个例子的输出是:$ curl 'http://localhost:8080/testhello worldset 指令(以及前面提到的 geo 指令)不仅有赋值的功能,它还有创建 Nginx 变量的副作用,即当作为赋值对象的变量尚不存在时,它会自动创建该变量。比如在上面这个例子中,如果 $a 这个变量尚未创建,则 set 指令会自动创建 $a 这个用户变量。如果我们不创建就直接使用它的值,则会报错。例如123456 server {listen 8080;location /bad {echo $foo;}}此时 Nginx 服务器会拒绝加载配置:1 [emerg] unknown "foo" variable是的,我们甚至都无法启动服务!有趣的是,Nginx 变量的创建和赋值操作发生在全然不同的时间阶段。Nginx 变量的创建只能发生在 Nginx 配置加载的时候,或者说 Nginx 启动的时候;而赋值操作则只会发生在请求实际处理的时候。这意味着不创建而直接使用变量会导致启动失败,同时也意味着我们无法在请求处理时动态地创建新的 Nginx 变量。Nginx 变量一旦创建,其变量名的可见范围就是整个 Nginx 配置,甚至可以跨越不同虚拟主机的 server 配置块。我们来看一个例子:server {listen 8080;location /foo {echo "foo = [$foo]";}location /bar {set $foo 32;echo "foo = [$foo]";}}这里我们在 location /bar 中用 set 指令创建了变量 $foo,于是在整个配置文件中这个变量都是可见的,因此我们可以在 location /foo 中直接引用这个变量而不用担心 Nginx 会报错。下面是在命令行上用 curl 工具访问这两个接口的结果: $ curl 'http://localhost:8080/foo'foo = [] $ curl 'http://localhost:8080/bar'foo = [32] $ curl 'http://localhost:8080/foo'foo = []从这个例子我们可以看到,set 指令因为是在 location /bar 中使用的,所以赋值操作只会在访问 /bar 的请求中执行。而请求 /foo 接口时,我们总是得到空的 $foo 值,因为用户变量未赋值就输出的话,得到的便是空字符串。从这个例子我们可以窥见的另一个重要特性是,Nginx 变量名的可见范围虽然是整个配置,但每个请求都有所有变量的独立副本,或者说都有各变量用来存放值的容器的独立副本,彼此互不干扰。比如前面我们请求了 /bar 接口后,$foo 变量被赋予了值 32,但它丝毫不会影响后续对 /foo 接口的请求所对应的 $foo 值(它仍然是空的!),因为各个请求都有自己独立的 $foo 变量的副本。对于 Nginx 新手来说,最常见的错误之一,就是将 Nginx 变量理解成某种在请求之间全局共享的东西,或者说“全局变量”。而事实上,Nginx 变量的生命期是不可能跨越请求边界的。
『叁』 如何安装在idea上使用docker+nginx+mongodb+springboot
这是一个新的用于Docker部署的运行/调试配置,它允许你指定云部署目标(即某个Docker文件),还可以为容器命名。要创建一个新的容器设置文件,首先选择“保存容器设置样本”,并注明目的地,目的地的Docker插件将创建一个默认的主机配置文件(用户..
『肆』 如何修改docker的nginx容器的配置
不推荐更改运行中的容器配置,容器本身是无状态的,当然也可以通过进入容器内部的方式进行更改:dockerexec-it这样的更改是无法持久化保存的,当容器重启后,更改就丢失了,正确的做法是将需要持久化保存的数据放在挂载的存储卷中,当配置需要改变时直接删除重建。
『伍』 如何配置Nginx,Apache服务器的alias和密码认证
从年前电脑换成linux系统后就没写东西,最近有点懒,在这里讲述下nginx alias 功能,不是server alias .首先看下看下apache 别名 怎么配置的:<VirtualHost *:80> DocumentRoot /www/hou.net/www 这是虚拟主机的根目录吧,但是phpMYadmin 不在这个目录下,想访问。 ServerName www.hou.net ServerAlias hou.net Alias /sdb "/www/public/phpMyAdmin/" 就需要 别名功能,:http://www.hou.com/sdb 这样就安全多了。 <Directory "/www/public/phpMyAdmin/"> Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory> </VirtualHost>一 .Apache认证认证的类型:BasicDigest摘要认证方法:A、容器认证: ……B、隐藏文件认证创建.htaccess文件方法一、容器认证A、 进入配置文件 vi /etc/httpd/conf/httpd.confB、 配置:大约在531行附近 配置如下:AllowOverride None ##不允许通过隐藏认证,即通过容器认证AuthType Basic ##认证类型为BasicAuthName “ajian” ##认证名字为AjianAuthUserFile /var/www/passwd/pass ##pass 为认证密码文件,指定密码文件存放的位置。Require valid-user ##有效用户(注意大小写,因为word的原因有些大小写有变化)C、 创建目录 mkdir -p /var/www/passwd进入目录 cd /var/www/passwdD、创建Apache用户 htpasswd -c pass ajian ##pass 为密码文件Ajian为用户更改 把Pass文件的使用权给Apache: chown apache.apache pass附:再在Pass文件中添加一个用户:htpasswd pass tt ##添加一个TT的用户到Pass文件中E、重启服务并测试方法二、通过隐藏认证和上面差不多 不过配置不一样Httpd主配置文件AllowOverride AuthConfig创建隐藏文件并放到要通过认证的目录Eg: vi /var/www/html/mrtgAuthType BasicAuthName “Ajian”AuthUserFile /var/www/passwd/passRequire valid-user 下面是例子 二、Nginx 登录认证nginx 的 http auth basic 的密码是用 crypt(3) 加密的。用 apache 的 htpasswd 可以生成密码文件。没有 apache 自行安装。我安装的是 apache2,/usr/local/apach2。cd /usr/local/nginx/conf /usr/local/apache2/bin/htpasswd -c -d pass_file user_name #回车输入密码,-c 表示生成文件,-d 是以 crypt 加密。 vi nginx.conf cd /usr/local/nginx/conf /usr/local/apache2/bin/htpasswd -c -d pass_file user_name #回车输入密码,-c 表示生成文件,-d 是以 crypt 加密。 vi nginx.conf在 nginx.conf 文件中加入授权声明。这里要注意 nginx 0.6.7 开始,auth_basic_user_file 的相对目录是 nginx_home/conf,以前版本的相对目录是 nginx_home。server { listen 80; server_name tuan.xywy.com; root /www/tuangou; index index.html index.htm index.php; autoindex on; auth_basic "input you user name and password"; auth_basic_user_file htpasswd.file; location ~ .php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /www/tuangou$fastcgi_script_name; include fastcgi_params; }error_page 404 /404.php; error_page 403 /404.php; access_log /logs/tuan_access.log main;}针对目录的认证,在一个单独的location中,并且在该location中嵌套一个解释php的location,否则php文件不会执行并且会被下载。auth_basic在嵌套的location之后。server { listen 80; server_name tuan.xywy.com; root /www/tuangou; index index.html index.htm index.php; autoindex on; location ~ ^/admin/.* { location ~ \.php$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME /www/tuangou$fastcgi_script_name;include fastcgi_params; } root /www/tuangou/ ; auth_basic "auth"; auth_basic_user_file htpasswd.file; } location ~ .php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; } access_log /logs/tuan_access.log main;}三.nginx alias功能配置自动列目录 server { listen www.hou.com:88; server_name www.hou.com; autoindex on; //开启列目录功能。 # charset gbk; location /club { 访问的名字http://www.hou.com:88/club alias /www/clublog/club.xywy.com/; 这是服务器上存放日志的地方} 这段意思 访问www.hou.com:88/club 就看到club目录的东东了。 location /{ root /www/access; 这段location 也可以没有 www.hou.com:88 出来的是默认nxing 页面 # index index.html index.htm index.php; } error_page 500 502 503 504 /50x.html; location = /50x.html {root html; } }上面nginx配置意思就是: 访问http://hou.xywy.com/:88认证进去是默认访问服务器上/www/access/里面的目录,认证进去后url=http://hou.xywy.com:88/club 就出来 /www/clublog/club.xywy.com/ 里面的目录的内容了。,可能很绕,仔细分析就好了。root 和 alias 的区别。最基本的区别:alias指定的目录是准确的,root是指定目录的上级目录,并且该上级目录要含有location指定名称的同名目录。另外,根据前文所述,使用alias标签的目录块中不能使用rewrite的break。这样在看这段就很清晰了,location /abc/ {alias /home/html/abc/;}在这段配置下,http://test/abc/a.html就指定的是/home/html/abc/a.html。这段配置亦可改成location /abc/ {root /home/html/;}这样,nginx就会去找/home/html/目录下的abc目录了,得到的结果是相同的。但是,如果我把alias的配置改成:location /abc/ {alias /home/html/def/;}那么nginx将会从/home/html/def/取数据,这段配置还不能直接使用root配置,如果非要配置,只有在/home/html/下建立一个 def->abc的软link(快捷方式)了。一般情况下,在location /中配置root,在location /other中配置alias是一个好习惯。至于alias和root的区别,我估计还没有说完全,如果在配置时发现奇异问题,不妨把这两者换换试试。刚开始我也搞来高去搞了很久包括认证单独一个目录 CGI 问题,希望大家成功。出现问题可以向我咨询大家共同进步!
『陆』 docker如何修改nginx配置
如果是挂载的配置文件,外面修改,然后重启docker容器;如果不是挂载的配置文件,docker exec -it 容器ID /bin/sh进入容器修改并重启NGINX。
『柒』 java 怎么向nginx web服务器传输文件
搭建项目部署的环境购买服务器首先需要去阿里云购买服务器。本人购买的是Windows Server 2008,刚开始购买了基于Linux的各种系统(Ubuntu、CentOS、AliyunLinx、Debian),由于没有Linux操作基础,最后都没有鼓捣成功,还是先用Windows Server练练手,等了解了大体流程之后在迁移到Linux上。这是我购买的阿里云ECS实例2之后使用Windows操作系统自带的“远程桌面连接”工具直接连接到远程服务器:连接成功之后就会进入到熟悉的Windows操作系统的桌面了,之后就可以安装各种部署的软件,如JDK、MySQL Database、Tomcat等常用的工具,和在本机上操作并无不同。3购买域名服务器可以正常访问了,那么接下来就需要购置一个域名,通过域名即可跳转到相应的服务器IP,进而让所有的人都可以访问。由于我的服务器是在阿里云购买的,阿里云和万网合并了,那么直接在阿里云中就可以一站式搞定。4stevejrong.top即我购买的域名。选择一个域名后,点击“解析”以将域名映射到刚才开通的服务器上:这里万网做了详细的介绍,在此就不多讲如何映射了。5域名备案要想真正让所有人都能访问网站,那么就需要备案。由于服务器是在阿里云购置的,而阿里云和万网的服务现在已经合并,所以可以轻松申请备案。部署项目域名和服务器都准备好了,那么现在可以发布项目了。这里我采用了Nginx反向代理服务器和Tomcat容器组合共同来支撑整个网站的运行。Nginx负责拦截并转发客户端发来的请求,它并不做页面的解析等工作,这些工作都交给Tomcat去处理,因为Nginx擅长处理请求,是一个高性能的反向代理服务器,它几乎没有处理Servlet请求的能力,所以要配合一个能够处理Servlet的容器共同协作,当然,Servlet容器有很多,如Resin、JBoss、Tomcat、GlassFish等等,选择Servlet容器就因人而异了,看自己喜欢用什么,还有一些适应的场景和环境。没有最好的,只有最适合的。Tomcat也未必最垃圾,只是看操作者的水平,能否合理优化是一个难题安装和配置Nginx解压后得到如下几个文件和文件夹:打开conf目录下的nginx.conf文件,这个文件是Nginx服务器的配置文件:配置代码和解释如下:#user nobody;#工作进程数worker_processes 2;#错误日志#error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log info;#进程保存文件#pid logs/nginx.pid;#等待事件events {#每个进程的最大连接数(最大连接数=连接数 * 进程数)worker_connections 2048;}http {#文件扩展名和文件类型映射include mime.types;#默认文件类型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 logs/access.log main;#是否开启发送文件支持sendfile on;#tcp_nopush on;#活动连接超时时间#keepalive_timeout 0;keepalive_timeout 65;#是否开启gzip压缩支持#gzip on;#第一个虚拟主机server {#监听到的端口listen 80;#主机名称server_name www.stevejrong.top;#设置字符编码格式#charset koi8-r;#本地虚拟主机的访问日志#access_log logs/host.access.log main;
『捌』 如何对 docker 容器里的 nginx 进行热更新
通常都会选择把nginx的配置文件放在docker宿主机上,然后在宿主机完成配置的修改后reload容器中的nginx就好了 docker exec -i [nginx容器名/id] nginx -s reload