背景
centos7安装nginx比较麻烦,还是docker安装比较香。
dokcer安装nginx比较简单,而且教程很多,那为什么还要总结?
这篇文章主要是规范化nginx对项目的反向代理,明显的特征是一个项目一个"项目名.conf"的配置文件,方便于同一管理。
docker安装nginx
正常安装nginx
docker正常安装nginx比较简单,如下:
下载镜像
docker pull nginx
这里不加版本,默认下载最新版本
运行容器
docker run -p 80:80 --name nginx -v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /root/nginx/logs:/var/log/nginx -d nginx
将nginx的配置文件和日志文件挂载到容器里。
缺点
像这样正常安装nginx,宿主机和容器映射端口,指定目录挂载文件,在后续会带来很多的问题,存在很多的缺点:
- 运行容器时就已经确定映射端口,但之后项目反向代理的端口确是不确定的,这样就不能反向代理其他端口
- 宿主机与容器的挂载目录定死,在宿主机中基本只能操作
/etc/nginx/nginx.conf
,如果项目很多很多的话,那么这个文件当中,将会有大量的Server配置,不方便项目管理。
所以可以采用容器共享宿主机端口,只挂载一个目录,以后再容器中建立软连接,让宿主机可以操作或者共享容器文件(类似于win10的桌面快捷方式思想),具有动态性。
共享宿主机端口,动态映射式运行nginx容器
运行容器命令
docker run -it --name nginx --net host -v /root/project:/var/www/html -v /root/nginx:/nginx_conf -d nginx
命令详解:
-d
后台运行--name
容器名-v
宿主机目录与容器目录进行挂载(可以共享)-v /root/project:/var/www/html
是将宿主机/root/project
与容器/var/www/html
关联,以后所有的项目都建立在/root/project
下,因为关联在/var/www/html
,所以容器可以访问到外部的项目,方便在nginx.conf反向代理到项目(一般如果是前端项目就可代理到:/var/www/html/项目名/index.html)-v /root/nginx:/nginx_conf
是/root/nginx
放置所有的配置文件,可以在nginx容器根目录下的/nginx_conf
共享
nginx容器配置
1.进入容器
docker exec -it nginx bash
2.建立需要配置的文件(需要在宿主机共享)与/nginx_conf
的软连接
/etc/nginx/conf.d下的文件以后什么用?
初始的时候,这个文件夹下只有一个文件default.conf
,里面的内容只有server,看到这个server这个结构,好像就是nginx.conf的server配置,所以nginx启动,可以默认访问80端口,进入默认页面。
所以,这个文件可以只用配置nginx.conf的server配置,每个项目一个“项目名.conf”文件,放到这个目录,就可以实现反向代理的效果,而且一个项目一个conf,非常方便管理。
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
建立/etc/nginx/conf.d
与/nginx_conf
的软连接
建立软连接的命令
ln -s 源文件/目录 目标文件/目录
如果是直接将/etc/nginx/conf.d
与/nginx_conf
的建立软连接,会出现一个问题,如下图:
到宿主饥访问的时候,说conf.d不是一个文件或者文件夹,类比win10可能是类似于快捷方式一样的东西(linux学的还不到位~~)
所以可以采用一个替代方案:将/etc/nginx/conf.d
移动到/nginx_conf
,在/nginx_conf/conf.d
建立与/etc/nginx
的软连接,这样即可实现既定需求。
代码:
mv /etc/nginx/conf.d /nginx_conf
ln -s /nginx_conf/conf.d /etc/nginx
即可发现在宿主机/root/nginx
下看到conf.d文件夹,而且也没有显示红色
建立/etc/nginx/nginx.conf
与/nginx_conf
的软连接
nginx.conf也是经常使用,即也采用上述方式建立软连接。
mv /etc/nginx/nginx.conf /nginx_conf
ln -s /nginx_conf/nginx.conf /etc/nginx
小结
所以之后在写docker的文件挂在,就可以预先挂在一个空的目录,在使用这样的“反向软连接”的方式,实现动态文件共享。
nginx统一管理项目的反向代理
- 项目下放置 “项目名.conf” 文件方便nginx统一反向代理
- 使用软连接的方式,将项目下的conf文件与nginx的conf.d的文件夹同步
将server配置的conf文件放在conf.d下,nginx运行后会将其添加到nginx.conf文件,从而实现反向代理。(个人推测)。
项目conf文件参考示例:
server {
listen 9021;
server_name localhost;
location / {
root /var/www/html/项目名/dist;
index index.html;
try_files $uri $uri/ /index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
如果是直接复制进nginx的conf.d文件现在是确实可使用,但是如果项目的conf文件出现改动,那么并不能与nginx的conf.d的conf文件同步。
可以进入nginx的项目容器,使用软连接的方式将conf文件与nginx的conf.d目录关联,实现同步。具体操作如下:
- 进入nginx容器,确定项目的conf路径(例如 /var/www/html/项目名/项目名的conf )
- 将项目.conf 关联进 /nginx_conf/conf.d (这个目录曾经与 /etc/nginx/conf.d 建立过反向软连接,即/etc/nginx/conf.d移动到/nginx_conf,/nginx_conf/conf.d建立/etc/nginx的软连接,否则无法在宿主机操作。详细参看上文的前提下的nginx配置)
ln -s /var/www/html/项目名/项目名的conf /nginx_conf/conf.d
- 建立软连接后,或者修改conf后需要重启nginx服务
推荐的重启nginx方式
如果是nginx的docker容器,重启可以使用docker restart nginx
,但是这样的启动方式有很大的缺点,如果nginx启动有问题,不能很清楚的知道问题在哪,而且不能正常访问nginx。
推荐nginx启动方式:
- 还是先进入容器
- 执行
nginx -t
命令,测试配置文件是否有问题
下图这样,说明没有问题:
如果配置文件问题(尤其是conf.d下的文件),会在这里显示异常 - 执行
nginx -s reload
重启nginx服务
成功如下图
如果遇到线程问题,启动失败,可参看:docker 中使用nginx容器无法正常启动,报错signal process started和kili(3255,1) failed (3: No such process)
如果没有问题,就可以进行访问测试了
至此nginx配置结束,其余就是项目配置了
小结
- 共享宿主机端口,具有更强的兼容性。如果像之前配置的指定80端口,那这样的nginx容器限制太大了 。
- 宿主机
/root/project
与nginx容器/var/www/html
挂载,以后所用项目都放在宿主机/root/project
下统一管理,也方便nginx统一进行反向代理 - 宿主机
/root/nginx
与nginx容器/nginx_conf
挂载,所有与nginx相关配置全部放在/root/nginx
下统一管理 - nginx容器中
/nginx_conf
,通过"反向软连接",实现动态文件/目录与宿主机共享。而不是像以前一样,运行容器定死挂载目录。如果有挂载目录变动,需要重新运行一个新的容器(运行后的容器,要在更改这些配置,就很容易出错和出现问题)。
规范性、兼容性、扩展性…思想要慢慢养成…