浏览器上网的过程简单来讲便是浏览器从服务器中获取网站信息,通过渲染后将效果呈现给用户。这里侧重介绍下在幕后默默工做着的服务器。
Web服务器是运行在物理服务器上的一个程序,永久地等待客户端(主要是浏览器,好比Chrome,Firefox等)发送请求。Web服务器经过HTTP协议与客户端通讯,当收到请求以后,若是是静态文件的话Web服务器可直接返回,若是不是静态文件的话须要有一个Web应用服务器根据不一样的请求处理对应的业务逻辑生成相应的响应,以下图所示。html
目前在UNIX和LINUX平台下使用最普遍的免费Web服务器有Apache和Nginx。Nginx是高效的Web服务器和反向代理服务器,能够用做负载均衡,与Apache相比,Nginx支持高并发,能够支持百万级的TCP链接,十万级别的并发链接,部署简单,内存消耗少,成本低,虽然动态请求处理没有Apache丰富,但Nginx支持uWSGI的uwsgi协议,可将动态请求传递至uWSGI处理。python
这里选择使用Nginx和uWSGI相结合的应用,因为Nginx是反向代理服务器,所以须要网络上的Web应用服务器uWSGI负责具体的应用逻辑处理,虽然uWSGI也能够做为Web服务器应用在小规模网站,但配合Nginx使用能够更好的利用Nginx在缓存、并发处理,安全防御,日志等方面的强大功能。nginx
下面就来介绍下如何搭建Nginx+uWSGI环境来运行Python应用。web
下载源码库。Nginx服务器的安装依托于openssl、zlib、pcre库的支持,在安装Nginx以前须要对这三个库进行安装,如下提供各个源码库的下载地址:
(1)openssl-fips-2.0.2.tar.gz(安全通信库)https://www.openssl.org/source/
(2)zlib-1.2.7.tar.gz(数据压缩库)http://www.zlib.net/
(3)pcre-8.21.tar.gz(正则表达式库)http://www.pcre.org
(4)nginx-1.2.6.tar.gz http://nginx.org/en/download....正则表达式
安装源码库。在Shell终端界面中输入Linux命令执行安装。涉及到普通用户执行root命令时权限不足的问题,可在命令前增长sudo指令解决。执行安装分为如下几步:
(1)解压文件。tar zxvf openssl-fips-2.0.2.tar.gz
(2)进入至存储的文件夹路径。cd openssl-fips-2.0.2
(3)运行shell配置脚本检测运行环境,生成makefile文件。./configure(Nginx的配置脚本须要结合依托库运行:./configure --with-pcre=../pcre-8.21 --with-zlib=../zlib-1.2.7 --with-openssl=../openssl-fips-2.0.2)shell
若运行环境不知足,如运行pcre配置文件时提示“configure: error: You need a C++ compiler for C++ support”,即缺乏C++编译器,那么须要安装C++编译器“sudo apt-get install g++”
(4)编译源码库:make
(5)安装源码库:make instaljson
执行测试命令:./nginx -t(在/usr/local/nginx/sbin路径下执行),出现以下提示表示已经安装成功浏览器
启动/中止服务器缓存
(1)执行启动命令:./nginx。启动后在浏览器输入http://localhost:80监听本机80端口,出现以下图所示内容,表示已经成功启动nginx服务器安全
(2)执行查看端口命令:netstat -ntlp
(3)筛选出nginx进程并打印:ps -ef|grep nginx
(4)Kill进程ID方式退出nginx进程:kill -QUIT
在介绍uWSGI服务器部署前,先梳理uwsgi、uWSGI、WSGI的区别:
WSGI(Web Server Gateway Interface)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口协议,只要web服务器和 web应用都遵照WSGI协议,那么二者之间就能够任意组合。
uwsgi是基于二进制的线路协议,与WSGI协议做用相同,但属于uWSGI服务器自有协议
uWSGI是Web服务器,它实现了WSGI协议、uwsgi、http等协议
安装uWSGI。此处经过pip安装,也能够下载源码进行安装。
pip install uwsgi
Python编写应用程序server.py,在网页上显示“Hello World”,代码以下:
def application(environ, start_response): status = '200 OK' output = 'Hello World!' response_headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(output)))] start_response(status, response_headers) return [output]
启动uWSGI服务器。可经过命令方式启动uWSGI,也能够将参数写在配置文件中(inixmljsonyaml),指定配置文件来启动uWSGI(命令“uwsgi myapp.ini”)。
sudo uwsgi --http-socket :8001 --plugin python --wsgi-file server.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191
--http-socket参数指定了HTTP监听地址和端口,
--wsgi-file参数指定了WSGI应用程序入口,uWSGI会自动搜寻名为”application”的应用对象并调用它。
--plugin python参数指定uWSGI 使用 python 插件去解析文件
--master 参数配置主进程
--processes 参数配置多进程
--threads参数配置多线程
--stats 参数配置在指定地址访问状态信息,以下图在”127.0.0.1:9191″获取JSON格式的运行信息
配置文件内容以下: [uwsgi] http-socket=:8001 plugins = python wsgi-file=server.py master=true processes=4 threads=2 stats=127.0.0.1:9191
浏览器URL输入”http://localhost:8001″,能够访问到server.py执行的结果”Hello World!”
更多关于uWSGI的介绍可参考官网文档:http://uwsgi-docs.readthedocs...
Ngx_http_uwsgi_module模块起到Nginx服务器与uWSGI服务器交互做用,经过对uwsgi_pass设置服务器地址和协议,可将动态内容传递至uWSGI处理。
配置uWSGI。将uWSGI的HTTP端口监听改成socket端口监听,即配置文件中的“http-socket”项改成“socket”项。
[uwsgi] socket=127.0.0.1:3031 plugins = python wsgi-file=server.py master=true processes=4 threads=2 stats=127.0.0.1:9191
配置Nginx。打开Nginx的配置文件nginx.conf(Ubuntu上路径“/usr/local/nginx/conf”),须要执行“sudo chmod -R 777 nginx.conf”下降配置文件权限才可对服务器相关属性进行配置
配置代码以下: server { listen 80; server_name localhost; location / { #root html; #index index.html index.htm; include uwsgi_params;#加载uWSGI配置参数 uwsgi_pass 127.0.0.1:3031;#请求转发至”127.0.0.1:3031″端口上,即uWSGI服务器 } }
启动uWSGI服务器和nginx服务器,再次访问”http://localhost:80”时会看到python应用程序返回“Hello World!”,表示已经完成nginx服务器对uWSGI服务器的反向代理功能。
sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf sudo service nginx restart$ uwsgi myapp.ini