Nignx基本操作(启动、停止、重启)以及信号控制

来源:互联网 发布:淘宝退货金额改0元吗 编辑:程序博客网 时间:2024/06/05 03:07

在成功安装了Nginx之后,本文介绍Nginx的几个基本操作:启动、停止、重启、信号控制


Nginx的启动:

命令格式: nginx地址  -c  nginx配置文件地址

下面是我的电脑上的操作过程。注意启动需要su权限。

[neil@neilhost ~]$ cd /usr/local/nginx/sbin[neil@neilhost sbin]$ ll总用量 3260-rwxr-xr-x. 1 root root 3334713 3月   3 13:36 nginx[neil@neilhost sbin]$ sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf[sudo] password for neil: [neil@neilhost sbin]$

有没有启动成功呢?验证方法有三种:

验证方法1:打开浏览器,访问127.0.0.1,如过你是远程访问的服务器或者虚拟机,使用对应的IP地址。nginx默认的端口号设置就是80。

验证方法2:查看nginx的进程是否存在

[neil@neilhost sbin]$ pstree -p | grep nginx           |-nginx(3675)---nginx(3676)[neil@neilhost sbin]$

可以看到,系统的的PID为3675的进程就是nginx,说明nginx已经成功启动。

(本文出自oschina和HappyBKs 文章:http://my.oschina.net/happyBKs/blog/632771)

验证方法3:查看80号端口被什么程序占用,是不是nginx

[neil@neilhost sbin]sudo netstat -tunpl | grep 80[sudo] password for neil: tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3675/nginx: master  udp        0      0 0.0.0.0:59251           0.0.0.0:*                           3180/dhclient       udp        0      0 0.0.0.0:68              0.0.0.0:*                           3180/dhclient       udp6       0      0 :::58294                :::*                                3180/dhclient       [neil@neilhost sbin]$

可以看到,80端口的监听中的程序正式nginx


Nginx的停止:

Nginx的停止有三种不同的停止方法:从容停止,快速停止,强制停止

(1)从容停止:首先,需要获取nginx的主进程master process的ID号;然后,用-QUIT参数作为从容停止的类型标注来停止

[neil@neilhost sbin]$ ps -ef | grep nginxroot      3675     1  0 12:08 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confnobody    3676  3675  0 12:08 ?        00:00:00 nginx: worker processneil      3855  3598  0 12:41 pts/0    00:00:00 grep --color=auto nginx[neil@neilhost sbin]$ kill -QUIT 3675bash: kill: (3675) - 不允许的操作[neil@neilhost sbin]$ sudo kill -QUIT 3675[sudo] password for neil: [neil@neilhost sbin]$ [neil@neilhost sbin]$ ps -ef | grep nginxneil      3877  3598  0 12:42 pts/0    00:00:00 grep --color=auto nginx[neil@neilhost sbin]$

这里可以看到,原先的nginx主进程已经关闭,剩余的那个3877进程是nginx的开机自动启动服务,它不隶属于nginx主进程,所以依然存在,但是nginx服务器本身已经成功关闭。

不信,请再访问一下浏览器:

(2)快速停止:步骤与从容停止类似,只是用于停止的信号量参数不同。并且,快速停止的信号量参数有两个,-TERM和-INT,两个都能表示快速停止,用哪个都可以。

[neil@neilhost sbin]$ sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf[sudo] password for neil: [neil@neilhost sbin]$ pstree -p | grep nginx           |-nginx(4242)---nginx(4243)[neil@neilhost sbin]$ ps -ef | grep nginxroot      4242     1  0 13:18 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confnobody    4243  4242  0 13:18 ?        00:00:00 nginx: worker processneil      4283  3598  0 13:22 pts/0    00:00:00 grep --color=auto nginx[neil@neilhost sbin]$ sudo kill -TERM 4242[sudo] password for neil: [neil@neilhost sbin]$ ps -ef | grep nginxneil      4307  3598  0 13:25 pts/0    00:00:00 grep --color=auto nginx[neil@neilhost sbin]$


(3) 强制停止:所谓强制停止,就是不管现在的nginx是否真的允许被停止掉,我们都要强制将其停止。

用的命令是pkill -9

这里需要注意的是,这里的命令是pkill,而不是kill,效果上的不同我会在下面的实际操作中做个比较。-9参数不用我多说了,那是“绝杀”

[neil@neilhost sbin]$ sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf[neil@neilhost sbin]$ pstree -p | grep nginx           |-nginx(4331)---nginx(4332)[neil@neilhost sbin]$ ps -ef | grep nginxroot      4331     1  0 13:28 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confnobody    4332  4331  0 13:28 ?        00:00:00 nginx: worker processneil      4342  3598  0 13:28 pts/0    00:00:00 grep --color=auto nginx[neil@neilhost sbin]$ sudo kill -9 nginx[neil@neilhost sbin]$ ps -ef | grep nginxnobody    4332     1  0 13:28 ?        00:00:00 nginx: worker processneil      4353  3598  0 13:29 pts/0    00:00:00 grep --color=auto nginx[neil@neilhost sbin]$ [neil@neilhost sbin]$ [neil@neilhost sbin]$ [neil@neilhost sbin]$ [neil@neilhost sbin]$ [neil@neilhost sbin]$ sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confnginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)nginx: [emerg] still could not bind()[neil@neilhost sbin]$ sudo pkill -9 nginx[neil@neilhost sbin]$ ps -ef | grep nginxneil      4387  3598  0 13:30 pts/0    00:00:00 grep --color=auto nginx[neil@neilhost sbin]$

