- GUI
- Windows API tutorial
- Introduction to Windows API
- Windows API main functions
- System functions in Windows API
- Strings in Windows API
- Date & time in Windows API
- A window in Windows API
- First steps in UI
- Windows API menus
- Windows API dialogs
- Windows API controls I
- Windows API controls II
- Windows API controls III
- Advanced controls in Windows API
- Custom controls in Windows API
- The GDI in Windows API
- PyQt4 tutorial
- PyQt5 tutorial
- Qt4 tutorial
- Introduction to Qt4 toolkit
- Qt4 utility classes
- Strings in Qt4
- Date and time in Qt4
- Working with files and directories in Qt4
- First programs in Qt4
- Menus and toolbars in Qt4
- Layout management in Qt4
- Events and signals in Qt4
- Qt4 Widgets
- Qt4 Widgets II
- Painting in Qt4
- Custom widget in Qt4
- The Breakout game in Qt4
- Qt5 tutorial
- Introduction to Qt5 toolkit
- Strings in Qt5
- Date and time in Qt5
- Containers in Qt5
- Working with files and directories in Qt5
- First programs in Qt5
- Menus and toolbars in Qt5
- Layout management in Qt5
- Events and signals in Qt5
- Qt5 Widgets
- Qt5 Widgets II
- Painting in Qt5
- Custom widget in Qt5
- Snake in Qt5
- The Breakout game in Qt5
- PySide tutorial
- Tkinter tutorial
- Tcl/Tk tutorial
- Qt Quick tutorial
- Java Swing tutorial
- JavaFX tutorial
- Java SWT tutorial
- wxWidgets tutorial
- Introduction to wxWidgets
- wxWidgets helper classes
- First programs in wxWidgets
- Menus and toolbars in wxWidgets
- Layout management in wxWidgets
- Events in wxWidgets
- Dialogs in wxWidgets
- wxWidgets widgets
- wxWidgets widgets II
- Drag and Drop in wxWidgets
- Device Contexts in wxWidgets
- Custom widgets in wxWidgets
- The Tetris game in wxWidgets
- wxPython tutorial
- Introduction to wxPython
- First Steps
- Menus and toolbars
- Layout management in wxPython
- Events in wxPython
- wxPython dialogs
- Widgets
- Advanced widgets in wxPython
- Drag and drop in wxPython
- Internationalisation
- Application skeletons in wxPython
- The GDI
- Mapping modes
- Creating custom widgets
- Tips and Tricks
- wxPython Gripts
- The Tetris game in wxPython
- C# Winforms Mono tutorial
- Java Gnome tutorial
- Introduction to Java Gnome
- First steps in Java Gnome
- Layout management in Java Gnome
- Layout management II in Java Gnome
- Menus in Java Gnome
- Toolbars in Java Gnome
- Events in Java Gnome
- Widgets in Java Gnome
- Widgets II in Java Gnome
- Advanced widgets in Java Gnome
- Dialogs in Java Gnome
- Pango in Java Gnome
- Drawing with Cairo in Java Gnome
- Drawing with Cairo II
- Nibbles in Java Gnome
- QtJambi tutorial
- GTK+ tutorial
- Ruby GTK tutorial
- GTK# tutorial
- Visual Basic GTK# tutorial
- PyGTK tutorial
- Introduction to PyGTK
- First steps in PyGTK
- Layout management in PyGTK
- Menus in PyGTK
- Toolbars in PyGTK
- Signals & events in PyGTK
- Widgets in PyGTK
- Widgets II in PyGTK
- Advanced widgets in PyGTK
- Dialogs in PyGTK
- Pango
- Pango II
- Drawing with Cairo in PyGTK
- Drawing with Cairo II
- Snake game in PyGTK
- Custom widget in PyGTK
- PHP GTK tutorial
- C# Qyoto tutorial
- Ruby Qt tutorial
- Visual Basic Qyoto tutorial
- Mono IronPython Winforms tutorial
- Introduction
- First steps in IronPython Mono Winforms
- Layout management
- Menus and toolbars
- Basic Controls in Mono Winforms
- Basic Controls II in Mono Winforms
- Advanced Controls in Mono Winforms
- Dialogs
- Drag & drop in Mono Winforms
- Painting
- Painting II in IronPython Mono Winforms
- Snake in IronPython Mono Winforms
- The Tetris game in IronPython Mono Winforms
- FreeBASIC GTK tutorial
- Jython Swing tutorial
- JRuby Swing tutorial
- Visual Basic Winforms tutorial
- JavaScript GTK tutorial
- Ruby HTTPClient tutorial
- Ruby Faraday tutorial
- Ruby Net::HTTP tutorial
- Java 2D games tutorial
- Java 2D tutorial
- Cairo graphics tutorial
- PyCairo tutorial
- HTML5 canvas tutorial
- Python tutorial
- Python language
- Interactive Python
- Python lexical structure
- Python data types
- Strings in Python
- Python lists
- Python dictionaries
- Python operators
- Keywords in Python
- Functions in Python
- Files in Python
- Object-oriented programming in Python
- Modules
- Packages in Python
- Exceptions in Python
- Iterators and Generators
- Introspection in Python
- Ruby tutorial
- PHP tutorial
- Visual Basic tutorial
- Visual Basic
- Visual Basic lexical structure
- Basics
- Visual Basic data types
- Strings in Visual Basic
- Operators
- Flow control
- Visual Basic arrays
- Procedures & functions in Visual Basic
- Organizing code in Visual Basic
- Object-oriented programming
- Object-oriented programming II in Visual Basic
- Collections in Visual Basic
- Input & output
- Tcl tutorial
- C# tutorial
- Java tutorial
- AWK tutorial
- Jetty tutorial
- Tomcat Derby tutorial
- Jtwig tutorial
- Android tutorial
- Introduction to Android development
- First Android application
- Android Button widgets
- Android Intents
- Layout management in Android
- Android Spinner widget
- SeekBar widget
- Android ProgressBar widget
- Android ListView widget
- Android Pickers
- Android menus
- Dialogs
- Drawing in Android
- Java EE 5 tutorials
- Introduction
- Installing Java
- Installing NetBeans 6
- Java Application Servers
- Resin CGIServlet
- JavaServer Pages, (JSPs)
- Implicit objects in JSPs
- Shopping cart
- JSP & MySQL Database
- Java Servlets
- Sending email in a Servlet
- Creating a captcha in a Servlet
- DataSource & DriverManager
- Java Beans
- Custom JSP tags
- Object relational mapping with iBATIS
- Jsoup tutorial
- MySQL tutorial
- MySQL quick tutorial
- MySQL storage engines
- MySQL data types
- Creating, altering and dropping tables in MySQL
- MySQL expressions
- Inserting, updating, and deleting data in MySQL
- The SELECT statement in MySQL
- MySQL subqueries
- MySQL constraints
- Exporting and importing data in MySQL
- Joining tables in MySQL
- MySQL functions
- Views in MySQL
- Transactions in MySQL
- MySQL stored routines
- MySQL Python tutorial
- MySQL Perl tutorial
- MySQL C API programming tutorial
- MySQL Visual Basic tutorial
- MySQL PHP tutorial
- MySQL Java tutorial
- MySQL Ruby tutorial
- MySQL C# tutorial
- SQLite tutorial
- SQLite C tutorial
- SQLite PHP tutorial
- SQLite Python tutorial
- SQLite Perl tutorial
- SQLite Ruby tutorial
- SQLite C# tutorial
- SQLite Visual Basic tutorial
- PostgreSQL C tutorial
- PostgreSQL Python tutorial
- PostgreSQL Ruby tutorial
- PostgreSQL PHP tutorial
- PostgreSQL Java tutorial
- Apache Derby tutorial
- SQLAlchemy tutorial
- MongoDB PHP tutorial
- MongoDB Java tutorial
- MongoDB JavaScript tutorial
- MongoDB Ruby tutorial
- Spring JdbcTemplate tutorial
- JDBI tutorial
Installing Jetty on Linux server
Throughout this tutorial we have been using Jetty on a local computer. In this chapter we show how to install Jetty on a remote server. This gives us a more realistic experience in managing a Jetty server.
We use a debian-based Linux system.
$ sudo apt-get update $ sudo apt-get upgrade
First, we update the server.
$ sudo apt-get install openjdk-7-jre-headless
Next, we install Java if it is not already present on the system. We use the OpenJDK implementation. The openjdk-7-jre-headless
is a minimal Java runtime—the components for executing Java GUI programs are not needed on servers and are not included in this package.
$ cd /tmp $ sudo wget http://download.eclipse.org/jetty/stable-9/dist/jetty-distribution -9.2.3.v20140905.tar.gz $ sudo tar xzvf jetty-distribution-9.2.3.v20140905.tar.gz
We download and unpack a Jetty distribution inside the /tmp
directory.
$ sudo mv jetty-distribution-9.2.3.v20140905 /opt/jetty $ sudo rm jetty-distribution-9.2.3.v20140905.tar.gz
Jetty is moved to /opt/jetty directory. The archive is removed.
$ sudo rm -rf /opt/jetty/demo-base/
The demo applications that come with Jetty distribution are removed.
$ sudo vi /etc/environment $ cat /etc/environment PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games: /usr/local/games" JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386 JETTY_HOME=/opt/jetty JETTY_BASE=/opt/jetty/mybase
The /etc/environment
file is used for system-wide environment variable settings. We set JAVA_HOME
, JETTY_HOME
, and JETTY_BASE
environment variables there.
$ source /etc/environment $ echo $JAVA_HOME /usr/lib/jvm/java-7-openjdk-i386 $ echo $JETTY_HOME /opt/jetty $ echo $JETTY_BASE /opt/jetty/mybase
The source
command evaluates the file and sets the variables. We can now start referring to the new variables.
$ sudo useradd --user-group --shell /bin/false --home-dir /opt/jetty/temp jetty
A new jetty user and group are added to the system. Jetty will run under this user on the system. Setting the user's shell to /bin/false
has the affect of not allowing someone to log in under this username.
$ cd /opt $ sudo mkdir -p web/mybase/ $ sudo mkdir jetty/temp/
New directories are created. The /opt/web/mybase
will hold the Jetty base, the /opt/jetty/temp
will be used for temporary files of Jetty. According to the Jetty documentation, it is a best practice to create a separate temporary directory from the standart system /tmp
. Cleanup scripts may interfere with the Jetty's temporary files.
$ sudo chown -R jetty:jetty /opt/web $ sudo chown -R jetty:jetty /opt/jetty
We change the user and group ownership for files and directories relevant for Jetty. The -R
option operates recursively on files and directories, which means that the ownership is changed for all directories and files under parent directories.
$ sudo usermod -a -G jetty user_name
We add our user name to the jetty group in order to be able to have permissions to operate Jetty.
$ sudo cp /opt/jetty/bin/jetty.sh /etc/init.d/jetty
Next, we enable Jetty as a system service. The services are kept in the init.d
directory.
$ sudo touch /etc/default/jetty $ sudo vi /etc/default/jetty $ cat /etc/default/jetty JETTY_HOME=/opt/jetty JETTY_BASE=/opt/web/mybase TMPDIR=/opt/jetty/temp
The script loads the contents of the /etc/default/jetty
file. Inside the file, we set three environment variables.
$ sudo service jetty start
Jetty is started as a system service.
jano7@core7:~$ service jetty status Checking arguments to Jetty: START_INI = /opt/web/mybase/start.ini JETTY_HOME = /opt/jetty JETTY_BASE = /opt/web/mybase ...
With the status
parameter, we can check a service's status.
$ scp dist/first.war user_name@example.com:/opt/web/mybase/webapps
From the development computer, we deploy a simple web application by copying a project WAR file to the webapps directory of the Jetty base.
$ curl http://example.com:8080/first/ <html> <body> <p> Today's date: Sep 14, 2014 12:26:34 PM </p> </body> </html>
We connect to the web application and receive HTML output.
$ sudo iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
Here we use a packet filter to forward all incoming packets to port 80
to port 8080
. The default port on which Jetty listens is 8080
; it is configured in the start.ini
file.
$ curl http://example.com/first/ <html> <body> <p> Today's date: Sep 14, 2014 12:26:34 PM </p> </body> </html>
Now we can refer to the webpage without the port number.
In this chapter, we have installed Jetty on a remote Linux server, enabled it as a system service, and deployed a simple web application.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论