从上面的例子可以看到,kill -9 只能将nginx的主进程杀死,但无法杀死其工作进程。并且,此时,如果想开启nginx也是不被允许的;所以正确的强制停止的命令应该是pkill -9 nginx


Nginx的重启:

什么时候我们需要重启Nginx?很多时候都有重启Nginx的必要。比如,当Nginx的配置文件被更改,需要通过重启Nginx来使得配置更改生效。这一点到和Tomcat十分相似。

这里,我们就假设我们的应用场景是在修改过配置文件之后需要重启nginx。这时候,我们正确的操作步骤不是立即执行重启命令,而是应该对配置文件进行测试,看其是否符合语法通过检测。命令如下:哪一种都可以。

[neil@neilhost sbin]$ sudo /usr/local/nginx/sbin/nginx -t[sudo] password for neil: nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is oknginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful[neil@neilhost sbin]$ [neil@neilhost sbin]$ sudo /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.confnginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is oknginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful[neil@neilhost sbin]$ [neil@neilhost sbin]$ sudo ./nginx -tnginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is oknginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful[neil@neilhost sbin]$

下面,我们开始重启nginx。命令是./nginx -s reload

但是,这里有几个地方需要注意,先看看我的操作示例。

[neil@neilhost sbin]$ sudo /usr/local/nginx/sbin/nginx -s reloadnginx: [alert] kill(43311) failed (3: No such process)[neil@neilhost sbin]$ sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf[neil@neilhost sbin]$ ps -ef | grep nginxroot      4531     1  0 13:53 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confnobody    4532  4531  0 13:53 ?        00:00:00 nginx: worker processneil      4537  3598  0 13:53 pts/0    00:00:00 grep --color=auto nginx[neil@neilhost sbin]$ sudo /usr/local/nginx/sbin/nginx -s reload[neil@neilhost sbin]$ [neil@neilhost sbin]$ ps -ef | grep nginxroot      4531     1  0 13:53 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confnobody    4544  4531  0 13:53 ?        00:00:00 nginx: worker processneil      4552  3598  0 13:54 pts/0    00:00:00 grep --color=auto nginx[neil@neilhost sbin]$ [neil@neilhost sbin]$ [neil@neilhost sbin]$ [neil@neilhost sbin]$ [neil@neilhost sbin]$ [neil@neilhost sbin]$ [neil@neilhost sbin]$ pstree -p | grep nginx           |-nginx(4531)---nginx(4544)[neil@neilhost sbin]$ [neil@neilhost sbin]$ sudo /usr/local/nginx/sbin/nginx -s reload[neil@neilhost sbin]$ pstree -p | grep nginx           |-nginx(4531)---nginx(4587)[neil@neilhost sbin]$ [neil@neilhost sbin]$ [neil@neilhost sbin]$ sudo /usr/local/nginx/sbin/nginx -s reload[neil@neilhost sbin]$ [neil@neilhost sbin]$ pstree -p | grep nginx           |-nginx(4531)---nginx(4604)[neil@neilhost sbin]$ [neil@neilhost sbin]$

(a)重启nginx,必须是在nginx已经启动的情况写下进行的。否则,会重启失败。

 (b)重启 不等于 关闭+启动 !!!!

        通过上面的例子就可以清楚地看到:虽然重启了多次,但是nginx的主进程号在第一次启动后就没有改变过,无论后面重启了的多少次,主进程ID都是4531,重启改变的只有工作进程的ID。着说明了什么自己细细回味吧。

       如果是自己“关闭+启动”n次,那么nginx的主进程和工作进程的ID号一定都在变化。


重启有两种方法,除了上面的方法外,还有一种利用信号的方式。kill -HUP

[neil@neilhost sbin]sudo kill -HUP 4531[sudo] password for neil: [neil@neilhost sbin][neil@neilhost sbin]pstree -p | grep nginx           |-nginx(4531)---nginx(4867)[neil@neilhost sbin]ps -ef | grep nginxroot      4531     1  0 13:53 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confnobody    4867  4531  0 14:08 ?        00:00:00 nginx: worker processneil      4880  3598  0 14:08 pts/0    00:00:00 grep --color=auto nginx[neil@neilhost sbin][neil@neilhost sbin]sudo kill -HUP 4531[neil@neilhost sbin][neil@neilhost sbin]pstree -p | grep nginx           |-nginx(4531)---nginx(4889)[neil@neilhost sbin][neil@neilhost sbin]sudo kill -HUP 4531[neil@neilhost sbin]pstree -p | grep nginx           |-nginx(4531)---nginx(4906)[neil@neilhost sbin]$

同样,这种方法下,nginx重启后主进程ID依然不变,改变的惟有工作进程ID。


Nginx的信号控制

好,以上就是nginx的启动、关闭、重启的操作方法。我们可以可看到,在关闭的三种方式和重启的最后一种方式中,我们使用的都是信号控制的方法。这里,本文会对信号控制的相关内容做一个简单的集中介绍。

信号量含义HUP重启QUIT从容停止TERM快速停止INT快速停止USR1切换日志文件USR2平滑升级可执行进程WINCH从容关闭工作进程    

这里,我分别说一下,比如INT和TERM两个快速关闭的含义。

INT(快速关闭)----是当用户键入<Control-C>时由终端驱动程序发送的信号。这是一个终止当前操作的请求,如果捕获了这个信号,一些简单的程序应该退出,或者允许自给被终止,这也是程序没有捕获到这个信号时的默认处理方法。拥有命令行或者输入模式的那些程序应该停止它们在做的事情,清除状态,并等待用户的再次输入。

TERM(快速关闭)----是请求彻底终止某项执行操作,它期望接收进程清除自给的状态并退出。

HUP: 平滑启动。如果想要更改配置而不需停止并重新启动服务,请使用该命令。在对配置文件作必要的更改后,发出该命令以动态更新服务配置。

QUIT:从容关闭。


由原以上几个信号已经在前面的关闭和重启操作重介绍过,这里不再累述。

USER1和USER2,命令调用的方式就是 kill -USER1 进程号和 kill -USER2 进程号。具体在实际情况怎么使用,我们放到后面的文章中介绍。这里,本文只介绍WINCH。

kill -WINCH的功能是从容关闭工作进程。但是,kill -WINCH后面需要跟的nginx的主进程号。它所做的是关闭特定进程号的主进程的下属的工作进程。具体看例子:

[neil@neilhost sbin]$ pstree -p | grep nginx           |-nginx(4531)---nginx(4906)[neil@neilhost sbin]$ ps -ef | grep nginxroot      4531     1  0 13:53 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confnobody    4906  4531  0 14:08 ?        00:00:00 nginx: worker processneil      5058  3598  0 14:32 pts/0    00:00:00 grep --color=auto nginx[neil@neilhost sbin]$ [neil@neilhost sbin]$ sudo kill -WINCH 4531[sudo] password for neil: [neil@neilhost sbin]$ [neil@neilhost sbin]$ pstree -p | grep nginx           |-nginx(4531)[neil@neilhost sbin]$ ps -ef | grep nginxroot      4531     1  0 13:53 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confneil      5092  3598  0 14:34 pts/0    00:00:00 grep --color=auto nginx[neil@neilhost sbin]$


//一个nginx.conf例子
user www-data;
pid /run/nginx.pid;

worker_processes  1;

events {
        worker_connections 1024;
        # multi_accept on;
        use epoll;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        server{
          listen 80;
          listen 443 ssl ;
          server_name 192.168.2.251;
          charset utf-8;
          client_max_body_size 2M;
          index index.html;
          ssl_certificate /home/admin/Documents/zzw.chyblog.com.crt;#公钥
          ssl_certificate_key  /home/admin/Documents/zzw.chyblog.com.key;#私钥
          ssl_session_timeout  5m;  #5分钟session会话保持
          ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
          ssl_ciphers  HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM;
          # 强制使用https,不加这个http和https共存,都可以使用
          if ($server_port = 80) {
                return 301 https://$server_name$request_uri;
          }

          location / {
            proxy_pass http://tomcat_local;
            proxy_set_header   REMOTE-HOST $remote_addr;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
            #index  index.html;
          }
}


        upstream tomcat_local{
                server 192.168.2.251:8080 weight=5 max_fails=2 fail_timeout=30s;
                server 192.168.2.251:9080 weight=5 max_fails=2 fail_timeout=30s;
        }



0 0
原创粉丝点击